//+-------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // // File: vertab.cpp // // Contents: // // History: // //--------------------------------------------------------------------------- #include "version.h" LPCTSTR __VersionIndexOnVersionId::pszIndexName = VERSION_ID_INDEXNAME; LPCTSTR __VersionIndexOnVersionId::pszIndexKey = VERSION_ID_INDEXNAME_INDEXKEY; //---------------------------------------------------- CCriticalSection VersionTable::g_TableLock; LPCTSTR VersionTable::pszTableName = VERSION_TABLE_NAME; //---------------------------------------------------- TLSJBIndex VersionTable::g_TableIndex[] = { { VERSION_ID_INDEXNAME, VERSION_ID_INDEXNAME_INDEXKEY, -1, JET_bitIndexIgnoreNull, TLSTABLE_INDEX_DEFAULT_DENSITY } }; int VersionTable::g_NumTableIndex = sizeof(VersionTable::g_TableIndex) / sizeof(VersionTable::g_TableIndex[0]); TLSJBColumn VersionTable::g_Columns[] = { { VERSION_TABLE_VERSION, JET_coltypLong, 0, JET_bitColumnFixed | JET_bitColumnNotNULL, NULL, 0, TLS_JETBLUE_COLUMN_CODE_PAGE, TLS_JETBLUE_COLUMN_COUNTRY_CODE, TLS_JETBLUE_COLUMN_LANGID }, { VERSION_TABLE_DOMAINID, JET_coltypLongBinary, TLSTABLE_MAX_BINARY_LENGTH, 0, NULL, 0, TLS_JETBLUE_COLUMN_CODE_PAGE, TLS_JETBLUE_COLUMN_COUNTRY_CODE, TLS_JETBLUE_COLUMN_LANGID }, { VERSION_TABLE_INSTALLID, 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 } }; int VersionTable::g_NumColumns=sizeof(VersionTable::g_Columns) / sizeof(VersionTable::g_Columns[0]); //------------------------------------------------------------- JBKeyBase* VersionTable::EnumerationIndex( BOOL bMatchAll, DWORD dwSearchParam, TLSVersion* pVersion, BOOL* bCompareKey ) /* */ { // not expecting more than one row. *bCompareKey = (bMatchAll && (dwSearchParam & VERSION_TABLE_PROCESS_VERSION)); return new TLSVersionIndexVersionId(pVersion); } //------------------------------------------------------------ BOOL VersionTable::EqualValue( TLSVersion& s1, TLSVersion& s2, BOOL bMatchAll, DWORD dwParam ) /* */ { BOOL bRetCode = TRUE; if(dwParam & VERSION_TABLE_PROCESS_VERSION) { bRetCode = (s1.dwVersion == s2.dwVersion); if(bRetCode != bMatchAll) goto cleanup; } if(dwParam & VERSION_TABLE_PROCESS_INSTALLID) { bRetCode = (_tcscmp(s1.szInstallId, s2.szInstallId) == 0); if(bRetCode != bMatchAll) goto cleanup; } //if(dwParam & VERSION_TABLE_PROCESS_DOMAINID) //{ // bRetCode = EqualSid(s1.pbDomainSid, s2.pbDomainSid); //} cleanup: return bRetCode; } //---------------------------------------------------- BOOL VersionTable::ResolveToTableColumn() /* */ { m_JetErr = dwVersion.AttachToTable( *this, VERSION_TABLE_VERSION ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), VERSION_TABLE_VERSION, GetTableName() ); return FALSE; } m_JetErr = szInstallId.AttachToTable( *this, VERSION_TABLE_INSTALLID ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), VERSION_TABLE_INSTALLID, GetTableName() ); return FALSE; } m_JetErr = pbDomainSid.AttachToTable( *this, VERSION_TABLE_DOMAINID ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), VERSION_TABLE_DOMAINID, GetTableName() ); } return IsSuccess(); } //---------------------------------------------------- BOOL VersionTable::FetchRecord( TLSVersion& v, DWORD dwParam ) /* */ { if(dwParam & VERSION_TABLE_PROCESS_VERSION) { m_JetErr = dwVersion.FetchColumnValue( &(v.dwVersion), sizeof(v.dwVersion), 0, NULL ); REPORT_IF_FETCH_FAILED(GetTableName(), VERSION_TABLE_VERSION, m_JetErr); if(IsSuccess() == FALSE) goto cleanup; } if(dwParam & VERSION_TABLE_PROCESS_INSTALLID) { m_JetErr = szInstallId.FetchColumnValue( v.szInstallId, sizeof(v.szInstallId), 0, NULL ); REPORT_IF_FETCH_FAILED( GetTableName(), VERSION_TABLE_INSTALLID, m_JetErr ); if(IsSuccess() == FALSE) goto cleanup; } #if 0 if(dwParam & VERSION_TABLE_PROCESS_DOMAINID) { DWORD size; m_JetErr = pbDomainSid.FetchColumnValue( NULL, 0, 0, &size ); if(size > v.cbDomainSid || v.pbDomainSid == NULL) { FreeMemory(v.pbDomainSid); v.pbDomainSid = (PBYTE)AllocateMemory(v.cbDomainSid = size); if(v.pbDomainSid == NULL) { SetLastJetError(JET_errOutOfMemory); goto cleanup; } } m_JetErr = pbDomainSid.FetchColumnValue( v.pbDomainSid, v.cbDomainSid, 0, &v.cbDomainSid ); REPORT_IF_FETCH_FAILED( GetTableName(), VERSION_TABLE_DOMAINID, m_JetErr ); } #endif cleanup: return IsSuccess(); } //---------------------------------------------------- BOOL VersionTable::InsertUpdateRecord( TLSVersion* v, DWORD dwParam ) /* */ { if(dwParam & VERSION_TABLE_PROCESS_VERSION) { m_JetErr = dwVersion.InsertColumnValue( &(v->dwVersion), sizeof(v->dwVersion), 0 ); REPORT_IF_INSERT_FAILED(GetTableName(), VERSION_TABLE_VERSION, m_JetErr); if(IsSuccess() == FALSE) goto cleanup; } if(dwParam & VERSION_TABLE_PROCESS_INSTALLID) { m_JetErr = szInstallId.InsertColumnValue( v->szInstallId, _tcslen(v->szInstallId) * sizeof(TCHAR), 0 ); REPORT_IF_INSERT_FAILED( GetTableName(), VERSION_TABLE_INSTALLID, m_JetErr ); if(IsSuccess() == FALSE) goto cleanup; } #if 0 // no more domain SID if(dwParam & VERSION_TABLE_PROCESS_DOMAINID) { m_JetErr = pbDomainSid.InsertColumnValue( v->pbDomainSid, v->cbDomainSid, 0 ); REPORT_IF_INSERT_FAILED( GetTableName(), VERSION_TABLE_DOMAINID, m_JetErr ); } #endif cleanup: return IsSuccess(); } //---------------------------------------------------- BOOL VersionTable::InsertRecord( TLSVersion& v, DWORD dwParam ) /* */ { if(BeginUpdate(FALSE) == FALSE) return FALSE; InsertUpdateRecord(&v, dwParam); EndUpdate(IsSuccess() == FALSE); return IsSuccess(); } //---------------------------------------------------- BOOL VersionTable::UpdateRecord( TLSVersion& v, DWORD dwParam ) /* */ { if(BeginUpdate(TRUE) == FALSE) return FALSE; InsertUpdateRecord(&v, dwParam); EndUpdate(IsSuccess() == FALSE); return IsSuccess(); }