1: 'Begin Script
2:
3: Dim definition As [Byte]() = Nothing
4:
5: Dim bytedefinition as [Byte]() = nothing
6:
7: Dim warnings As Warning() = Nothing
8:
9:
10:
11: 'Main Entry point of utility
12:
13: Public Sub Main()
14:
15: Console.WriteLine()
16:
17: Console.WriteLine("Initiating Deployment")
18:
19: rs.Credentials = System.Net.CredentialCache.DefaultCredentials
20:
21: Try
22:
23: 'Create the shared data source
24:
25: CreateFolders(DataSourceFolder,"/","Data Sources","Visible")
26:
27: 'Create the folder that will contain the shared data sets
28:
29: CreateFolders(DataSetFolder, "/", "Data Set Folder", "Visible")
30:
31: 'Create the folder that will contain the deployed reports
32:
33: CreateFolders(ReportFolder, "/", "Report Folder","Visible")
34:
35: Catch goof As Exception
36:
37: Console.WriteLine(goof.Message)
38:
39: End Try
40:
41: ReadFiles(filepath, "*.rds")
42:
43: ReadFiles(filepath, "*.rsd")
44:
45: ReadFiles(filepath, "*.rdl")
46:
47: 'Publish the report
48:
49: 'PublishReport(ReportName)
50:
51: 'UpdateDataSources(ReportFolder, DataSourcePath)
52:
53: End Sub
54:
55:
56:
57: 'Utility for creation of folders
58:
59: Public Sub CreateFolders(ByVal folderName as string, ByVal parentPath as string, ByVal description as String, ByVal visible as string)
60:
61: Console.WriteLine()
62:
63: Console.WriteLine("Checking for Target Folders")
64:
65: 'CatalogItem properties
66:
67: Dim descriptionProp as new [Property]
68:
69: descriptionProp.Name = "Description"
70:
71: descriptionProp.Value= description
72:
73: Dim visibleProp as new [Property]
74:
75: visibleProp.Name = "Visible"
76:
77: visibleProp.value= visible
78:
79: Dim props(1) as [Property]
80:
81: props(0) = descriptionProp
82:
83: props(1) = visibleProp
84:
85: Try
86:
87: rs.CreateFolder(folderName,parentPath,props)
88:
89: Console.WriteLine("Folder {0} successfully created", foldername)
90:
91: Catch goof as SoapException
92:
93: If goof.Message.Indexof("AlreadyExists")>0 Then
94:
95: Console.WriteLine("Folder {0} already exists",foldername)
96:
97: End If
98:
99: End Try
100:
101: End Sub
102:
103:
104:
105: 'Utility for reading files from the Report Sevices Project
106:
107: Public sub ReadFiles(filepath as string, fileextension as string)
108:
109: Console.WriteLine()
110:
111: Console.WriteLine("Reading Files from Report Services Project")
112:
113: Dim rptdirinfo As System.IO.DirectoryInfo
114:
115: rptdirinfo = New System.IO.DirectoryInfo(filepath)
116:
117: Dim filedoc As FileInfo()
118:
119: filedoc = rptdirinfo.GetFiles(fileextension)
120:
121: Try
122:
123: For rptcount As Integer = 0 To filedoc.Length-1
124:
125: If Not filedoc(rptcount).Name.ToString.Trim.ToUpper.Contains("BACKUP") Then
126:
127: SELECT Case fileextension
128:
129: Case "*.rds"
130:
131: CreateDataSource(filedoc(rptcount).tostring.trim)
132:
133: Case "*.rsd"
134:
135: CreateDataSet(filedoc(rptcount).tostring.trim)
136:
137: Case "*.rdl"
138:
139: PublishReport(filedoc(rptcount).tostring.trim)
140:
141: End Select
142:
143: End If
144:
145: Next
146:
147: Catch goof as Exception
148:
149: Console.WriteLine("In ReadFiles " + goof.message)
150:
151: End Try
152:
153: End Sub
154:
155:
156:
157: 'Utility for Creating Shared Data Sets contained in the project
158:
159: Public Sub CreateDataSet(ByVal filename as string)
160:
161: Dim valstart as integer
162:
163: Dim valend as integer
164:
165: Dim DSDefinitionStr as string
166:
167: Dim DataSourceName as string
168:
169: Dim QueryString as string
170:
171: Try
172:
173: Dim stream As FileStream = File.OpenRead(filePath + "\" + filename )
174:
175: definition = New [Byte](stream.Length-1) {}
176:
177: stream.Read(definition, 0, CInt(stream.Length))
178:
179: stream.Close()
180:
181: For i As Integer = 0 To definition.Length - 1
182:
183: DSDefinitionStr = DSDefinitionStr + Convert.ToString(Convert.ToChar(Convert.ToInt16(definition(i).ToString)))
184:
185: Next
186:
187: valstart=DSDefinitionStr.ToString.Indexof("<DataSourceReference>")
188:
189: If valstart > 0 Then
190:
191: valstart = DSDefinitionStr.ToString.IndexOf("<DataSourceReference>") + 21
192:
193: valend = DSDefinitionStr.ToString.IndexOf("</DataSourceReference>")
194:
195: DataSourceName=DSDefinitionStr.ToString.Substring(valstart, valend - valstart)
196:
197: Console.WriteLine(DataSourceName)
198:
199: End If
200:
201: Catch e As IOException
202:
203: Console.WriteLine(e.Message)
204:
205: End Try
206:
207: filename=filename.tostring.replace(".rsd","")
208:
209: Console.WriteLine("Attempting to Deploy DataSet {0}", filename)
210:
211: Try
212:
213: Dim item as CatalogItem
214:
215: item=rs.CreateCatalogItem("DataSet",filename, "/" + DataSetFolder, True, definition, nothing, warnings)
216:
217: If Not (warnings Is Nothing) Then
218:
219: Dim warning As Warning
220:
221: For Each warning In warnings
222:
223: if warning.message.tostring.tolower.contains("refers to the shared data source") then
224:
225: Console.WriteLine("Connecting DataSet {0} to Data Source {1}",filename, DataSourceName)
226:
227: Dim referenceData() as ItemReferenceData = rs.GetItemReferences("/" + DataSetFolder + "/" + filename,"DataSet")
228:
229: Dim references(0) as ItemReference
230:
231: Dim reference as New ItemReference()
232:
233: Dim datasourceURL = DataSourcePath + "/" + DataSourceName
234:
235: reference.name=referenceData(0).Name
236:
237: Console.WriteLine("Reference name = " + reference.name)
238:
239: reference.Reference=datasourceURL
240:
241: references(0)=reference
242:
243: rs.SetItemReferences("/" + DataSetFolder + "/" + filename, references)
244:
245: else
246:
247: Console.WriteLine(warning.Message)
248:
249: end if
250:
251: Next warning
252:
253: Else
254:
255: Console.WriteLine("DataSet: {0} published successfully with no warnings", filename)
256:
257: End If
258:
259: Catch goof as SoapException
260:
261: If goof.Message.Indexof("AlreadyExists")>0 Then
262:
263: Console.WriteLine("The DataSet {0} already exists",fileName.ToString)
264:
265: Else
266:
267: If goof.Message.IndexOf("published")=-1 Then
268:
269: Console.Writeline(goof.Message)
270:
271: End If
272:
273: End If
274:
275: End Try
276:
277: 'UpdateDataSetSources(filename,DataSetFolder, DataSourceFolder,DataSourceName)
278:
279: End Sub
280:
281:
282:
283: 'Utility for creating Data Sources on the Server
284:
285: Public Sub CreateDataSource(filename as string)
286:
287: 'Define the data source definition.
288:
289: Dim dsDefinition As New DataSourceDefinition()
290:
291: Dim DataSourceName as string
292:
293: Dim valstart As Integer
294:
295: Dim valend As Integer
296:
297: Dim ConnectionString As String
298:
299: Dim Extension As String
300:
301: Dim IntegratedSec As String
302:
303: Dim DataSourceID As String
304:
305: Dim PromptStr As String
306:
307: PromptStr=""
308:
309: Dim DSDefinitionStr As String
310:
311: DSDefinitionStr = ""
312:
313: DataSourceName=filename.tostring.trim.substring(0,filename.tostring.trim.length-4)
314:
315: Console.WriteLine("Attempting to Deploy Data Source {0}", DataSourceName)
316:
317: Try
318:
319: Dim stream As FileStream = File.OpenRead(filepath + "\" + filename)
320:
321: bytedefinition = New [Byte](stream.Length-1) {}
322:
323: stream.Read(bytedefinition, 0, CInt(stream.Length))
324:
325: stream.Close()
326:
327: For i As Integer = 0 To bytedefinition.Length - 1
328:
329: DSDefinitionStr = DSDefinitionStr + Convert.ToString(Convert.ToChar(Convert.ToInt16(bytedefinition(i).ToString)))
330:
331: Next
332:
333: Catch goof As IOException
334:
335: Console.WriteLine(goof.Message)
336:
337: End Try
338:
339: If DSDefinitionStr.ToString.Contains("<ConnectString>") And DSDefinitionStr.ToString.Contains("</ConnectString>") Then
340:
341: valstart = DSDefinitionStr.ToString.IndexOf("<ConnectString>") + 15
342:
343: valend = DSDefinitionStr.ToString.IndexOf("</ConnectString>")
344:
345: ConnectionString = DSDefinitionStr.ToString.Substring(valstart, valend - valstart)
346:
347: End If
348:
349: If DSDefinitionStr.ToString.Contains("<Extension>") And DSDefinitionStr.ToString.Contains("</Extension>") Then
350:
351: valstart = DSDefinitionStr.ToString.IndexOf("<Extension>") + 11
352:
353: valend = DSDefinitionStr.ToString.IndexOf("</Extension>")
354:
355: Extension = DSDefinitionStr.ToString.Substring(valstart, valend - valstart)
356:
357: End If
358:
359: If DSDefinitionStr.ToString.Contains("<IntegratedSecurity>") And DSDefinitionStr.ToString.Contains("</IntegratedSecurity>") Then
360:
361: valstart = DSDefinitionStr.ToString.IndexOf("<IntegratedSecurity>") + 20
362:
363: valend = DSDefinitionStr.ToString.IndexOf("</IntegratedSecurity>")
364:
365: IntegratedSec = DSDefinitionStr.ToString.Substring(valstart, valend - valstart)
366:
367: End If
368:
369: If DSDefinitionStr.ToString.Contains("<DataSourceID>") And DSDefinitionStr.ToString.Contains("</DataSourceID>") Then
370:
371: valstart = DSDefinitionStr.ToString.IndexOf("<DataSourceID>") + 14
372:
373: valend = DSDefinitionStr.ToString.IndexOf("</DataSourceID>")
374:
375: DataSourceID = DSDefinitionStr.ToString.Substring(valstart, valend - valstart)
376:
377: End If
378:
379: If DSDefinitionStr.ToString.Contains("<Prompt>") And DSDefinitionStr.ToString.Contains("</Prompt>") Then
380:
381: valstart = DSDefinitionStr.ToString.IndexOf("<Prompt>") + 8
382:
383: valend = DSDefinitionStr.ToString.IndexOf("</Prompt>")
384:
385: PromptStr = DSDefinitionStr.ToString.Substring(valstart, valend - valstart)
386:
387: End If
388:
389: dsdefinition.CredentialRetrieval = CredentialRetrievalEnum.Integrated
390:
391: dsdefinition.ConnectString = ConnectionString
392:
393: dsdefinition.Enabled = True
394:
395: dsdefinition.EnabledSpecified = True
396:
397: dsdefinition.Extension = extension
398:
399: dsdefinition.ImpersonateUser = False
400:
401: dsdefinition.ImpersonateUserSpecified = True
402:
403: 'Use the default prompt string.
404:
405: If PromptStr.ToString.Length=0 Then
406:
407: dsdefinition.Prompt = Nothing
408:
409: Else
410:
411: dsdefinition.Prompt = PromptStr
412:
413: End if
414:
415: dsdefinition.WindowsCredentials = False
416:
417: Try
418:
419: rs.CreateDataSource(DataSourceName, "/" + DataSourceFolder, False, dsdefinition, Nothing)
420:
421: Console.WriteLine("Data source {0} created successfully", DataSourceName.ToString)
422:
423: Catch goof as SoapException
424:
425: If goof.Message.Indexof("AlreadyExists")>0 Then
426:
427: Console.WriteLine("The Data Source name {0} already exists",DataSourceName.ToString)
428:
429: End If
430:
431: End Try
432:
433: End Sub
434:
435:
436:
437: 'Utility to Publish the Reports
438:
439: Public Sub PublishReport(ByVal reportName As String)
440:
441: Try
442:
443: Dim stream As FileStream = File.OpenRead(filePath + "\" + reportName )
444:
445: definition = New [Byte](stream.Length-1) {}
446:
447: stream.Read(definition, 0, CInt(stream.Length))
448:
449: stream.Close()
450:
451: Catch e As IOException
452:
453: Console.WriteLine(e.Message)
454:
455: End Try
456:
457: reportname=reportname.tostring.replace(".rdl","")
458:
459: Console.WriteLine("Attempting to Deploy Report Name {0}", reportname.tostring)
460:
461: Dim item as CatalogItem
462:
463:
464: Try
465:
466: item=rs.CreateCatalogItem("Report",reportname, "/" + ReportFolder, True, definition,nothing, warnings)
467:
468: 'warnings = rs.CreateCatalogItem(reportName, "/" + ReportFolder, False, definition, Nothing)
469:
470: If Not (warnings Is Nothing) Then
471:
472: If item.Name <> "" then
473:
474: Console.WriteLine("Report: {0} published successfully with warnings", reportName)
475: UpdateDataSources_report(reportName)
476: UpdateDataSet_report(reportName)
477: else
478:
479: Dim warning As Warning
480:
481: For Each warning In warnings
482:
483: Console.WriteLine(warning.Message)
484:
485: Next warning
486:
487: end if
488:
489: Else
490:
491: Console.WriteLine("Report: {0} published successfully with no warnings", reportName)
492: UpdateDataSources_report(reportName)
493: UpdateDataSet_report(reportName)
494: End If
495:
496: Catch goof as SoapException
497:
498: If goof.Message.Indexof("AlreadyExists")>0 Then
499:
500: Console.WriteLine("The Report Name {0} already exists",reportName.ToString)
501:
502: Else
503:
504: If goof.Message.IndexOf("published")=-1 Then
505:
506: Console.WriteLine(goof.Message)
507:
508: End If
509:
510: End If
511:
512: End Try
513:
514: End Sub
515:
516:
517:
518: 'Utility to Update The Data Sources on the Server
519:
520: Public Sub UpdateDataSources(ReportFolder as string, DataSourcePath as string)
521:
522: rs.Credentials = System.Net.CredentialCache.DefaultCredentials
523:
524: Dim item as CatalogItem
525:
526: Dim items as CatalogItem()
527:
528: Try
529:
530:
531:
532: items=rs.ListChildren("/" + ReportFolder, False)
533:
534: For Each item in items
535:
536: 'Console.WriteLine(" update date source called --------"+ item.Path + " -----------")
537:
538: If item.path.Indexof("rdl")>0 and ReportName = "" Then
539:
540: 'Console.WriteLine(" update date source called --------"+ item.path.Indexof("rdl").tostring() + " -----------")
541:
542: Dim dataSources() as DataSource = rs.GetItemDataSources(item.Path)
543:
544: For Each ds as DataSource in dataSources
545:
546: Dim sharedDs(0) as DataSource
547:
548: sharedDs(0)=GetDataSource(DataSourcePath, ds.Name)
549:
550: rs.SetItemDataSources(item.Path, sharedDs)
551:
552: Console.WriteLine("Set " & ds.Name & " datasource for " & item.Path & " report")
553:
554: 'end if
555: Next
556:
557: End IF
558:
559: Next
560:
561: if ReportName = "" Then
562:
563: Console.WriteLine("Shared data source reference set for reports in the {0} folder.", ReportFolder)
564:
565: End if
566:
567:
568: If ReportName <> "" then
569:
570: ' Console.WriteLine(" " + "/" + ReportFolder + "/" + ReportName + " ------------- second update called ---------------------- ")
571:
572: Dim dataSources() as DataSource = rs.GetItemDataSources( "/" + ReportFolder + "/" + ReportName)
573:
574: For Each ds as DataSource in dataSources
575:
576: Dim sharedDs(0) as DataSource
577:
578: sharedDs(0)=GetDataSource(DataSourcePath, ds.Name)
579:
580: rs.SetItemDataSources("/" + ReportFolder + "/" + ReportName, sharedDs)
581:
582: Console.WriteLine("Set " & ds.Name & " datasource for " & "/" + ReportFolder + "/" + ReportName & " report")
583:
584: 'end if
585: Next
586:
587: Console.WriteLine("All the shared data source reference set for report {0} ", "/" + ReportFolder + "/" + ReportName)
588:
589: end if
590:
591: Catch goof As SoapException
592:
593: Console.WriteLine(goof.Detail.InnerXml.ToString())
594:
595: End Try
596:
597: End Sub
598:
599:
600:
601:
602: 'Utility to Update The Data Sources on the Server
603:
604: Public Sub UpdateDataSources_report(ReportName as string)
605:
606: rs.Credentials = System.Net.CredentialCache.DefaultCredentials
607:
608: Dim item as CatalogItem
609:
610: Dim items as CatalogItem()
611:
612: Try
613:
614: 'If ReportName <> "" then
615:
616: ' Console.WriteLine(" " + "/" + ReportFolder + "/" + ReportName + " ------------- second update called ---------------------- ")
617:
618: Dim dataSources() as DataSource = rs.GetItemDataSources( "/" + ReportFolder + "/" + ReportName)
619:
620: For Each ds as DataSource in dataSources
621:
622: Dim sharedDs(0) as DataSource
623:
624: sharedDs(0)=GetDataSource(DataSourcePath, ds.Name)
625:
626: rs.SetItemDataSources("/" + ReportFolder + "/" + ReportName, sharedDs)
627:
628: Console.WriteLine("Set " & ds.Name & " datasource for " & "/" + ReportFolder + "/" + ReportName & " report")
629:
630: 'end if
631: Next
632:
633: Console.WriteLine("All the shared data source reference set for report {0} ", "/" + ReportFolder + "/" + ReportName)
634:
635: 'end if
636:
637:
638: Catch goof As SoapException
639:
640: Console.WriteLine(goof.Detail.InnerXml.ToString())
641:
642: End Try
643:
644: End Sub
645:
646:
647:
648: 'Utility to link The Dataset with the Report
649:
650: Public Sub UpdateDataSet_report(ReportName as string)
651:
652: rs.Credentials = System.Net.CredentialCache.DefaultCredentials
653:
654:
655: Try
656:
657: Dim dataSets As ItemReferenceData() = rs.GetItemReferences("/" + ReportFolder + "/" + ReportName, "DataSet")
658:
659: If dataSets IsNot Nothing AndAlso dataSets.Length > 0 AndAlso Not String.IsNullOrEmpty(dataSets(0).Name) Then
660:
661: For i as integer = 0 to dataSets.Length -1
662:
663: Dim references(0) as ItemReference
664: Dim sharedDataSet = New ItemReference()
665: sharedDataSet.Name = dataSets(i).Name
666: Console.WriteLine("Attempting to Link Dataset {0}", dataSets(i).Name)
667: sharedDataSet.Reference = "/" + DataSetFolder + "/" + dataSets(i).Name
668: references(0)=sharedDataSet
669: rs.SetItemReferences("/" + ReportFolder + "/" + ReportName, references)
670: Console.WriteLine("Report " + ReportName + " Linked to data set " + "/" + DataSetFolder + "/" + Convert.ToString(sharedDataSet.Name))
671: Next
672:
673: End If
674:
675: Catch goof As SoapException
676:
677: Console.WriteLine(goof.Detail.InnerXml.ToString())
678:
679: End Try
680:
681: End Sub
682:
683:
684:
685:
686: 'Function to Reference Data Sources
687:
688: Private Function GetDataSource(sharedDataSourcePath as string, dataSourceName as String) as DataSource
689:
690: Dim reference As New DataSourceReference()
691:
692: Dim ds As New DataSource
693:
694: reference.Reference = sharedDataSourcePath & "/" & dataSourceName
695:
696: ds.Item = CType(reference, DataSourceDefinitionOrReference)
697:
698: ds.Name = dataSourceName
699:
700: Console.WriteLine("Attempting to Link Data Source {0}", ds.Name)
701:
702: GetDataSource=ds
703:
704: End Function