Leaked source code of windows server 2003
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

// 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;
}