windows-nt/Source/XPSP1/NT/termsrv/license/tlserver/tlsdb/backup.cpp
2020-09-26 16:20:57 +08:00

545 lines
13 KiB
C++

//+--------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// File: backup.cpp
//
// Contents:
//
// History:
//
//---------------------------------------------------------------------------
#include "backup.h"
LPCTSTR __BackupSourceIdxOnServerName::pszIndexName = BACKUPSOURCE_INDEX_LSERVERNAME_INDEXNAME;
LPCTSTR __BackupSourceIdxOnServerName::pszIndexKey = BACKUPSOURCE_INDEX_LSERVERNAME_INDEXKEY;
LPCTSTR __BackupSourceIdxOnSetupId::pszIndexName = BACKUPSOURCE_INDEX_LSSETUPID_INDEXNAME;
LPCTSTR __BackupSourceIdxOnSetupId::pszIndexKey = BACKUPSOURCE_INDEX_LSSETUPID_INDEXKEY;
LPCTSTR BackupSourceTable::pszTableName = BACKUPSOURCE_TABLE_NAME;
//----------------------------------------------------
CCriticalSection BackupSourceTable::g_TableLock;
//----------------------------------------------------
TLSJBIndex
BackupSourceTable::g_TableIndex[] =
{
{
BACKUPSOURCE_INDEX_LSERVERNAME_INDEXNAME,
BACKUPSOURCE_INDEX_LSERVERNAME_INDEXKEY,
-1,
JET_bitIndexIgnoreNull,
TLSTABLE_INDEX_DEFAULT_DENSITY
},
{
BACKUPSOURCE_INDEX_LSSETUPID_INDEXNAME,
BACKUPSOURCE_INDEX_LSSETUPID_INDEXKEY,
-1,
JET_bitIndexIgnoreNull,
TLSTABLE_INDEX_DEFAULT_DENSITY
}
};
int
BackupSourceTable::g_NumTableIndex = sizeof(BackupSourceTable::g_TableIndex) / sizeof(BackupSourceTable::g_TableIndex[0]);
TLSJBColumn
BackupSourceTable::g_Columns[] =
{
{
BACKUPSOURCE_COLUMN_LSERVERNAME,
JB_COLTYPE_TEXT,
(MAX_JETBLUE_TEXT_LENGTH + 1)*sizeof(TCHAR),
0,
JBSTRING_NULL,
_tcslen(JBSTRING_NULL),
TLS_JETBLUE_COLUMN_CODE_PAGE,
TLS_JETBLUE_COLUMN_COUNTRY_CODE,
TLS_JETBLUE_COLUMN_LANGID
},
{
BACKUPSOURCE_COLUMN_LSSETUPID,
JB_COLTYPE_TEXT,
(MAX_JETBLUE_TEXT_LENGTH + 1)*sizeof(TCHAR),
0,
JBSTRING_NULL,
_tcslen(JBSTRING_NULL),
TLS_JETBLUE_COLUMN_CODE_PAGE,
TLS_JETBLUE_COLUMN_COUNTRY_CODE,
TLS_JETBLUE_COLUMN_LANGID
},
{
BACKUPSOURCE_COLUMN_DOMAINSID,
JET_coltypLongBinary,
TLSTABLE_MAX_BINARY_LENGTH,
0,
NULL,
0,
TLS_JETBLUE_COLUMN_CODE_PAGE,
TLS_JETBLUE_COLUMN_COUNTRY_CODE,
TLS_JETBLUE_COLUMN_LANGID
},
{
BACKUPSOURCE_COLUMN_DBFILENAME,
JB_COLTYPE_TEXT,
(MAX_PATH + 1)*sizeof(TCHAR),
0,
NULL,
0,
TLS_JETBLUE_COLUMN_CODE_PAGE,
TLS_JETBLUE_COLUMN_COUNTRY_CODE,
TLS_JETBLUE_COLUMN_LANGID
},
{
BACKUPSOURCE_COLUMN_LASTBACKUPTIME,
JET_coltypBinary,
sizeof(FILETIME),
JET_bitColumnNotNULL,
NULL,
0,
TLS_JETBLUE_COLUMN_CODE_PAGE,
TLS_JETBLUE_COLUMN_COUNTRY_CODE,
TLS_JETBLUE_COLUMN_LANGID
},
{
BACKUPSOURCE_COLUMN_LASTRESTORETIME,
JET_coltypBinary,
sizeof(FILETIME),
JET_bitColumnNotNULL,
NULL,
0,
TLS_JETBLUE_COLUMN_CODE_PAGE,
TLS_JETBLUE_COLUMN_COUNTRY_CODE,
TLS_JETBLUE_COLUMN_LANGID
}
};
int
BackupSourceTable::g_NumColumns=sizeof(BackupSourceTable::g_Columns) / sizeof(BackupSourceTable::g_Columns[0]);
//-------------------------------------------------------------
JBKeyBase*
BackupSourceTable::EnumerationIndex(
BOOL bMatchAll,
DWORD dwSearchParam,
BACKUPSOURCERECORD* pRecord,
BOOL* bCompareKey
)
/*
*/
{
JBKeyBase* index;
if(dwSearchParam & BACKUPSOURCE_PROCESS_LSSETUPID)
{
index = new TLSBckSrcIdxSetupId(pRecord);
}
else
{
index = new TLSBckSrcIdxServerName(pRecord);
}
*bCompareKey = bMatchAll;
return index;
}
//------------------------------------------------------------
BOOL
BackupSourceTable::EqualValue(
BACKUPSOURCERECORD& s1,
BACKUPSOURCERECORD& s2,
BOOL bMatchAll,
DWORD dwParam
)
/*
*/
{
BOOL bRetCode = TRUE;
if(dwParam & BACKUPSOURCE_PROCESS_LSSETUPID)
{
bRetCode = (_tcscmp(s1.szInstallId, s2.szInstallId) == 0);
if(bRetCode != bMatchAll)
goto cleanup;
}
if(dwParam & BACKUPSOURCE_PROCESS_SERVERNAME)
{
bRetCode = (_tcsicmp(s1.szTlsServerName, s2.szTlsServerName) == 0);
if(bRetCode != bMatchAll)
goto cleanup;
}
//if(dwParam & BACKUPSOURCE_PROCESS_DOMAINSID)
//{
// bRetCode = EqualSid(s1.pbDomainSid, s2.pbDomainSid);
// if(bRetCode != bMatchAll)
// goto cleanup;
//}
if(dwParam & BACKUPSOURCE_PROCESS_FILENAME)
{
bRetCode = (_tcsicmp(s1.szFileName, s2.szFileName) == 0);
if(bRetCode != bMatchAll)
goto cleanup;
}
if(dwParam & BACKUPSOURCE_PROCESS_BACKUPTIME)
{
bRetCode = (CompareFileTime(&s1.ftLastBackupTime, &s2.ftLastBackupTime) == 0);
if(bRetCode != bMatchAll)
goto cleanup;
}
if(dwParam & BACKUPSOURCE_PROCESS_RESTORETIME)
{
bRetCode = (CompareFileTime(&s1.ftLastRestoreTime, &s2.ftLastRestoreTime) == 0);
}
cleanup:
return bRetCode;
}
//----------------------------------------------------
BOOL
BackupSourceTable::ResolveToTableColumn()
/*
*/
{
m_JetErr = szInstallId.AttachToTable(
*this,
BACKUPSOURCE_COLUMN_LSSETUPID
);
if(IsSuccess() == FALSE)
{
DebugOutput(
_TEXT("Can't find column %s in table %s\n"),
BACKUPSOURCE_COLUMN_LSSETUPID,
GetTableName()
);
goto cleanup;
}
m_JetErr = szTlsServerName.AttachToTable(
*this,
BACKUPSOURCE_COLUMN_LSERVERNAME
);
if(IsSuccess() == FALSE)
{
DebugOutput(
_TEXT("Can't find column %s in table %s\n"),
BACKUPSOURCE_COLUMN_LSERVERNAME,
GetTableName()
);
goto cleanup;
}
m_JetErr = pbDomainSid.AttachToTable(
*this,
BACKUPSOURCE_COLUMN_DOMAINSID
);
if(IsSuccess() == FALSE)
{
DebugOutput(
_TEXT("Can't find column %s in table %s\n"),
BACKUPSOURCE_COLUMN_DOMAINSID,
GetTableName()
);
goto cleanup;
}
m_JetErr = szFileName.AttachToTable(
*this,
BACKUPSOURCE_COLUMN_DBFILENAME
);
if(IsSuccess() == FALSE)
{
DebugOutput(
_TEXT("Can't find column %s in table %s\n"),
BACKUPSOURCE_PROCESS_FILENAME,
GetTableName()
);
goto cleanup;
}
m_JetErr = ftLastBackupTime.AttachToTable(
*this,
BACKUPSOURCE_COLUMN_LASTBACKUPTIME
);
if(IsSuccess() == FALSE)
{
DebugOutput(
_TEXT("Can't find column %s in table %s\n"),
BACKUPSOURCE_COLUMN_LASTBACKUPTIME,
GetTableName()
);
goto cleanup;
}
m_JetErr = ftLastRestoreTime.AttachToTable(
*this,
BACKUPSOURCE_COLUMN_LASTRESTORETIME
);
if(IsSuccess() == FALSE)
{
DebugOutput(
_TEXT("Can't find column %s in table %s\n"),
BACKUPSOURCE_COLUMN_LASTRESTORETIME,
GetTableName()
);
}
cleanup:
return IsSuccess();
}
//----------------------------------------------------
CLASS_PRIVATE BOOL
BackupSourceTable::ProcessSingleColumn(
IN BOOL bFetch,
IN TLSColumnBase& column,
IN DWORD offset,
IN PVOID pbData,
IN DWORD cbData,
IN PDWORD pcbDataReturn,
IN LPCTSTR szColumnName
)
/*
Abstract:
Fetch/Insert/Update a particular column.
Parameter:
bFetch - TRUE if fetch, FALSE if update/insert.
column - Intended column for operation, reference pointer to TLSColumn
szColumnName - name of the column, for debugging print purpose only
Returns:
TRUE if successful, FALSE otherwise.
*/
{
if(bFetch)
{
m_JetErr = column.FetchColumnValue(
pbData,
cbData,
offset,
pcbDataReturn
);
}
else
{
m_JetErr = column.InsertColumnValue(
pbData,
cbData,
offset
);
}
REPORTPROCESSFAILED(
bFetch,
GetTableName(),
szColumnName,
m_JetErr
);
return IsSuccess();
}
//---------------------------------------------------------
CLASS_PRIVATE BOOL
BackupSourceTable::ProcessRecord(
BACKUPSOURCERECORD* bkRecord,
BOOL bFetch,
DWORD dwParam,
BOOL bUpdate
)
/*
*/
{
DWORD dwSize;
if(bFetch == FALSE)
{
BeginUpdate(bUpdate);
}
else
{
SetLastJetError(JET_errSuccess);
}
if(IsSuccess() == FALSE)
goto cleanup;
if(dwParam & BACKUPSOURCE_PROCESS_LSSETUPID)
{
ProcessSingleColumn(
bFetch,
szInstallId,
0,
bkRecord->szInstallId,
sizeof(bkRecord->szInstallId),
&dwSize,
BACKUPSOURCE_COLUMN_LSSETUPID
);
}
if(IsSuccess() == FALSE)
goto cleanup;
if(dwParam & BACKUPSOURCE_PROCESS_SERVERNAME)
{
ProcessSingleColumn(
bFetch,
szTlsServerName,
0,
bkRecord->szTlsServerName,
sizeof(bkRecord->szTlsServerName),
&dwSize,
BACKUPSOURCE_COLUMN_LSERVERNAME
);
}
if(IsSuccess() == FALSE)
goto cleanup;
#if 0
// no more domain SID
if(dwParam & BACKUPSOURCE_PROCESS_DOMAINSID)
{
if(bFetch == TRUE)
{
DWORD size=0;
m_JetErr = pbDomainSid.FetchColumnValue(
NULL,
0,
0,
&size
);
if(bkRecord->cbDomainSid < size || bkRecord->pbDomainSid == NULL)
{
FreeMemory(bkRecord->pbDomainSid);
bkRecord->pbDomainSid = (PSID)AllocateMemory(bkRecord->cbDomainSid = size);
if(bkRecord->pbDomainSid == NULL)
{
SetLastJetError(JET_errOutOfMemory);
goto cleanup;
}
}
m_JetErr = pbDomainSid.FetchColumnValue(
bkRecord->pbDomainSid,
bkRecord->cbDomainSid,
0,
&bkRecord->cbDomainSid
);
}
else
{
ProcessSingleColumn(
bFetch,
pbDomainSid,
0,
bkRecord->pbDomainSid,
bkRecord->cbDomainSid,
&dwSize,
BACKUPSOURCE_COLUMN_DOMAINSID
);
}
}
if(IsSuccess() == FALSE)
goto cleanup;
#endif
if(dwParam & BACKUPSOURCE_PROCESS_FILENAME)
{
ProcessSingleColumn(
bFetch,
szFileName,
0,
bkRecord->szFileName,
sizeof(bkRecord->szFileName),
&dwSize,
BACKUPSOURCE_COLUMN_DBFILENAME
);
}
if(IsSuccess() == FALSE)
goto cleanup;
if(dwParam & BACKUPSOURCE_PROCESS_BACKUPTIME)
{
ProcessSingleColumn(
bFetch,
ftLastBackupTime,
0,
&(bkRecord->ftLastBackupTime),
sizeof(bkRecord->ftLastBackupTime),
&dwSize,
BACKUPSOURCE_COLUMN_LASTBACKUPTIME
);
}
if(IsSuccess() == FALSE)
goto cleanup;
if(dwParam & BACKUPSOURCE_PROCESS_RESTORETIME)
{
ProcessSingleColumn(
bFetch,
ftLastRestoreTime,
0,
&(bkRecord->ftLastRestoreTime),
sizeof(bkRecord->ftLastRestoreTime),
&dwSize,
BACKUPSOURCE_COLUMN_LASTRESTORETIME
);
}
cleanup:
//
// For inserting/updating record
if(bFetch == FALSE)
{
JET_ERR jetErr;
jetErr = GetLastJetError();
EndUpdate(IsSuccess() == FALSE);
if(jetErr != JET_errSuccess && IsSuccess() == FALSE)
SetLastJetError(jetErr);
}
return IsSuccess();
}