@@ -57,9 +57,10 @@ All Rights Reserved.
5757void performTransfer (
5858 IClientVirtualDeviceSet2* vds,
5959 IClientVirtualDevice* vd,
60- int backup);
60+ int backup,
61+ const char * dumpFile);
6162
62- HANDLE execSQL (bool doBackup, WCHAR* pInstanceName, WCHAR* pDbName, WCHAR* pVdsName);
63+ HANDLE execSQL (bool doBackup, WCHAR* pInstanceName, WCHAR* pDbName, WCHAR* pVdsName, WCHAR* pTargetDbName, WCHAR* pLogicalDataName, WCHAR* pLogicalLogName, WCHAR* pDataFile, WCHAR* pLogFile );
6364bool checkSQL (HANDLE);
6465
6566bool ynPrompt (const char * str);
@@ -83,6 +84,18 @@ main(int argc, char* argv[])
8384 char * pInstanceName = nullptr ;
8485 WCHAR wInstanceName[128 ] = { 0 };
8586 int rc = 0 ;
87+ char * pDataFile = nullptr ;
88+ char * pLogFile = nullptr ;
89+ char * pTargetDbName = nullptr ;
90+ char * pLogicalDataName = nullptr ;
91+ char * pLogicalLogName = nullptr ;
92+ const char * pDumpFile = " snapshot.dmp" ;
93+ WCHAR wDbName[128 ];
94+ WCHAR wTargetDbName[128 ] = { 0 };
95+ WCHAR wLogicalDataName[128 ] = { 0 };
96+ WCHAR wLogicalLogName[128 ] = { 0 };
97+ WCHAR wDataFile[256 ] = { 0 };
98+ WCHAR wLogFile[256 ] = { 0 };
8699
87100 // Check the input parm
88101 //
@@ -107,11 +120,33 @@ main(int argc, char* argv[])
107120 {
108121 pInstanceName = argv[3 ];
109122 }
123+
124+ if (argc >= 9 )
125+ {
126+ pTargetDbName = argv[4 ];
127+ pLogicalDataName = argv[5 ];
128+ pLogicalLogName = argv[6 ];
129+ pDataFile = argv[7 ];
130+ pLogFile = argv[8 ];
131+ }
132+
133+ if (argc == 5 )
134+ {
135+ pDumpFile = argv[4 ];
136+ }
137+ else if (argc == 10 )
138+ {
139+ pDumpFile = argv[9 ];
140+ }
110141 }
111142
112143 if (badParm)
113144 {
114- printf (" usage: snapshot {B|R} <databaseName> [<instanceName>]\n "
145+ printf (" usage: snapshot {B|R} <databaseName> [options...]\n "
146+ " Backup: snapshot B <sourceDB> [<instanceName>] [<dumpFile>]\n "
147+ " Restore: snapshot R <sourceDB> [<instanceName>] [<dumpFile>]\n "
148+ " Restore: snapshot R <sourceDB> <instanceName> <targetDB> <logicalData> <logicalLog> <dataFile.mdf> <logFile.ldf> <dumpFile>\n "
149+ " Default dumpFile: snapshot.dmp\n "
115150 " Demonstrate a Backup or Restore WITH SNAPSHOT\n " );
116151 printf (" \n\n ** NOTE **\n The ability to take or mount snapshots must be implemented\n "
117152 " before this sample is truely functional.\n " );
@@ -196,12 +231,22 @@ main(int argc, char* argv[])
196231 //
197232 printf (" \n Sending the SQL...\n " );
198233
199- WCHAR wDbName[128 ];
200234 MultiByteToWideChar (CP_ACP, 0 ,
201235 pDbName, -1 ,
202236 wDbName, 127 );
203237
204- hThread = execSQL (doBackup, wInstanceName, wDbName, wVdsName);
238+ if (pTargetDbName && pLogicalDataName && pLogicalLogName && pDataFile && pLogFile)
239+ {
240+ MultiByteToWideChar (CP_ACP, 0 , pTargetDbName, -1 , wTargetDbName, 127 );
241+ MultiByteToWideChar (CP_ACP, 0 , pLogicalDataName, -1 , wLogicalDataName, 127 );
242+ MultiByteToWideChar (CP_ACP, 0 , pLogicalLogName, -1 , wLogicalLogName, 127 );
243+ MultiByteToWideChar (CP_ACP, 0 , pDataFile, -1 , wDataFile, 255 );
244+ MultiByteToWideChar (CP_ACP, 0 , pLogFile, -1 , wLogFile, 255 );
245+ }
246+
247+ hThread = execSQL (doBackup, wInstanceName, wDbName, wVdsName,
248+ wTargetDbName, wLogicalDataName, wLogicalLogName,
249+ wDataFile, wLogFile);
205250 if (hThread == nullptr )
206251 {
207252 printf (" execSQL failed.\n " );
@@ -246,8 +291,9 @@ main(int argc, char* argv[])
246291 }
247292
248293 printf (" \n Performing data transfer...\n " );
294+ printf (" Using dump file: %s\n " , pDumpFile);
249295
250- performTransfer (vds, vd, doBackup);
296+ performTransfer (vds, vd, doBackup, pDumpFile );
251297
252298
253299shutdown:
@@ -391,6 +437,11 @@ struct PARMS
391437 WCHAR* pInstanceName;
392438 WCHAR* pDbName;
393439 WCHAR* pVdsName;
440+ WCHAR* pTargetDbName;
441+ WCHAR* pLogicalDataName;
442+ WCHAR* pLogicalLogName;
443+ WCHAR* pDataFile;
444+ WCHAR* pLogFile;
394445};
395446
396447unsigned __stdcall
@@ -420,11 +471,27 @@ SQLRoutine(void* input)
420471
421472 // Generate the command to execute
422473 //
423- swprintf_s (sqlCommand, L" %ls DATABASE [%ls] %ls VIRTUAL_DEVICE='%ls' WITH SNAPSHOT" ,
424- parms->doBackup ? L" BACKUP" : L" RESTORE" ,
425- parms->pDbName ,
426- parms->doBackup ? L" TO" : L" FROM" ,
427- parms->pVdsName );
474+ if (!parms->doBackup && parms->pTargetDbName [0 ] && parms->pLogicalDataName [0 ] &&
475+ parms->pLogicalLogName [0 ] && parms->pDataFile [0 ] && parms->pLogFile [0 ])
476+ {
477+ // RESTORE with MOVE options
478+ swprintf_s (sqlCommand, L" RESTORE DATABASE [%ls] FROM VIRTUAL_DEVICE='%ls' WITH SNAPSHOT, REPLACE, NORECOVERY, "
479+ L" MOVE '%ls' TO '%ls', MOVE '%ls' TO '%ls'" ,
480+ parms->pTargetDbName ,
481+ parms->pVdsName ,
482+ parms->pLogicalDataName ,
483+ parms->pDataFile ,
484+ parms->pLogicalLogName ,
485+ parms->pLogFile );
486+ }
487+ else
488+ {
489+ swprintf_s (sqlCommand, L" %ls DATABASE [%ls] %ls VIRTUAL_DEVICE='%ls' WITH SNAPSHOT" ,
490+ parms->doBackup ? L" BACKUP" : L" RESTORE" ,
491+ parms->pDbName ,
492+ parms->doBackup ? L" TO" : L" FROM" ,
493+ parms->pVdsName );
494+ }
428495
429496 // Initialize the ODBC environment.
430497 //
@@ -587,7 +654,9 @@ SQLRoutine(void* input)
587654//
588655// Return the thread handle (NULL on error).
589656//
590- HANDLE execSQL (bool doBackup, WCHAR* pInstanceName, WCHAR* pDbName, WCHAR* pVDName)
657+ HANDLE execSQL (bool doBackup, WCHAR* pInstanceName, WCHAR* pDbName, WCHAR* pVDName,
658+ WCHAR* pTargetDbName, WCHAR* pLogicalDataName, WCHAR* pLogicalLogName,
659+ WCHAR* pDataFile, WCHAR* pLogFile)
591660{
592661 unsigned int threadId;
593662 HANDLE hThread;
@@ -597,6 +666,11 @@ HANDLE execSQL(bool doBackup, WCHAR* pInstanceName, WCHAR* pDbName, WCHAR* pVDNa
597666 parms.pDbName = pDbName;
598667 parms.pInstanceName = pInstanceName;
599668 parms.pVdsName = pVDName;
669+ parms.pTargetDbName = pTargetDbName;
670+ parms.pLogicalDataName = pLogicalDataName;
671+ parms.pLogicalLogName = pLogicalLogName;
672+ parms.pDataFile = pDataFile;
673+ parms.pLogFile = pLogFile;
600674
601675 hThread = (HANDLE)_beginthreadex (
602676 nullptr , 0 , SQLRoutine, (void *)&parms, 0 , &threadId);
@@ -661,10 +735,11 @@ bool ynPrompt(const char* str)
661735void performTransfer (
662736 IClientVirtualDeviceSet2* iVds,
663737 IClientVirtualDevice* vd,
664- int backup)
738+ int backup,
739+ const char * dumpFile)
665740{
666741 FILE* fh;
667- char * fname = ( char *) " snapshot.dmp " ;
742+ const char * fname = dumpFile ;
668743 VDC_Command* cmd;
669744 DWORD completionCode;
670745 DWORD bytesTransferred;
0 commit comments