//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996-1998 // // File: workitem.cpp // // Contents: workitem Table // // History: // //--------------------------------------------------------------------------- #include "workitem.h" //---------------------------------------------------- CCriticalSection WorkItemTable::g_TableLock; //---------------------------------------------------- TLSJBIndex WorkItemTable::g_TableIndex[] = { { WORKITEM_INDEX_JOBTIME_INDEXNAME, WORKITEM_INDEX_JOBTIME_INDEXKEY, -1, JET_bitIndexIgnoreNull, TLSTABLE_INDEX_DEFAULT_DENSITY } }; int WorkItemTable::g_NumTableIndex = sizeof(WorkItemTable::g_TableIndex) / sizeof(WorkItemTable::g_TableIndex[0]); TLSJBColumn WorkItemTable::g_Columns[] = { { WORKITEM_COLUMN_JOBTIME, JET_coltypLong, sizeof(DWORD), JET_bitColumnNotNULL, NULL, 0, TLS_JETBLUE_COLUMN_CODE_PAGE, TLS_JETBLUE_COLUMN_COUNTRY_CODE, TLS_JETBLUE_COLUMN_LANGID }, { WORKITEM_COLUMN_JOBRESTARTTIME, JET_coltypLong, sizeof(DWORD), JET_bitColumnNotNULL, NULL, 0, TLS_JETBLUE_COLUMN_CODE_PAGE, TLS_JETBLUE_COLUMN_COUNTRY_CODE, TLS_JETBLUE_COLUMN_LANGID }, { WORKITEM_COLUMN_JOBTYPE, JET_coltypLong, 0, JET_bitColumnNotNULL, NULL, 0, TLS_JETBLUE_COLUMN_CODE_PAGE, TLS_JETBLUE_COLUMN_COUNTRY_CODE, TLS_JETBLUE_COLUMN_LANGID }, { WORKITEM_COLUMN_DATA, JET_coltypLongBinary, WORKITEM_MAX_DATA_SIZE, // 0x8FFFFFFF, // no limit on data size. 0, NULL, 0, TLS_JETBLUE_COLUMN_CODE_PAGE, TLS_JETBLUE_COLUMN_COUNTRY_CODE, TLS_JETBLUE_COLUMN_LANGID } }; int WorkItemTable::g_NumColumns=sizeof(WorkItemTable::g_Columns) / sizeof(WorkItemTable::g_Columns[0]); //------------------------------------------------------------- JBKeyBase* WorkItemTable::EnumerationIndex( BOOL bMatchAll, DWORD dwSearchParam, WORKITEMRECORD* pRecord, BOOL* bCompareKey ) /* */ { *bCompareKey = bMatchAll; return new TLSWorkItemIdxModifyTime(pRecord); } //------------------------------------------------------------ BOOL WorkItemTable::EqualValue( WORKITEMRECORD& s1, WORKITEMRECORD& s2, BOOL bMatchAll, DWORD dwParam ) /* */ { BOOL bRetCode = TRUE; if(dwParam & WORKITEM_PROCESS_JOBTIME) { bRetCode = (s1.dwScheduledTime == s2.dwScheduledTime); if(bRetCode != bMatchAll) goto cleanup; } if(dwParam & WORKITEM_PROCESS_JOBRESTARTTIME) { bRetCode = (s1.dwRestartTime == s2.dwRestartTime); if(bRetCode != bMatchAll) goto cleanup; } if(dwParam & WORKITEM_PROCESS_JOBTYPE) { bRetCode = (s1.dwJobType == s2.dwJobType); if(bRetCode != bMatchAll) goto cleanup; } // // process data must accompany by process data size. // if(dwParam & WORKITEM_PROCESS_DATA) { bRetCode = (s1.cbData == s2.cbData); if(bRetCode != bMatchAll) goto cleanup; bRetCode = (memcmp(s1.pbData, s2.pbData, s1.cbData) == 0); } cleanup: return bRetCode; } //---------------------------------------------------- BOOL WorkItemTable::ResolveToTableColumn() /* */ { m_JetErr = dwScheduledTime.AttachToTable( *this, WORKITEM_COLUMN_JOBTIME ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), WORKITEM_COLUMN_JOBTIME, GetTableName() ); goto cleanup; } m_JetErr = dwRestartTime.AttachToTable( *this, WORKITEM_COLUMN_JOBRESTARTTIME ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), WORKITEM_COLUMN_JOBRESTARTTIME, GetTableName() ); goto cleanup; } m_JetErr = dwJobType.AttachToTable( *this, WORKITEM_COLUMN_JOBTYPE ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), WORKITEM_COLUMN_JOBTYPE, GetTableName() ); goto cleanup; } m_JetErr = pbData.AttachToTable( *this, WORKITEM_COLUMN_DATA ); if(IsSuccess() == FALSE) { DebugOutput( _TEXT("Can't find column %s in table %s\n"), WORKITEM_COLUMN_DATA, GetTableName() ); } cleanup: return IsSuccess(); } //---------------------------------------------------- CLASS_PRIVATE BOOL WorkItemTable::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 WorkItemTable::ProcessRecord( WORKITEMRECORD* pRecord, BOOL bFetch, DWORD dwParam, BOOL bUpdate ) /* */ { DWORD dwSize; if(bFetch == FALSE) { BeginUpdate(bUpdate); if(!(dwParam & WORKITEM_PROCESS_JOBTIME)) { JB_ASSERT(FALSE); dwParam |= WORKITEM_PROCESS_JOBTIME; } } else { SetLastJetError(JET_errSuccess); } if(IsSuccess() == FALSE) goto cleanup; if(dwParam & WORKITEM_PROCESS_JOBTIME) { ProcessSingleColumn( bFetch, dwScheduledTime, 0, &(pRecord->dwScheduledTime), sizeof(pRecord->dwScheduledTime), &dwSize, WORKITEM_COLUMN_JOBTIME ); } if(IsSuccess() == FALSE) goto cleanup; if(dwParam & WORKITEM_PROCESS_JOBRESTARTTIME) { ProcessSingleColumn( bFetch, dwRestartTime, 0, &(pRecord->dwRestartTime), sizeof(pRecord->dwRestartTime), &dwSize, WORKITEM_COLUMN_JOBRESTARTTIME ); } if(IsSuccess() == FALSE) goto cleanup; if(dwParam & WORKITEM_PROCESS_JOBTYPE) { ProcessSingleColumn( bFetch, dwJobType, 0, &(pRecord->dwJobType), sizeof(pRecord->dwJobType), &dwSize, WORKITEM_COLUMN_JOBTYPE ); } if(IsSuccess() == FALSE) goto cleanup; if(dwParam & WORKITEM_PROCESS_DATA) { if(bFetch == TRUE) { m_JetErr = pbData.FetchColumnValue( NULL, 0, 0, &dwSize // &pRecord->cbData ); if( pRecord->pbData == NULL || pRecord->cbData < dwSize ) { if( pRecord->pbData != NULL ) { FreeMemory(pRecord->pbData); pRecord->pbData = NULL; } pRecord->pbData = (PBYTE)AllocateMemory(dwSize); if(pRecord->pbData == NULL) { pRecord->cbData = 0; SetLastJetError(JET_errOutOfMemory); goto cleanup; } pRecord->cbData = dwSize; } // // actual memory allocated might be bigger then pRecord->cbData // m_JetErr = pbData.FetchColumnValue( pRecord->pbData, pRecord->cbData, 0, &pRecord->cbData ); } else { ProcessSingleColumn( bFetch, pbData, 0, pRecord->pbData, pRecord->cbData, &dwSize, WORKITEM_COLUMN_DATA ); } } 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(); }