1- // Copyright (C) 2012 Xtensive LLC.
2- // All rights reserved .
3- // For conditions of distribution and use, see license .
1+ // Copyright (C) 2012-2020 Xtensive LLC.
2+ // This code is distributed under MIT license terms .
3+ // See the License.txt file in the project root for more information .
44// Created by: Denis Krjuchkov
55// Created: 2012.03.15
66
@@ -25,13 +25,15 @@ private static SqlWorkerResult Run(UpgradeServiceAccessor services, SqlWorkerTas
2525 {
2626 var result = new SqlWorkerResult ( ) ;
2727 var executor = new SqlExecutor ( services . StorageDriver , services . Connection ) ;
28- if ( ( task & SqlWorkerTask . DropSchema ) > 0 )
28+ if ( ( task & SqlWorkerTask . DropSchema ) > 0 ) {
2929 DropSchema ( services , executor ) ;
30- if ( ( task & SqlWorkerTask . ExtractSchema ) > 0 )
30+ }
31+ if ( ( task & SqlWorkerTask . ExtractSchema ) > 0 ) {
3132 result . Schema = ExtractSchema ( services , executor ) ;
32- if ( ( task & ( SqlWorkerTask . ExtractMetadataTypes | SqlWorkerTask . ExtractMetadataAssemblies | SqlWorkerTask . ExtractMetadataExtension ) ) > 0 )
33+ }
34+ if ( ( task & ( SqlWorkerTask . ExtractMetadataTypes | SqlWorkerTask . ExtractMetadataAssemblies | SqlWorkerTask . ExtractMetadataExtension ) ) > 0 ) {
3335 ExtractMetadata ( services , executor , result , task ) ;
34-
36+ }
3537 return result ;
3638 }
3739
@@ -40,15 +42,19 @@ private static void ExtractMetadata(UpgradeServiceAccessor services, SqlExecutor
4042 var set = new MetadataSet ( ) ;
4143 var mapping = new MetadataMapping ( services . StorageDriver , services . NameBuilder ) ;
4244 var metadataExtractor = new MetadataExtractor ( mapping , executor ) ;
43- foreach ( var metadataTask in services . MappingResolver . GetMetadataTasks ( )
44- . Where ( metadataTask => ! ShouldSkipMetadataExtraction ( mapping , result , metadataTask ) ) ) {
45+ var metadataTasks = services . MappingResolver . GetMetadataTasks ( )
46+ . Where ( metadataTask => ! ShouldSkipMetadataExtraction ( mapping , result , metadataTask ) ) ;
47+ foreach ( var metadataTask in metadataTasks ) {
4548 try {
46- if ( task . HasFlag ( SqlWorkerTask . ExtractMetadataAssemblies ) )
49+ if ( task . HasFlag ( SqlWorkerTask . ExtractMetadataAssemblies ) ) {
4750 metadataExtractor . ExtractAssemblies ( set , metadataTask ) ;
48- if ( task . HasFlag ( SqlWorkerTask . ExtractMetadataTypes ) )
51+ }
52+ if ( task . HasFlag ( SqlWorkerTask . ExtractMetadataTypes ) ) {
4953 metadataExtractor . ExtractTypes ( set , metadataTask ) ;
50- if ( task . HasFlag ( SqlWorkerTask . ExtractMetadataExtension ) )
54+ }
55+ if ( task . HasFlag ( SqlWorkerTask . ExtractMetadataExtension ) ) {
5156 metadataExtractor . ExtractExtensions ( set , metadataTask ) ;
57+ }
5258 }
5359 catch ( Exception exception ) {
5460 UpgradeLog . Warning ( Strings . LogFailedToExtractMetadataFromXYZ , metadataTask . Catalog , metadataTask . Schema , exception ) ;
@@ -59,11 +65,12 @@ private static void ExtractMetadata(UpgradeServiceAccessor services, SqlExecutor
5965
6066 private static bool ShouldSkipMetadataExtraction ( MetadataMapping mapping , SqlWorkerResult result , SqlExtractionTask task )
6167 {
62- if ( result . Schema == null )
68+ if ( result . Schema == null ) {
6369 return false ;
70+ }
6471
6572 var tables = GetSchemaTables ( result , task ) ;
66- return tables [ mapping . Assembly ] == null && tables [ mapping . Type ] == null && tables [ mapping . Extension ] == null ;
73+ return tables [ mapping . Assembly ] == null && tables [ mapping . Type ] == null && tables [ mapping . Extension ] == null ;
6774 }
6875
6976 private static PairedNodeCollection < Schema , Table > GetSchemaTables ( SqlWorkerResult result , SqlExtractionTask task )
@@ -82,9 +89,9 @@ private static Catalog GetCatalog(SqlWorkerResult result, string catalogName)
8289
8390 private static Schema GetSchema ( Catalog catalog , string schemaName )
8491 {
85- if ( schemaName . IsNullOrEmpty ( ) )
86- return catalog . Schemas . Single ( s => s . Name == schemaName ) ;
87- return catalog . Schemas [ schemaName ] ;
92+ return schemaName . IsNullOrEmpty ( )
93+ ? catalog . Schemas . Single ( s => s . Name == schemaName )
94+ : catalog . Schemas [ schemaName ] ;
8895 }
8996
9097 private static SchemaExtractionResult ExtractSchema ( UpgradeServiceAccessor services , ISqlExecutor executor )
@@ -97,8 +104,8 @@ private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor exe
97104 {
98105 var driver = services . StorageDriver ;
99106 var extractionResult = ExtractSchema ( services , executor ) ;
100- var schemas = extractionResult . Catalogs . SelectMany ( c => c . Schemas ) . ToList ( ) ;
101- var tables = schemas . SelectMany ( s => s . Tables ) . ToList ( ) ;
107+ var schemas = extractionResult . Catalogs . SelectMany ( c => c . Schemas ) . ToChainedBuffer ( ) ;
108+ var tables = schemas . SelectMany ( s => s . Tables ) . ToChainedBuffer ( ) ;
102109 var sequences = schemas . SelectMany ( s => s . Sequences ) ;
103110
104111 DropForeignKeys ( driver , tables , executor ) ;
@@ -108,27 +115,38 @@ private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor exe
108115
109116 private static void DropSequences ( StorageDriver driver , IEnumerable < Sequence > sequences , ISqlExecutor executor )
110117 {
111- var statements = sequences
112- . Select ( s => driver . Compile ( SqlDdl . Drop ( s ) ) . GetCommandText ( ) )
113- . ToList ( ) ;
118+ var statements = BreakEvery ( sequences
119+ . Select ( s => driver . Compile ( SqlDdl . Drop ( s ) ) . GetCommandText ( ) ) , 25 ) . ToChainedBuffer ( ) ;
114120 executor . ExecuteMany ( statements ) ;
115121 }
116122
117123 private static void DropTables ( StorageDriver driver , IEnumerable < Table > tables , ISqlExecutor executor )
118124 {
119- var statements = tables
120- . Select ( t => driver . Compile ( SqlDdl . Drop ( t ) ) . GetCommandText ( ) )
121- . ToList ( ) ;
125+ var statements = BreakEvery ( tables
126+ . Select ( t => driver . Compile ( SqlDdl . Drop ( t ) ) . GetCommandText ( ) ) , 25 ) ;
122127 executor . ExecuteMany ( statements ) ;
123128 }
124129
125130 private static void DropForeignKeys ( StorageDriver driver , IEnumerable < Table > tables , ISqlExecutor executor )
126131 {
127- var statements = tables
132+ var statements = BreakEvery ( tables
128133 . SelectMany ( t => t . TableConstraints . OfType < ForeignKey > ( ) )
129- . Select ( fk => driver . Compile ( SqlDdl . Alter ( fk . Table , SqlDdl . DropConstraint ( fk ) ) ) . GetCommandText ( ) )
130- . ToList ( ) ;
134+ . Select ( fk => driver . Compile ( SqlDdl . Alter ( fk . Table , SqlDdl . DropConstraint ( fk ) ) ) . GetCommandText ( ) ) , 25 ) ;
131135 executor . ExecuteMany ( statements ) ;
132136 }
137+
138+ private static IEnumerable < TItem > BreakEvery < TItem > ( IEnumerable < TItem > source , int breakOnCount )
139+ where TItem : class
140+ {
141+ var count = 0 ;
142+ foreach ( var item in source ) {
143+ count ++ ;
144+ if ( count == breakOnCount ) {
145+ yield return default ( TItem ) ;
146+ count = 0 ;
147+ }
148+ yield return item ;
149+ }
150+ }
133151 }
134152}
0 commit comments