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

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