435 lines
10 KiB
C++
435 lines
10 KiB
C++
//+--------------------------------------------------------------------------
|
|
//
|
|
// 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();
|
|
}
|
|
|