Skip to content

Commit d9263b8

Browse files
authored
Merge pull request #1465 from iwrinshow/master
Updating to allow restore with more parameters
2 parents 464f5f7 + 1264508 commit d9263b8

File tree

1 file changed

+89
-14
lines changed

1 file changed

+89
-14
lines changed

samples/features/sqlvdi/snapshot/snapshot.cpp

Lines changed: 89 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,10 @@ All Rights Reserved.
5757
void 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);
6364
bool checkSQL(HANDLE);
6465

6566
bool 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("\nSending 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("\nPerforming 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

253299
shutdown:
@@ -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

396447
unsigned __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)
661735
void 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

Comments
 (0)