@@ -15,31 +15,31 @@ public static Command GetCommand()
1515 {
1616 Command diffDatabaseCommand = new (
1717 "diff" ,
18- "Given two databases, produces a third database containing all providers " +
19- "from the second database which are not in the first database ." ) ;
18+ "Given two provider sources (each may be a .db, an exported .evtx, or a folder containing them), " +
19+ "produces a database containing all providers from the second source which are not in the first source ." ) ;
2020
21- Argument < string > dbOneArgument = new ( "first db " )
21+ Argument < string > firstArgument = new ( "first source " )
2222 {
23- Description = "The first database to compare."
23+ Description = "The first source to compare: a .db, an exported .evtx, or a folder containing .db and/or .evtx files (top-level only) ."
2424 } ;
2525
26- Argument < string > dbTwoArgument = new ( "second db " )
26+ Argument < string > secondArgument = new ( "second source " )
2727 {
28- Description = "The second database to compare."
28+ Description = "The second source to compare: a .db, an exported .evtx, or a folder containing .db and/or .evtx files (top-level only) ."
2929 } ;
3030
3131 Argument < string > newDbArgument = new ( "new db" )
3232 {
33- Description = "The new database containing only the providers in the second db which are not in the first db . Must have a .db extension."
33+ Description = "The new database containing only the providers in the second source which are not in the first source . Must have a .db extension."
3434 } ;
3535
3636 Option < bool > verboseOption = new ( "--verbose" )
3737 {
3838 Description = "Verbose logging. May be useful for troubleshooting."
3939 } ;
4040
41- diffDatabaseCommand . Arguments . Add ( dbOneArgument ) ;
42- diffDatabaseCommand . Arguments . Add ( dbTwoArgument ) ;
41+ diffDatabaseCommand . Arguments . Add ( firstArgument ) ;
42+ diffDatabaseCommand . Arguments . Add ( secondArgument ) ;
4343 diffDatabaseCommand . Arguments . Add ( newDbArgument ) ;
4444 diffDatabaseCommand . Options . Add ( verboseOption ) ;
4545
@@ -48,76 +48,67 @@ public static Command GetCommand()
4848 using var sp = Program . BuildServiceProvider ( action . GetValue ( verboseOption ) ) ;
4949 new DiffDatabaseCommand ( sp . GetRequiredService < ITraceLogger > ( ) )
5050 . DiffDatabase (
51- action . GetRequiredValue ( dbOneArgument ) ,
52- action . GetRequiredValue ( dbTwoArgument ) ,
51+ action . GetRequiredValue ( firstArgument ) ,
52+ action . GetRequiredValue ( secondArgument ) ,
5353 action . GetRequiredValue ( newDbArgument ) ) ;
5454 } ) ;
5555
5656 return diffDatabaseCommand ;
5757 }
5858
59- private void DiffDatabase ( string dbOne , string dbTwo , string newDb )
59+ private void DiffDatabase ( string firstSource , string secondSource , string newDb )
6060 {
61- foreach ( var path in new [ ] { dbOne , dbTwo } )
62- {
63- if ( File . Exists ( path ) ) { continue ; }
64-
65- Logger . Error ( $ "File not found: { path } ") ;
66- return ;
67- }
61+ if ( ! ProviderSource . TryValidate ( firstSource , Logger ) ) { return ; }
62+ if ( ! ProviderSource . TryValidate ( secondSource , Logger ) ) { return ; }
6863
6964 if ( File . Exists ( newDb ) )
7065 {
7166 Logger . Error ( $ "File already exists: { newDb } ") ;
7267 return ;
7368 }
7469
75- if ( Path . GetExtension ( newDb ) != ".db" )
70+ if ( ! string . Equals ( Path . GetExtension ( newDb ) , ".db" , StringComparison . OrdinalIgnoreCase ) )
7671 {
7772 Logger . Error ( $ "New db path must have a .db extension.") ;
7873 return ;
7974 }
8075
81- var dbOneProviderNames = new HashSet < string > ( ) ;
82-
83- using ( var dbOneContext = new EventProviderDbContext ( dbOne , true , Logger ) )
84- {
85- dbOneContext . ProviderDetails . Select ( p => p . ProviderName ) . ToList ( )
86- . ForEach ( name => dbOneProviderNames . Add ( name ) ) ;
87- }
76+ var firstProviderNames = new HashSet < string > (
77+ ProviderSource . LoadProviderNames ( firstSource , Logger ) ,
78+ StringComparer . OrdinalIgnoreCase ) ;
8879
8980 var providersCopied = new List < ProviderDetails > ( ) ;
9081
91- using var dbTwoContext = new EventProviderDbContext ( dbTwo , true , Logger ) ;
9282 using var newDbContext = new EventProviderDbContext ( newDb , false , Logger ) ;
9383
94- foreach ( var details in dbTwoContext . ProviderDetails )
84+ foreach ( var details in ProviderSource . LoadProviders ( secondSource , Logger ) )
9585 {
96- if ( dbOneProviderNames . Contains ( details . ProviderName ) )
86+ if ( firstProviderNames . Contains ( details . ProviderName ) )
9787 {
98- Logger . Info ( $ "Skipping { details . ProviderName } because it is present in both databases.") ;
88+ Logger . Info ( $ "Skipping { details . ProviderName } because it is present in both sources.") ;
89+ continue ;
9990 }
100- else
91+
92+ Logger . Info ( $ "Copying { details . ProviderName } because it is present in second source but not first.") ;
93+
94+ newDbContext . ProviderDetails . Add ( new ProviderDetails
10195 {
102- Logger . Info ( $ "Copying { details . ProviderName } because it is present in second db but not first db.") ;
103- newDbContext . ProviderDetails . Add ( new ProviderDetails
104- {
105- ProviderName = details . ProviderName ,
106- Events = details . Events ,
107- Keywords = details . Keywords ,
108- Messages = details . Messages ,
109- Opcodes = details . Opcodes ,
110- Tasks = details . Tasks
111- } ) ;
112-
113- providersCopied . Add ( details ) ;
114- }
96+ ProviderName = details . ProviderName ,
97+ Events = details . Events ,
98+ Parameters = details . Parameters ,
99+ Keywords = details . Keywords ,
100+ Messages = details . Messages ,
101+ Opcodes = details . Opcodes ,
102+ Tasks = details . Tasks
103+ } ) ;
104+
105+ providersCopied . Add ( details ) ;
115106 }
116107
117108 newDbContext . SaveChanges ( ) ;
118109
119110 if ( providersCopied . Count <= 0 ) { return ; }
120-
111+
121112 Logger . Info ( $ "Providers copied to new database:") ;
122113 Logger . Info ( $ "" ) ;
123114 LogProviderDetailHeader ( providersCopied . Select ( p => p . ProviderName ) ) ;
0 commit comments