You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
5.3 KiB
193 lines
5.3 KiB
// Restore Remote Storage Engine database from backup directory
|
|
//
|
|
// Usage: RsTore backup_dir
|
|
// backup_dir - location of backup directory
|
|
// The database is restored to the current directory
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <wchar.h>
|
|
|
|
#include "esent.h"
|
|
|
|
|
|
// Local data
|
|
WCHAR *backup_dir;
|
|
WCHAR *usage = L"RsTore <backup-directory>";
|
|
|
|
// Local functions
|
|
HRESULT FileCount(WCHAR* Pattern, LONG* pCount);
|
|
HRESULT parseCommand(int argc, wchar_t *argv[]);
|
|
|
|
#define WsbCatch(hr) \
|
|
catch(HRESULT catchHr) { \
|
|
hr = catchHr; \
|
|
}
|
|
|
|
|
|
// FileCount - count files matching the pattern
|
|
HRESULT FileCount(WCHAR* Pattern, LONG* pCount)
|
|
{
|
|
DWORD err;
|
|
WIN32_FIND_DATA FindData;
|
|
HANDLE hFind;
|
|
HRESULT hr = S_OK;
|
|
int nCount = 0;
|
|
int nSkipped = 0;
|
|
|
|
try {
|
|
hFind = FindFirstFile(Pattern, &FindData);
|
|
if (INVALID_HANDLE_VALUE == hFind) {
|
|
err = GetLastError();
|
|
throw(HRESULT_FROM_WIN32(err));
|
|
}
|
|
|
|
while (TRUE) {
|
|
|
|
if (FindData.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY |
|
|
FILE_ATTRIBUTE_HIDDEN)) {
|
|
// Don't count system files (such as "." and "..")
|
|
nSkipped++;
|
|
} else {
|
|
nCount++;
|
|
}
|
|
if (!FindNextFile(hFind, &FindData)) {
|
|
err = GetLastError();
|
|
if (ERROR_NO_MORE_FILES == err) break;
|
|
throw(HRESULT_FROM_WIN32(err));
|
|
}
|
|
}
|
|
} WsbCatch(hr);
|
|
|
|
*pCount = nCount;
|
|
return(hr);
|
|
}
|
|
|
|
// parseCommand - Parse the command line
|
|
HRESULT parseCommand(int argc, wchar_t *argv[])
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
try {
|
|
int i;
|
|
|
|
// There should be cmd name + one parameters.
|
|
if (argc != 2) {
|
|
throw (E_FAIL);
|
|
}
|
|
|
|
for (i = 1; i < argc; i++) {
|
|
if (WCHAR('-') == argv[i][0]) {
|
|
throw(E_FAIL);
|
|
|
|
} else {
|
|
backup_dir = argv[i];
|
|
hr = S_OK;
|
|
}
|
|
}
|
|
|
|
} WsbCatch(hr);
|
|
|
|
return(hr);
|
|
}
|
|
|
|
|
|
// wmain - Main function
|
|
extern "C"
|
|
int _cdecl wmain(int argc, wchar_t *argv[])
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
try {
|
|
hr = parseCommand(argc, argv);
|
|
if (!SUCCEEDED(hr)) {
|
|
printf("Command line is incorrect\n%ls\n", usage);
|
|
return -1;
|
|
}
|
|
|
|
try {
|
|
PCHAR cbdir = NULL;
|
|
LONG count;
|
|
ULONG size;
|
|
JET_ERR jstat;
|
|
WCHAR *pattern;
|
|
|
|
//
|
|
// Allocate memory for the string
|
|
//
|
|
size = wcslen(backup_dir) + 20;
|
|
|
|
pattern = new WCHAR[size];
|
|
|
|
if (pattern == NULL) {
|
|
throw(E_OUTOFMEMORY);
|
|
}
|
|
// Check that there's a HSM DB to restore
|
|
wcscpy(pattern, backup_dir);
|
|
wcscat(pattern, L"\\*.jet");
|
|
|
|
hr = FileCount(pattern, &count);
|
|
|
|
delete pattern;
|
|
pattern = 0;
|
|
|
|
if (S_OK != hr || count == 0) {
|
|
printf("No Remote Storage databases were found in the given\n");
|
|
printf("directory: %ls\n", static_cast<WCHAR*>(backup_dir));
|
|
printf("Please enter the directory containing the backup files.\n");
|
|
throw(E_FAIL);
|
|
}
|
|
|
|
// Check that the current directory is empty
|
|
pattern = L".\\*";
|
|
hr = FileCount(pattern, &count);
|
|
if (S_OK != hr || count != 0) {
|
|
printf("The current directory is not empty\n");
|
|
printf("The database restore can only be done to an empty directory.\n");
|
|
throw(E_FAIL);
|
|
}
|
|
|
|
// Set the log size to avoid an error JetRestore
|
|
jstat = JetSetSystemParameter(0, 0, JET_paramLogFileSize,
|
|
64, NULL);
|
|
if (JET_errSuccess != jstat) {
|
|
printf("JetSetSystemParameter(JET_paramLogFileSize) failed, JET error = %ld\n", (LONG)jstat);
|
|
throw(E_FAIL);
|
|
}
|
|
|
|
// Try the restore
|
|
size_t tempsize = wcstombs(0, backup_dir, 0);
|
|
if (tempsize == (size_t)-1) {
|
|
throw(E_INVALIDARG);
|
|
}
|
|
size = tempsize + 1;
|
|
cbdir = new CHAR[size];
|
|
if (cbdir == NULL) {
|
|
throw(E_OUTOFMEMORY);
|
|
}
|
|
wcstombs(cbdir, backup_dir, size);
|
|
|
|
jstat = JetRestore(cbdir, NULL);
|
|
|
|
if (JET_errSuccess == jstat) {
|
|
printf("Restore succeeded\n");
|
|
hr = S_OK;
|
|
} else {
|
|
printf("Restore failed, JET error = %ld\n", (LONG)jstat);
|
|
hr = E_FAIL;
|
|
}
|
|
|
|
delete cbdir;
|
|
cbdir = 0;
|
|
} WsbCatch(hr);
|
|
|
|
} WsbCatch(hr);
|
|
|
|
if (SUCCEEDED(hr)) {
|
|
return(0);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
|