//+-------------------------------------------------------------------------- // // 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(); }