public void CreateFoundation()
        {
            using (var channel = ReportServiceChannelFactory.CreateChannel())
            {
                // Base Folders
                var integrationTestsFolder = channel.CreateFolder(new CreateFolderRequest {
                    Folder = assemblyName, Parent = "/"
                });
                channel.CreateFolder(new CreateFolderRequest {
                    Folder = "Standard Reports", Parent = integrationTestsFolder.ItemInfo.Path
                });
                var dataSourcesFolder = channel.CreateFolder(new CreateFolderRequest {
                    Folder = "Data Sources", Parent = integrationTestsFolder.ItemInfo.Path
                });

                // Data Sources
                channel.CreateDataSource(new CreateDataSourceRequest
                {
                    DataSource = "Sample Data Source",
                    Definition = new DataSourceDefinition
                    {
                        ConnectString       = String.Empty,
                        Extension           = "XML",
                        CredentialRetrieval = CredentialRetrievalEnum.None,
                    },
                    Parent = dataSourcesFolder.ItemInfo.Path
                });

                var connectionString =
                    new SqlConnectionStringBuilder(ConfigurationManager.ConnectionStrings["Database"].ConnectionString);
                if (connectionString.AttachDBFilename.StartsWith("|DataDirectory|", StringComparison.OrdinalIgnoreCase))
                {
                    connectionString.AttachDBFilename = Path.Combine(Environment.CurrentDirectory,
                                                                     connectionString.AttachDBFilename.Substring(
                                                                         "|DataDirectory|".Length));

                    connectionString.Pooling = false;
                }

                // HACK: Need to get the named pipe for the LocalDB instance
                // because Reporting Services does not recognize '(localdb)'
                if (connectionString.DataSource.StartsWith("(localdb)", StringComparison.OrdinalIgnoreCase))
                {
                    var dbServer = new Server(connectionString.DataSource);
                    connectionString.DataSource = String.Format(@"np:\\.\pipe\{0}\tsql\query", dbServer.InstanceName);
                }

                channel.CreateDataSource(new CreateDataSourceRequest
                {
                    DataSource = "Sample Data Source",
                    Definition = new DataSourceDefinition
                    {
                        ConnectString       = connectionString.ToString(),
                        Extension           = "SQL",
                        CredentialRetrieval = CredentialRetrievalEnum.None,
                    },
                    Parent = dataSourcesFolder.ItemInfo.Path
                });
            }
        }
 public void CleanFolderStructure()
 {
     using (var channel = ReportServiceChannelFactory.CreateChannel())
     {
         // Folder
         var assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
         var folders      = channel.FindItems(new FindItemsRequest
         {
             Folder           = "/",
             SearchConditions = new[]
             {
                 new SearchCondition
                 {
                     Condition =
                         ConditionEnum.Equals,
                     ConditionSpecified = true,
                     Name   = "Name",
                     Values = new[] { assemblyName }
                 }
             }
         });
         folders.Items.ToList().ForEach(x => channel.DeleteItem(new DeleteItemRequest {
             ItemPath = x.Path
         }));
     }
 }
        public void CreateFolder(string path, string itemName)
        {
            using (var channel = ReportServiceChannelFactory.CreateChannel())
            {
                if (ItemExists(channel, path, itemName))
                {
                    return;
                }

                channel.CreateFolder(new CreateFolderRequest {
                    Folder = itemName, Parent = String.Format("/{0}/{1}", assemblyName, path.TrimStart('/'))
                });
            }
        }
        public void LinkReport(string sourceItem, string destinationFolder, string itemName, params ItemParameter[] parameters)
        {
            using (var channel = ReportServiceChannelFactory.CreateChannel())
            {
                if (ItemExists(channel, destinationFolder, itemName))
                {
                    return;
                }

                var description =
                    channel.GetProperties(new GetPropertiesRequest
                {
                    ItemPath =
                        String.Format("/{0}/{1}", assemblyName,
                                      sourceItem.TrimStart('/'))
                }).Values.
                    FirstOrDefault(
                        x => "Description".Equals(x.Name, StringComparison.OrdinalIgnoreCase));

                var properties = description != null ? new[] { description } : null;

                channel.CreateLinkedItem(new CreateLinkedItemRequest
                {
                    Parent =
                        String.Format("/{0}/{1}", assemblyName,
                                      destinationFolder.TrimStart('/')),
                    ItemPath = itemName,
                    Link     =
                        String.Format("/{0}/{1}", assemblyName,
                                      sourceItem.TrimStart('/')),
                    Properties = properties
                });

                if (parameters != null && parameters.Any())
                {
                    channel.SetItemParameters(new SetItemParametersRequest
                    {
                        ItemPath =
                            String.Format("/{0}/{1}/{2}", assemblyName,
                                          destinationFolder.TrimStart('/'), itemName),
                        Parameters = parameters
                    });
                }
            }
        }
        public void LoadData(string embeddedResourceName, string path, string itemName)
        {
            if (Assembly.GetExecutingAssembly().GetManifestResourceInfo(embeddedResourceName) == null)
            {
                throw new ArgumentOutOfRangeException("embeddedResourceName", embeddedResourceName, "Unable to find embedded resource with specified name.");
            }

            using (var channel = ReportServiceChannelFactory.CreateChannel())
                using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedResourceName))
                {
                    if (ItemExists(channel, path, itemName))
                    {
                        return;
                    }

                    string itemType;
                    switch (Path.GetExtension(embeddedResourceName).ToLower())
                    {
                    case ".rdl":
                        itemType = "Report";
                        break;

                    case ".rsd":
                        itemType = "DataSet";
                        break;

                    default:
                        throw new InvalidOperationException("Unknown item type");
                    }
                    channel.CreateCatalogItem(new CreateCatalogItemRequest
                    {
                        ItemType   = itemType,
                        Name       = itemName,
                        Parent     = String.Format("/{0}/{1}", Assembly.GetExecutingAssembly().GetName().Name, path.TrimStart('/')),
                        Overwrite  = true,
                        Definition = stream.ReadToEnd()
                    });
                }
        }
 public void CreateSnapshot(string itemPath)
 {
     using (var channel = ReportServiceChannelFactory.CreateChannel())
     {
         var fullItemPath   = String.Format("/{0}/{1}", assemblyName, itemPath.TrimStart('/'));
         var historyOptions = channel.GetItemHistoryOptions(new GetItemHistoryOptionsRequest {
             ItemPath = fullItemPath
         });
         if (!historyOptions.EnableManualSnapshotCreation || !historyOptions.KeepExecutionSnapshots)
         {
             channel.SetItemHistoryOptions(new SetItemHistoryOptionsRequest
             {
                 ItemPath = fullItemPath,
                 EnableManualSnapshotCreation = true,
                 KeepExecutionSnapshots       = true,
                 Item = new NoSchedule()
             });
         }
         channel.CreateItemHistorySnapshot(new CreateItemHistorySnapshotRequest {
             ItemPath = fullItemPath
         });
     }
 }