|
|
//+--------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// File:
//
// Contents:
//
// History:
//
//---------------------------------------------------------------------------
#include "JetBlue.h"
#include "locks.h"
#ifdef USE_SINGLE_JET_CALL
CCriticalSection g_JetCallLock; #define SINGLE_JET_CALL CCriticalSectionLocker lock(g_JetCallLock)
#else
#define SINGLE_JET_CALL
#endif
DWORD DeleteFilesInDirectory( IN LPTSTR szDir, IN LPTSTR szFilesToBeDelete, IN BOOL bIncludeSubdir ) /*++
--*/ { TCHAR szFile[MAX_PATH+1]; HANDLE hFile; WIN32_FIND_DATA findData; BOOL bSuccess = TRUE; DWORD dwStatus = ERROR_SUCCESS;
if (lstrlen(szDir) + lstrlen(szFilesToBeDelete) + 2 > sizeof(szFile) / sizeof(TCHAR)) { return ERROR_INVALID_DATA; }
wsprintf( szFile, _TEXT("%s\\%s"), szDir, szFilesToBeDelete );
hFile = FindFirstFile( szFile, &findData );
if(hFile == INVALID_HANDLE_VALUE) { return GetLastError(); }
// _tprintf(_TEXT("Deleting %s\n"), szDir);
while(bSuccess == TRUE) { if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && bIncludeSubdir == TRUE) { if( lstrcmp(findData.cFileName, _TEXT(".")) != 0 && lstrcmp(findData.cFileName, _TEXT("..")) != 0 ) {
if (lstrlen(szDir) + lstrlen(findData.cFileName) + 2 <= sizeof(szFile) / sizeof(TCHAR)) { wsprintf(szFile, _TEXT("%s\\%s"), szDir, findData.cFileName); bSuccess = DeleteFilesInDirectory( szFile, szFilesToBeDelete, bIncludeSubdir ); } } } else { if (lstrlen(szDir) + lstrlen(findData.cFileName) + 2 <= sizeof(szFile) / sizeof(TCHAR)) { wsprintf( szFile, _TEXT("%s\\%s"), szDir, findData.cFileName );
bSuccess = DeleteFile(szFile); } }
if(bSuccess == TRUE) { // return FALSE with error code set to ERROR_NO_MORE_FILES
bSuccess = FindNextFile(hFile, &findData); } }
dwStatus = GetLastError();
FindClose(hFile);
return (dwStatus == ERROR_NO_MORE_FILES) ? ERROR_SUCCESS : dwStatus; }
//----------------------------------------------------------------
JET_ERR ConvertTLSJbColumnDefToJbColumnCreate( IN const PTLSJBColumn pTlsJbColumn, IN OUT JET_COLUMNCREATE* pJetColumnCreate ) /*
*/ { pJetColumnCreate->cbStruct = sizeof(JET_COLUMNCREATE); if(ConvertWstrToJBstr(pTlsJbColumn->pszColumnName, &pJetColumnCreate->szColumnName) == FALSE) { return JET_errInvalidParameter; }
pJetColumnCreate->coltyp = pTlsJbColumn->colType; pJetColumnCreate->cbMax = pTlsJbColumn->cbMaxLength; pJetColumnCreate->grbit = pTlsJbColumn->jbGrbit; pJetColumnCreate->pvDefault = pTlsJbColumn->pbDefValue; pJetColumnCreate->cbDefault = pTlsJbColumn->cbDefValue; pJetColumnCreate->cp = pTlsJbColumn->colCodePage;
return JET_errSuccess; }
//----------------------------------------------------------------
JET_ERR ConvertTlsJBTableIndexDefToJbIndexCreate( IN const PTLSJBIndex pTlsJbTableIndex, IN OUT JET_INDEXCREATE* pJetIndexCreate ) /*
*/ { JET_ERR jetError = JET_errSuccess; DWORD count=0;
pJetIndexCreate->cbStruct = sizeof(JET_INDEXCREATE); if(ConvertWstrToJBstr(pTlsJbTableIndex->pszIndexName, &pJetIndexCreate->szIndexName) == FALSE) { jetError = JET_errInvalidParameter; goto cleanup; }
if(pTlsJbTableIndex->pszIndexKey && pTlsJbTableIndex->cbKey == 0) { count++;
// need double NULL terminate
while(pTlsJbTableIndex->pszIndexKey[count] != _TEXT('\0') || pTlsJbTableIndex->pszIndexKey[count-1] != _TEXT('\0')) { //
// this max. is pseudo impose.
//
if(count >= TLS_JETBLUE_MAX_INDEXKEY_LENGTH) { jetError = JET_errInvalidParameter; goto cleanup; }
count++; }
// pTlsJbTableIndex->cbKey = count;
} else { count = pTlsJbTableIndex->cbKey; }
if(ConvertMWstrToMJBstr(pTlsJbTableIndex->pszIndexKey, count, &pJetIndexCreate->szKey) == FALSE) { jetError = JET_errInvalidParameter; goto cleanup; }
pJetIndexCreate->cbKey = pTlsJbTableIndex->cbKey; pJetIndexCreate->grbit = pTlsJbTableIndex->jbGrbit; pJetIndexCreate->ulDensity = pTlsJbTableIndex->ulDensity;
cleanup: return jetError; }
//////////////////////////////////////////////////////////////////////
//
// JBInstance implementaion
//
//////////////////////////////////////////////////////////////////////
JBInstance::JBInstance() : JBError(), m_JetInstance(0), m_bInit(FALSE), m_NumSession(0) { }
//--------------------------------------------------------------------
JBInstance::~JBInstance() { if(m_bInit == FALSE) { return; }
//JB_ASSERT(m_NumSession == 0);
//if(m_NumSession != 0)
//{
// throw JBError(JET_errTooManyActiveUsers);
//}
JBTerminate(); }
//--------------------------------------------------------------------
BOOL JBInstance::JBInitJetInstance() { char szLogFilePath[MAX_PATH+1]; LPTSTR pszLogPath=NULL; BOOL bSuccess;
if(m_bInit == TRUE) { SetLastJetError(JET_errAlreadyInitialized); return FALSE; }
SINGLE_JET_CALL;
m_JetErr = JetInit(&m_JetInstance);
if(m_JetErr == JET_errMissingLogFile) { //
// Delete log file and retry operation again
//
bSuccess = GetSystemParameter( 0, JET_paramLogFilePath, NULL, (PBYTE)szLogFilePath, sizeof(szLogFilePath) );
if(bSuccess == TRUE && ConvertJBstrToWstr(szLogFilePath, &pszLogPath)) { DeleteFilesInDirectory( pszLogPath, JETBLUE_RESLOG, FALSE );
DeleteFilesInDirectory( pszLogPath, JETBLUE_EDBLOG, FALSE );
m_JetErr = JetInit(&m_JetInstance); } }
m_bInit = IsSuccess(); return m_bInit; }
//--------------------------------------------------------------------
BOOL JBInstance::JBTerminate( IN JET_GRBIT grbit, IN BOOL bDeleteLogFile ) { char szLogFilePath[MAX_PATH+1]; LPTSTR pszLogPath=NULL; BOOL bSuccess;
if(m_bInit == FALSE) return TRUE;
//
// LSTESTER bug - one thread was still in enumeration while
// the other thread shutdown server
//
//if(m_NumSession > 0)
//{
// JB_ASSERT(m_NumSession == 0);
// SetLastJetError(JET_errTooManyActiveUsers);
// return FALSE;
//}
SINGLE_JET_CALL;
m_JetErr = JetTerm2(m_JetInstance, grbit); // JB_ASSERT(m_JetErr == JET_errSuccess);
if(m_JetErr == JET_errSuccess && bDeleteLogFile == TRUE) { //
// Delete log file.
//
bSuccess = GetSystemParameter( 0, JET_paramLogFilePath, NULL, (PBYTE)szLogFilePath, sizeof(szLogFilePath) );
if(bSuccess == TRUE && ConvertJBstrToWstr(szLogFilePath, &pszLogPath)) { DeleteFilesInDirectory( pszLogPath, JETBLUE_RESLOG, FALSE );
DeleteFilesInDirectory( pszLogPath, JETBLUE_EDBLOG, FALSE ); } }
m_bInit = FALSE;
// need to add operator= to this class.
// m_NumSession = 0; // force terminate.
if(pszLogPath != NULL) { LocalFree(pszLogPath); }
return (m_JetErr == JET_errSuccess); }
//--------------------------------------------------------------------
BOOL JBInstance::SetSystemParameter( IN JET_SESID SesId, IN unsigned long lParamId, IN ULONG_PTR lParam, IN PBYTE sz ) { LPSTR lpszParm=NULL;
if(lParamId == JET_paramSystemPath || lParamId == JET_paramTempPath || lParamId == JET_paramLogFilePath ) { if(ConvertWstrToJBstr((LPTSTR)sz, &lpszParm) == FALSE) { SetLastJetError(JET_errInvalidParameter); return FALSE; } } else { lpszParm = (LPSTR)sz; }
SINGLE_JET_CALL;
m_JetErr = JetSetSystemParameter( &m_JetInstance, SesId, lParamId, lParam, (const char *)lpszParm );
if(lParamId == JET_paramSystemPath || lParamId == JET_paramTempPath || lParamId == JET_paramLogFilePath ) { FreeJBstr(lpszParm); }
return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBInstance::GetSystemParameter( IN JET_SESID SesId, IN unsigned long lParamId, IN ULONG_PTR* plParam, IN PBYTE sz, IN unsigned long cbMax ) { SINGLE_JET_CALL;
m_JetErr = JetGetSystemParameter( m_JetInstance, SesId, lParamId, plParam, (char *)sz, cbMax );
return IsSuccess(); }
//--------------------------------------------------------------------
CLASS_PRIVATE JET_SESID JBInstance::BeginJetSession( IN LPCTSTR pszUserName, IN LPCTSTR pszPwd ) { JET_SESID sesId = JET_sesidNil; LPSTR lpszUserName=NULL; LPSTR lpszPwd=NULL;
if(m_bInit == FALSE) { SetLastJetError(JET_errNotInitialized); return JET_sesidNil; }
if(ConvertWstrToJBstr(pszUserName, &lpszUserName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
if(ConvertWstrToJBstr(pszPwd, &lpszPwd) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetBeginSession( m_JetInstance, &sesId, lpszUserName, lpszPwd ); }
if(IsSuccess() == TRUE) { m_NumSession++; }
cleanup:
FreeJBstr(lpszUserName); FreeJBstr(lpszPwd);
return IsSuccess() ? sesId : JET_sesidNil; }
//--------------------------------------------------------------------
CLASS_PRIVATE BOOL JBInstance::EndJetSession( IN JET_SESID JetSessionID, IN JET_GRBIT grbit ) { SINGLE_JET_CALL;
m_JetErr = JetEndSession(JetSessionID, grbit);
if(IsSuccess() == TRUE) { m_NumSession--; }
return IsSuccess(); }
//--------------------------------------------------------------------
CLASS_PRIVATE BOOL JBInstance::EndSession( IN JET_SESID sesId, IN JET_GRBIT grbit ) { return EndJetSession( sesId, grbit ); }
//----------------------------------------------------------------------------
// Implementation for JBSession
//----------------------------------------------------------------------------
JBSession::JBSession( IN JBInstance& JetInstance, IN JET_SESID JetSessID ) : JBError(), m_JetInstance(JetInstance), m_JetSessionID(JetSessID), m_TransactionLevel(0), m_JetDBInitialized(0) /*
*/ { }
//-----------------------------------------------------------
JBSession::JBSession( IN JBSession& JetSession ) : JBError(), m_JetInstance(JetSession.GetJetInstance()), m_JetSessionID(JET_sesidNil), m_TransactionLevel(0), m_JetDBInitialized(0) { if(DuplicateSession(JetSession.GetJetSessionID()) == FALSE) { JB_ASSERT(FALSE); throw JBError(GetLastJetError()); } }
//-----------------------------------------------------------
JBSession::~JBSession() /*
*/ { if(IsValid() == TRUE && EndSession() == FALSE) { // do nothing, license server uses only global instance
// JB_ASSERT(FALSE);
// throw JBError(GetLastJetError());
} }
//----------------------------------------------------------
CLASS_PRIVATE BOOL JBSession::DuplicateSession( IN JET_SESID sessID ) { SINGLE_JET_CALL;
m_JetErr = JetDupSession(sessID, &m_JetSessionID); return IsSuccess(); }
//----------------------------------------------------------
CLASS_PRIVATE JET_DBID JBSession::OpenJetDatabase( IN LPCTSTR pszFile, IN LPCTSTR pszConnect, IN JET_GRBIT grbit ) { JET_DBID jdbId = JET_dbidNil; LPSTR lpszFile=NULL; LPSTR lpszConnect=NULL;
if(ConvertWstrToJBstr(pszFile, &lpszFile) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
if(ConvertWstrToJBstr(pszConnect, &lpszConnect) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
if(AttachDatabase(pszFile, grbit) == FALSE) goto cleanup;
{ SINGLE_JET_CALL;
m_JetErr = JetOpenDatabase( m_JetSessionID, lpszFile, lpszConnect, &jdbId, grbit ); }
if(IsSuccess() == TRUE) { m_JetDBInitialized++; }
cleanup: FreeJBstr(lpszFile); FreeJBstr(lpszConnect);
return IsSuccess() ? jdbId : JET_dbidNil; }
//----------------------------------------------------------
CLASS_PRIVATE BOOL JBSession::CloseJetDatabase( IN JET_DBID jdbId, IN JET_GRBIT grbit ) { SINGLE_JET_CALL;
m_JetErr = JetCloseDatabase( m_JetSessionID, jdbId, grbit );
if(IsSuccess() == TRUE) { m_JetDBInitialized--; }
return (IsSuccess()); }
//----------------------------------------------------------
CLASS_PRIVATE JET_DBID JBSession::CreateJetDatabase( IN LPCTSTR pszFile, IN LPCTSTR pszConnect, IN JET_GRBIT grbit ) { JET_DBID jdbId = JET_dbidNil;
LPSTR lpszFile=NULL; LPSTR lpszConnect=NULL;
if(ConvertWstrToJBstr(pszFile, &lpszFile) == FALSE) { SetLastError(JET_errInvalidParameter); goto cleanup; }
if(ConvertWstrToJBstr(pszConnect, &lpszConnect) == FALSE) { SetLastError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetCreateDatabase( m_JetSessionID, lpszFile, lpszConnect, &jdbId, grbit ); }
if(IsSuccess() == TRUE) { m_JetDBInitialized++; }
cleanup: FreeJBstr(lpszFile); FreeJBstr(lpszConnect);
return IsSuccess() ? jdbId : JET_dbidNil; }
//----------------------------------------------------------
BOOL JBSession::BeginSession( IN LPCTSTR pszUserName, IN LPCTSTR pszPwd ) /*
*/ { BOOL bSuccess;
if(m_JetInstance.IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); return FALSE; }
if(m_JetSessionID != JET_sesidNil) { SetLastJetError(JET_errAlreadyInitialized); return FALSE; }
m_JetSessionID = m_JetInstance.BeginJetSession( pszUserName, pszPwd );
if(m_JetSessionID == JET_sesidNil) { m_JetErr = m_JetInstance.GetLastJetError(); }
return IsSuccess(); }
//----------------------------------------------------------
BOOL JBSession::EndSession( IN JET_GRBIT grbit /* JET_bitTermComplete */ ) /*
*/ { BOOL bSuccess;
if(GetTransactionLevel() != 0) { //
// Terminate existing transaction
//
bSuccess = EndAllTransaction(FALSE); if(bSuccess == FALSE) { JB_ASSERT(FALSE); SetLastJetError(JET_errTransTooDeep); return FALSE; } }
if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); return FALSE; }
if(m_JetDBInitialized > 0) { JB_ASSERT(m_JetDBInitialized); SetLastJetError(JET_errTooManyActiveUsers); return FALSE; }
//
// Huei - routine to be phrased out ?
//
bSuccess=m_JetInstance.EndSession( m_JetSessionID, grbit );
if(bSuccess == TRUE) { m_JetSessionID = JET_sesidNil; } else { m_JetErr = m_JetInstance.GetLastJetError(); }
return IsSuccess(); }
//------------------------------------------------------------
BOOL JBSession::SetSystemParameter( IN unsigned long lParamId, IN ULONG_PTR lParam, IN const PBYTE sz ) { BOOL bSuccess;
bSuccess = m_JetInstance.SetSystemParameter( m_JetSessionID, lParamId, lParam, sz );
if(bSuccess == FALSE) { m_JetErr = m_JetInstance.GetLastJetError(); }
return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::GetSystemParameter( IN unsigned long lParamId, IN ULONG_PTR* plParam, IN PBYTE sz, IN unsigned long cbMax ) { BOOL bSuccess;
bSuccess = m_JetInstance.GetSystemParameter( m_JetSessionID, lParamId, plParam, sz, cbMax );
if(bSuccess == FALSE) { m_JetErr = m_JetInstance.GetLastJetError(); }
return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::AttachDatabase( IN LPCTSTR pszFileName, IN JET_GRBIT grbit ) { LPSTR lpszFileName=NULL;
if(m_JetSessionID == JET_sesidNil) { SetLastJetError(JET_errNotInitialized); goto cleanup; }
if(ConvertWstrToJBstr(pszFileName, &lpszFileName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetAttachDatabase( m_JetSessionID, lpszFileName, grbit ); }
cleanup:
FreeJBstr(lpszFileName); return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::DetachDatabase( IN LPCTSTR pszFileName ) { LPSTR lpszFileName = NULL;
if(m_JetSessionID == JET_sesidNil) { SetLastJetError(JET_errNotInitialized); goto cleanup; }
if(ConvertWstrToJBstr(pszFileName, &lpszFileName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetDetachDatabase( m_JetSessionID, lpszFileName ); }
cleanup:
FreeJBstr(lpszFileName); return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::BeginTransaction() { if(m_JetSessionID == JET_sesidNil) { SetLastJetError(JET_errNotInitialized); return FALSE; }
SINGLE_JET_CALL;
m_JetErr = JetBeginTransaction( m_JetSessionID );
if(IsSuccess() == TRUE) { m_TransactionLevel++; }
return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::CommitTransaction( IN JET_GRBIT grbit ) { if(m_JetSessionID == JET_sesidNil) { SetLastJetError(JET_errNotInitialized); return FALSE; }
SINGLE_JET_CALL;
m_JetErr = JetCommitTransaction( m_JetSessionID, grbit );
if(IsSuccess() == TRUE) { m_TransactionLevel --; }
return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::RollbackTransaction( IN JET_GRBIT grbit ) { if(m_JetSessionID == JET_sesidNil) { SetLastJetError(JET_errNotInitialized); return FALSE; }
SINGLE_JET_CALL;
m_JetErr = JetRollback( m_JetSessionID, grbit ); if(IsSuccess() == TRUE) m_TransactionLevel--;
return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBSession::EndAllTransaction( IN BOOL bCommit, IN JET_GRBIT grbit ) { BOOL bEnd = TRUE;
while(m_TransactionLevel > 0 && bEnd == TRUE) { bEnd = (bCommit == TRUE) ? CommitTransaction(grbit) : RollbackTransaction(grbit); }
return bEnd; }
//--------------------------------------------------------------------
CLASS_PRIVATE BOOL JBSession::CloseDatabase( JET_DBID jdbId, JET_GRBIT grbit ) { return CloseJetDatabase(jdbId, grbit); }
//////////////////////////////////////////////////////////////////////
//
// JBDatabase
//
//////////////////////////////////////////////////////////////////////
JBDatabase::JBDatabase( IN JBSession& jbSession, IN JET_DBID jdbId, /* JET_dbidNil */ IN LPCTSTR pszDatabase // NULL
) : JBError(), m_JetSession(jbSession), m_JetDbId(jdbId), m_TableOpened(0) /*
*/ { if(pszDatabase) { _tcscpy(m_szDatabaseFile, pszDatabase); } else { memset(m_szDatabaseFile, 0, sizeof(m_szDatabaseFile)); } }
//--------------------------------------------------------------------
JBDatabase::~JBDatabase() { if(CloseDatabase() == FALSE) { // do nothing, license server uses only global instance.
// JB_ASSERT(FALSE);
// throw JBError(GetLastJetError());
} }
//--------------------------------------------------------------------
BOOL JBDatabase::CloseDatabase( IN JET_GRBIT grbit ) { BOOL bSuccess;
//
// Verify we have properly initialized
//
if(IsValid() == FALSE) return TRUE;
//
// No table is still opened from the DB ID
//
if(m_TableOpened > 0) { JB_ASSERT(FALSE); SetLastJetError(JET_errTooManyActiveUsers); return FALSE; }
//
// Close the database
//
bSuccess = m_JetSession.CloseJetDatabase( m_JetDbId, grbit );
if(bSuccess == FALSE || m_JetSession.DetachDatabase(m_szDatabaseFile) == FALSE) { m_JetErr = m_JetSession.GetLastJetError(); } else { m_JetDbId = JET_dbidNil; memset(m_szDatabaseFile, 0, sizeof(m_szDatabaseFile)); }
return IsSuccess(); }
//--------------------------------------------------------------------
CLASS_PRIVATE JET_TABLEID JBDatabase::OpenJetTable( IN LPCTSTR pszTableName, IN void* pvParam, // NULL
IN unsigned long cbParam, // 0
JET_GRBIT grbit // JET_bitTableUpdatable
) /*
*/ { LPSTR lpszTableName = NULL;
JET_TABLEID tableid = JET_tableidNil; if(IsValid() == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
if(ConvertWstrToJBstr(pszTableName, &lpszTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr=JetOpenTable( m_JetSession.GetJetSessionID(), m_JetDbId, lpszTableName, pvParam, cbParam, grbit, &tableid ); }
if(IsSuccess() == TRUE) { m_TableOpened++; }
cleanup:
FreeJBstr(lpszTableName); return tableid; }
//--------------------------------------------------------------------
CLASS_PRIVATE JET_TABLEID JBDatabase::DuplicateJetCursor( // IN JET_SESID sesId,
IN JET_TABLEID srcTableid, IN JET_GRBIT grbit ) /*
*/ { JET_TABLEID tableid = JET_tableidNil;
SINGLE_JET_CALL; m_JetErr = JetDupCursor( GetJetSessionID(), srcTableid, &tableid, 0 // grbit must be zero
);
if(IsSuccess() == TRUE) { m_TableOpened++; }
return (IsSuccess() == TRUE) ? tableid : JET_tableidNil; }
//--------------------------------------------------------------------
CLASS_PRIVATE BOOL JBDatabase::CloseJetTable( // IN JET_SESID sesId,
IN JET_TABLEID tableid ) /*
*/ { // JetBlue AC with empty table
SINGLE_JET_CALL;
m_JetErr = JetCloseTable( GetJetSessionID(), tableid );
if(IsSuccess()) { m_TableOpened--; }
return IsSuccess(); }
//--------------------------------------------------------------------
CLASS_PRIVATE JET_TABLEID JBDatabase::CreateJetTable( LPCTSTR pszTableName, unsigned long lPage, // 0
unsigned long lDensity // 20
) /*
*/ { JET_TABLEID tableid = JET_tableidNil; JB_STRING lpszTableName=NULL;
if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); goto cleanup; }
if(ConvertWstrToJBstr(pszTableName, &lpszTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetCreateTable( GetJetSessionID(), m_JetDbId, lpszTableName, lPage, lDensity, &tableid ); }
if(IsSuccess() == FALSE) { goto cleanup; }
m_TableOpened++;
cleanup:
FreeJBstr(lpszTableName); return tableid; }
//--------------------------------------------------------------------
CLASS_PRIVATE JET_TABLEID JBDatabase::CreateJetTableEx( LPCTSTR pszTableName, const PTLSJBTable table_attribute, const PTLSJBColumn columns, const DWORD num_columns, const PTLSJBIndex table_index, const DWORD num_table_index ) /*
*/ { JET_TABLEID tableid = JET_tableidNil; JB_STRING lpszTableName=NULL; JET_TABLECREATE table_create; JET_COLUMNCREATE* column_create=NULL; JET_INDEXCREATE* index_create=NULL; DWORD index=0;
SINGLE_JET_CALL;
table_create.szTableName = NULL; table_create.szTemplateTableName = NULL;
if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); goto cleanup; }
if(ConvertWstrToJBstr(pszTableName, &lpszTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
table_create.cbStruct = sizeof(JET_TABLECREATE); table_create.szTableName = lpszTableName;
if(ConvertWstrToJBstr(table_attribute->pszTemplateTableName, &table_create.szTemplateTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
table_create.ulPages = table_attribute->ulPages; table_create.ulDensity = (table_attribute->ulDensity < 20 || table_attribute->ulDensity > 100) ? TLS_JETBLUE_DEFAULT_TABLE_DENSITY : table_attribute->ulDensity;
table_create.grbit = table_attribute->jbGrbit;
//
// form a JET_TABLECREATE structure
//
column_create = (JET_COLUMNCREATE *)AllocateMemory( sizeof(JET_COLUMNCREATE) * num_columns );
if(column_create == NULL) { SetLastJetError(JET_errOutOfMemory); goto cleanup; }
index_create = (JET_INDEXCREATE *)AllocateMemory( sizeof(JET_INDEXCREATE) * num_table_index );
if(index_create == NULL) { SetLastJetError(JET_errOutOfMemory); goto cleanup; }
for(index=0; index < num_columns; index++) { if(ConvertTLSJbColumnDefToJbColumnCreate( columns+index, column_create+index ) == FALSE) { goto cleanup; } }
for(index=0; index < num_table_index; index++) { if(ConvertTlsJBTableIndexDefToJbIndexCreate( table_index+index, index_create+index ) == FALSE) goto cleanup; }
table_create.rgcolumncreate = column_create; table_create.cColumns = num_columns; table_create.rgindexcreate = index_create; table_create.cIndexes = num_table_index;
m_JetErr = JetCreateTableColumnIndex( GetJetSessionID(), GetJetDatabaseID(), &table_create ); if(IsSuccess() == TRUE) { tableid = table_create.tableid; }
cleanup: if(column_create != NULL) { for(index=0; index < num_columns; index++) { if(column_create[index].szColumnName != NULL) { FreeJBstr(column_create[index].szColumnName); } }
FreeMemory(column_create); }
if(index_create != NULL) { for(index=0; index < num_table_index; index++) { if(index_create[index].szIndexName != NULL) { FreeJBstr(index_create[index].szIndexName); }
if(index_create[index].szKey != NULL) { FreeJBstr(index_create[index].szKey); } }
FreeMemory(index_create); }
if(table_create.szTemplateTableName) FreeJBstr(table_create.szTemplateTableName);
if(table_create.szTableName) FreeJBstr(table_create.szTableName);
return tableid; }
//--------------------------------------------------------------------
JET_TABLEID JBDatabase::CreateTable( LPCTSTR pszTableName, unsigned long lPage, // 0
unsigned long lDensity // 20
) /*
*/ { JET_TABLEID tableid;
tableid = CreateJetTable( pszTableName, lPage, lDensity );
if(tableid == JET_tableidNil) { m_JetErr = GetLastJetError(); }
return tableid; }
//-------------------------------------------------------------------
JET_TABLEID JBDatabase::CreateTableEx( LPCTSTR pszTableName, const PTLSJBTable table_attribute, const PTLSJBColumn columns, DWORD num_columns, const PTLSJBIndex index, DWORD num_index ) /*
*/ { JET_TABLEID tableid;
tableid = CreateJetTableEx( pszTableName, table_attribute, columns, num_columns, index, num_index );
if(tableid == JET_tableidNil) { m_JetErr = GetLastJetError(); }
return tableid; }
//--------------------------------------------------------------------
CLASS_PRIVATE BOOL JBDatabase::CloseTable( JET_TABLEID tableid ) /*
? Verify this table ID is from this DB/Session */ { return CloseJetTable( tableid ); }
//--------------------------------------------------------------------
BOOL JBDatabase::DeleteTable( IN LPCTSTR pszTableName ) /*
TODO - ? verify this table is in this database */ { JB_STRING lpszTableName=NULL;
if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); goto cleanup; }
if(ConvertWstrToJBstr(pszTableName, &lpszTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetDeleteTable( GetJetSessionID(), GetJetDatabaseID(), lpszTableName ); }
//if(IsSuccess() == FALSE)
// goto cleanup;
cleanup:
FreeJBstr(lpszTableName); return IsSuccess(); }
//--------------------------------------------------------------------
BOOL JBDatabase::OpenDatabase( LPCTSTR szFile, LPCTSTR szConnect, // NULL
JET_GRBIT grbit // 0
) /*
*/ { m_JetDbId = m_JetSession.OpenJetDatabase( szFile, szConnect, grbit );
if(m_JetDbId == JET_dbidNil) { m_JetErr = m_JetSession.GetLastJetError(); } else { _tcscpy(m_szDatabaseFile, szFile); }
return m_JetDbId != JET_dbidNil; }
//--------------------------------------------------------------------
BOOL JBDatabase::CreateDatabase( LPCTSTR szFile, LPCTSTR szConnect, // NULL
JET_GRBIT grbit // 0
) /*
*/ { m_JetDbId = m_JetSession.CreateJetDatabase( szFile, szConnect, grbit );
if(m_JetDbId == JET_dbidNil) { m_JetErr = m_JetSession.GetLastJetError(); } else { _tcscpy(m_szDatabaseFile, szFile); }
return m_JetDbId != JET_dbidNil; }
//////////////////////////////////////////////////////////////////////
//
// JBTable
//
//////////////////////////////////////////////////////////////////////
JBColumn JBTable::m_ErrColumn;
JBTable::JBTable( JBDatabase& JetDatabase, LPCTSTR pszTableName, JET_TABLEID tableid ) : JBError(), m_JetDatabase(JetDatabase), m_JetTableId(tableid), m_JetColumns(NULL), m_NumJetColumns(0), m_InEnumeration(FALSE), m_InsertRepositionBookmark(FALSE) /*
*/ { if(pszTableName) { _tcscpy(m_szTableName, pszTableName); } else { memset(m_szTableName, 0, sizeof(m_szTableName)); } }
//--------------------------------------------------------------------
JBTable::JBTable( JBTable& jbTable ) : JBError(), m_JetDatabase(jbTable.GetJetDatabase()), m_JetColumns(NULL), m_NumJetColumns(0), m_InEnumeration(FALSE) /*
*/ { // duplicate jet cursor
_tcscpy(m_szTableName, jbTable.GetTableName());
m_JetTableId = m_JetDatabase.DuplicateJetCursor( jbTable.GetJetTableID(), 0 ); if(m_JetTableId == JET_tableidNil) { m_JetErr = m_JetDatabase.GetLastJetError(); } }
//--------------------------------------------------------------------
JBTable::~JBTable() { if(m_JetTableId == JET_tableidNil) return;
CloseTable(); }
//--------------------------------------------------------------------
CLASS_PRIVATE JET_COLUMNID JBTable::AddJetColumn( LPCTSTR pszColumnName, const JET_COLUMNDEF* pColumnDef, const PVOID pbDefaultValue, // NULL
const unsigned long cbDefaultValue // 0
) /*
*/ { DebugOutput( _TEXT("Adding column %s to table %s, type %d\n"), pszColumnName, GetTableName(), pColumnDef->coltyp );
JB_STRING lpszColumnName=NULL; JET_COLUMNID columnid = (DWORD)JET_NIL_COLUMN;
if(IsValid() == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
if(ConvertWstrToJBstr(pszColumnName, &lpszColumnName) == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetAddColumn( GetJetSessionID(), GetJetTableID(), lpszColumnName, pColumnDef, pbDefaultValue, cbDefaultValue, &columnid ); }
cleanup:
DebugOutput( _TEXT("AddJetColumn returns %d\n"), GetLastJetError() );
FreeJBstr(lpszColumnName); return columnid; }
//--------------------------------------------------------------------
BOOL JBTable::AddIndex( JBKeyBase* key ) /*
*/ { return AddJetIndex( key->GetIndexName(), key->GetIndexKey(), key->GetKeyLength(), key->GetJetGrbit(), key->GetJetDensity() ); }
//--------------------------------------------------------------------
BOOL JBTable::AddJetIndex( LPCTSTR pszIndexName, LPCTSTR pszKey, unsigned long cbKey, JET_GRBIT grbit, /* 0 */ unsigned long lDensity /* 20 */ ) /*
*/ { DebugOutput( _TEXT("Adding Index %s to table %s\n"), pszIndexName, GetTableName() );
JB_STRING lpszIndexName=NULL; JB_STRING lpszKeyName=NULL;
if(IsValid() == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
if(ConvertWstrToJBstr(pszIndexName, &lpszIndexName) == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
if(ConvertMWstrToMJBstr(pszKey, cbKey, &lpszKeyName) == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetCreateIndex( GetJetSessionID(), GetJetTableID(), lpszIndexName, grbit, lpszKeyName, cbKey, lDensity ); }
cleanup: DebugOutput( _TEXT("Adding index %s returns %d\n"), pszIndexName, GetLastJetError() );
FreeJBstr(lpszIndexName); FreeJBstr(lpszKeyName);
return IsSuccess(); }
BOOL JBTable::DoesIndexExist( LPCTSTR pszIndexName ) { JB_STRING lpszIndexName=NULL; JET_INDEXID idx;
if(IsValid() == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
if(ConvertWstrToJBstr(pszIndexName, &lpszIndexName) == FALSE) { SetLastJetError(JET_errInvalidDatabaseId); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetGetTableIndexInfo( GetJetSessionID(), GetJetTableID(), lpszIndexName, &idx, sizeof(JET_INDEXID), JET_IdxInfoIndexId );
// if this succeeds, the index exists
}
cleanup:
FreeJBstr(lpszIndexName);
return IsSuccess();
}
//--------------------------------------------------------------------
BOOL JBTable::CloseTable() { BOOL bSuccess;
if(m_JetTableId == JET_tableidNil) return TRUE;
bSuccess = m_JetDatabase.CloseTable( m_JetTableId ); if(bSuccess == FALSE) { m_JetErr = m_JetDatabase.GetLastJetError(); }
//
// Force close on table.
//
m_JetTableId = JET_tableidNil;
if(m_JetColumns) delete [] m_JetColumns;
m_JetColumns = NULL; m_NumJetColumns = 0;
return bSuccess; }
//--------------------------------------------------------------------
BOOL JBTable::CreateOpenTable( IN LPCTSTR pszTableName, IN unsigned long lPage, // 0
IN unsigned long lDensity // 20
) /*
*/ { if(m_JetTableId != JET_tableidNil) { SetLastJetError(JET_errInvalidParameter); return FALSE; }
DebugOutput( _TEXT("Creating Table %s\n"), pszTableName );
m_JetTableId = m_JetDatabase.CreateJetTable( pszTableName, lPage, lDensity );
if(m_JetTableId == JET_tableidNil) { m_JetErr = m_JetDatabase.GetLastJetError(); }
return (m_JetTableId != JET_tableidNil); }
//--------------------------------------------------------------------
BOOL JBTable::OpenTable( IN LPCTSTR pszTableName, IN void* pvParam, IN unsigned long cbParam, IN JET_GRBIT grbit ) /*
*/ { DebugOutput( _TEXT("Opening table %s\n"), pszTableName );
JB_ASSERT(m_JetTableId == JET_tableidNil);
if(m_JetTableId != JET_tableidNil) { SetLastJetError(JET_errTableInUse); return FALSE; }
m_JetTableId = m_JetDatabase.OpenJetTable( pszTableName, pvParam, cbParam, grbit );
if(m_JetTableId == JET_tableidNil) { m_JetErr = m_JetDatabase.GetLastJetError(); } else { // load column info in the table
_tcscpy(m_szTableName, pszTableName);
if(LoadTableInfo() == FALSE) { // force a close on table
CloseTable(); } }
DebugOutput( _TEXT("Open table %s return code %d\n"), pszTableName, GetLastJetError() );
return (m_JetTableId != JET_tableidNil); }
//--------------------------------------------------------------------
JBTable* JBTable::DuplicateCursor( JET_GRBIT grbit /* 0 */ ) /*
*/ { JET_TABLEID tableid;
tableid = m_JetDatabase.DuplicateJetCursor( m_JetTableId, grbit ); if(tableid == JET_tableidNil) { m_JetErr = m_JetDatabase.GetLastJetError(); }
return new JBTable( m_JetDatabase, GetTableName(), tableid ); }
//--------------------------------------------------------------------
JBTable& JBTable::operator=(const JBTable& srcTable) { if(this == &srcTable) return *this;
// database has to be the same
// verify database is consistent
_tcscpy(m_szTableName, srcTable.GetTableName());
m_JetTableId = m_JetDatabase.DuplicateJetCursor( srcTable.GetJetTableID(), 0 ); if(m_JetTableId == JET_tableidNil) { m_JetErr = m_JetDatabase.GetLastJetError(); }
return *this; }
//--------------------------------------------------------------------
int JBTable::AddColumn( int numColumns, PTLSJBColumn pColumnDef ) /*
*/ { JET_COLUMNDEF column; JET_COLUMNID jet_columnid;
for(int i=0; i < numColumns; i++) { memset(&column, 0, sizeof(column));
column.cbStruct = sizeof(JET_COLUMNDEF); column.coltyp = (pColumnDef+i)->colType; column.wCountry = (pColumnDef+i)->wCountry; column.langid = (pColumnDef+i)->langid; column.cp = (pColumnDef+i)->colCodePage; column.cbMax = (pColumnDef+i)->cbMaxLength; column.grbit = (pColumnDef+i)->jbGrbit;
jet_columnid = AddJetColumn( (pColumnDef+i)->pszColumnName, &column, (pColumnDef+i)->pbDefValue, (pColumnDef+i)->cbDefValue );
if(jet_columnid == JET_NIL_COLUMN) break; }
// return which column cause trouble
return i; }
//--------------------------------------------------------------------
int JBTable::AddIndex( int numIndex, PTLSJBIndex pIndex ) /*
*/ { unsigned long keylength;
for(int i=0; i < numIndex; i++) { if((pIndex+i)->cbKey == -1) { // calculate index key length
keylength = 2;
while((pIndex+i)->pszIndexKey[keylength-1] != _TEXT('\0') || (pIndex+i)->pszIndexKey[keylength-2] != _TEXT('\0')) { if(keylength >= TLS_JETBLUE_MAX_INDEXKEY_LENGTH) { SetLastJetError(JET_errInvalidParameter); break; }
keylength++; } } else { keylength = (pIndex+i)->cbKey; }
if(keylength >= TLS_JETBLUE_MAX_INDEXKEY_LENGTH) { SetLastJetError(JET_errInvalidParameter); break; }
if(AddJetIndex( (pIndex+i)->pszIndexName, (pIndex+i)->pszIndexKey, keylength, (pIndex+i)->jbGrbit, (pIndex+i)->ulDensity ) == FALSE) { break; } }
return (i >= numIndex) ? 0 : i; }
//-------------------------------------------------------------
CLASS_PRIVATE BOOL JBTable::LoadTableInfo() /*
*/ { #if 1
LPSTR lpszTableName=NULL; JET_COLUMNLIST columns; unsigned long cbMax; JET_RETINFO jetRetInfo; char lpszColumnName[MAX_JETBLUE_NAME_LENGTH+1]; int NumChars; unsigned long index;
SINGLE_JET_CALL;
if(ConvertWstrToJBstr(GetTableName(), &lpszTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
memset(&columns, 0, sizeof(columns)); columns.cbStruct = sizeof(JET_COLUMNLIST); cbMax = sizeof(JET_COLUMNLIST);
m_JetErr = JetGetColumnInfo( GetJetSessionID(), GetJetDatabaseID(), lpszTableName, NULL, (PVOID)&columns, cbMax, 1 // retrieve column list
); if(IsSuccess() == FALSE) goto cleanup;
//
// Table has just been created
//
if(columns.cRecord == 0) goto cleanup;
m_JetColumns = new JBColumn[columns.cRecord]; if(m_JetColumns == NULL) { SetLastJetError(JET_errOutOfMemory); goto cleanup; }
SetLastJetError(JET_errSuccess);
//
// TODO - use JBColumn class to retrieve value
//
m_NumJetColumns = columns.cRecord; for(index=0; index < columns.cRecord && IsSuccess() == TRUE; index++) { m_JetColumns[index].AttachToTable(this);
if(m_JetColumns[index].LoadJetColumnInfoFromJet(&columns) == FALSE) { m_JetErr = m_JetColumns[index].GetLastJetError(); break; }
m_JetErr = JetMove( GetJetSessionID(), columns.tableid, JET_MoveNext, 0 );
}
if(GetLastJetError() == JET_errNoCurrentRecord && index >= columns.cRecord) { // otherwise - got to be a JetBlue bug here.
SetLastJetError(JET_errSuccess); }
//
//
//
cleanup:
FreeJBstr(lpszTableName); if(IsSuccess() == FALSE && m_JetColumns) { delete [] m_JetColumns; m_JetColumns = NULL; m_NumJetColumns = 0; }
return IsSuccess(); #else
LPSTR lpszTableName=NULL; JET_COLUMNLIST columns; unsigned long cbMax; JET_RETINFO jetRetInfo; unsigned long cbActual; char lpszColumnName[MAX_JETBLUE_NAME_LENGTH+1]; int NumChars; unsigned long index; SINGLE_JET_CALL;
if(ConvertWstrToJBstr(GetTableName(), &lpszTableName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
memset(&columns, 0, sizeof(columns)); columns.cbStruct = sizeof(JET_COLUMNLIST); cbMax = sizeof(JET_COLUMNLIST);
m_JetErr = JetGetColumnInfo( GetJetSessionID(), GetJetDatabaseID(), lpszTableName, NULL, (PVOID)&columns, cbMax, 1 // retrieve column list
); if(IsSuccess() == FALSE) goto cleanup;
//
// Table has just been created
//
if(columns.cRecord == 0) goto cleanup;
// retrieve column name, column id, column type and column size
m_Columns = (PJetColumns) AllocateMemory(sizeof(JetColumns) * columns.cRecord); if(m_Columns == NULL) { SetLastJetError(JET_errOutOfMemory); goto cleanup; }
SetLastJetError(JET_errSuccess);
//
// TODO - use JBColumn class to retrieve value
//
m_NumColumns = columns.cRecord; for(index=0; index < columns.cRecord && IsSuccess() == TRUE; index++) { memset(&jetRetInfo, 0, sizeof(JET_RETINFO)); jetRetInfo.cbStruct = sizeof(JET_RETINFO);
// retrieve column name
m_JetErr = JetRetrieveColumn( GetJetSessionID(), columns.tableid, columns.columnidcolumnname, lpszColumnName, sizeof(lpszColumnName), &cbActual, 0, &jetRetInfo );
if(IsSuccess() == FALSE) continue;
NumChars = MultiByteToWideChar( GetACP(), MB_PRECOMPOSED, lpszColumnName, cbActual, (m_Columns+index)->pszColumnName, sizeof((m_Columns+index)->pszColumnName) );
if(NumChars == 0) { SetLastJetError(JET_errInvalidParameter); continue; }
memset(&jetRetInfo, 0, sizeof(JET_RETINFO)); jetRetInfo.cbStruct = sizeof(JET_RETINFO);
// retrieve column ID
m_JetErr = JetRetrieveColumn( GetJetSessionID(), columns.tableid, columns.columnidcolumnid, &((m_Columns+index)->colId), sizeof((m_Columns+index)->colId), &cbActual, 0, &jetRetInfo );
if(IsSuccess() == FALSE) continue;
memset(&jetRetInfo, 0, sizeof(JET_RETINFO)); jetRetInfo.cbStruct = sizeof(JET_RETINFO);
m_JetErr = JetRetrieveColumn( GetJetSessionID(), columns.tableid, columns.columnidcoltyp, &((m_Columns+index)->colType), sizeof((m_Columns+index)->colType), &cbActual, 0, &jetRetInfo );
if(IsSuccess() == FALSE) continue;
memset(&jetRetInfo, 0, sizeof(JET_RETINFO)); jetRetInfo.cbStruct = sizeof(JET_RETINFO);
m_JetErr = JetRetrieveColumn( GetJetSessionID(), columns.tableid, columns.columnidcbMax, &((m_Columns+index)->cbMaxLength), sizeof((m_Columns+index)->cbMaxLength), &cbActual, 0, &jetRetInfo );
if(IsSuccess() == FALSE) continue;
memset(&jetRetInfo, 0, sizeof(JET_RETINFO)); jetRetInfo.cbStruct = sizeof(JET_RETINFO);
m_JetErr = JetRetrieveColumn( GetJetSessionID(), columns.tableid, columns.columnidgrbit, &((m_Columns+index)->jbGrbit), sizeof((m_Columns+index)->jbGrbit), &cbActual, 0, &jetRetInfo ); DebugOutput( _TEXT("Loaded Column name %s, Column Type %d, Column ID %d\n"), m_Columns[index].pszColumnName, m_Columns[index].colType, m_Columns[index].colId );
if(IsSuccess() == FALSE) continue;
m_JetErr = JetMove( GetJetSessionID(), columns.tableid, JET_MoveNext, 0 );
}
if(GetLastJetError() == JET_errNoCurrentRecord && index >= columns.cRecord) { // otherwise - got to be a JetBlue bug here.
SetLastJetError(JET_errSuccess); }
//
//
//
cleanup: FreeJBstr(lpszTableName); if(IsSuccess() == FALSE && m_Columns) { FreeMemory(m_Columns); m_Columns = NULL; m_NumColumns = 0; }
return IsSuccess(); #endif
}
//-------------------------------------------------------------
JET_COLUMNID JBTable::GetJetColumnID( LPCTSTR pszColumnName ) /*
*/ { int index;
index = GetJetColumnIndex(pszColumnName); if(index < 0 || index >= m_NumJetColumns) { return (DWORD)JET_NIL_COLUMN; }
return m_JetColumns[index].GetJetColumnID(); }
//-------------------------------------------------------------
int JBTable::GetJetColumnIndex( LPCTSTR pszColumnName ) /*
*/ { if(m_JetColumns == NULL || m_NumJetColumns == 0) { SetLastJetError(JET_errNotInitialized); return -1; }
for(int index=0; index < m_NumJetColumns; index++) { if(_tcsicmp(m_JetColumns[index].GetJetColumnName(), pszColumnName) == 0) break; }
return (index >= m_NumJetColumns) ? -1 : index; }
//-------------------------------------------------------------
JBColumn* JBTable::FindColumnByIndex( const int index ) /*
*/ { if(m_JetColumns == NULL || m_NumJetColumns == 0) { SetLastJetError(JET_errNotInitialized); return NULL; }
if(index < 0 || index >= m_NumJetColumns) { SetLastJetError(JET_errInvalidParameter); return NULL; }
return m_JetColumns+index; }
//--------------------------------------------------------------
JBColumn* JBTable::FindColumnByColumnId( const JET_COLUMNID JetColId ) /*
*/ { if(m_JetColumns == NULL || m_NumJetColumns == 0) { SetLastJetError(JET_errNotInitialized); return NULL; }
for(int index=0; index < m_NumJetColumns; index++) { if(m_JetColumns[index].GetJetColumnID() == JetColId) break; }
return FindColumnByIndex( index ); }
//--------------------------------------------------------------
JBColumn* JBTable::FindColumnByName( LPCTSTR pszColumnName ) /*
*/ { return FindColumnByIndex(GetJetColumnIndex(pszColumnName)); }
//--------------------------------------------------------------
BOOL JBTable::BeginUpdate( BOOL bUpdate /* false */ ) /*
*/ { if(GetTransactionLevel() == 0) { SetLastJetError(JET_errNotInTransaction); JB_ASSERT(FALSE); return FALSE; }
SINGLE_JET_CALL;
m_JetErr = JetPrepareUpdate( GetJetSessionID(), GetJetTableID(), (bUpdate) ? JET_prepReplace : JET_prepInsert );
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::EndUpdate( BOOL bDisacrd /* FALSE */ ) /*
*/ { BYTE pBookmark[JET_cbBookmarkMost+1]; DWORD cbActual = 0;
SINGLE_JET_CALL;
//
// Hack for work item table.
//
m_JetErr = JetUpdate( GetJetSessionID(), GetJetTableID(), pBookmark, JET_cbBookmarkMost, &cbActual );
if(IsSuccess() && m_InsertRepositionBookmark) { GotoBookmark(pBookmark, cbActual); }
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::SetCurrentIndex( LPCTSTR pszIndexName, JET_GRBIT grbit /* JET_bitMoveFirst */ ) /*++
--*/ { if(IsValid() == FALSE || m_InEnumeration == TRUE) { SetLastJetError(JET_errNotInitialized); return FALSE; }
//
// Can't be in enumeration and and try to set index
//
JB_ASSERT(m_InEnumeration == FALSE);
char* lpszIndexName=NULL;
if(ConvertWstrToJBstr(pszIndexName, &lpszIndexName) == FALSE) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
{ SINGLE_JET_CALL;
m_JetErr = JetSetCurrentIndex2( GetJetSessionID(), GetJetTableID(), lpszIndexName, grbit ); }
if(IsSuccess()) { m_InEnumeration = TRUE; }
cleanup:
FreeJBstr(lpszIndexName); return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::EnumBegin( LPCTSTR pszIndexName, JET_GRBIT grbit /* JET_bitMoveFirst */ ) /*
*/ { if(m_InEnumeration == TRUE) { //
// Force terminate enumeration
//
EnumEnd(); }
return SetCurrentIndex(pszIndexName, grbit); }
//-------------------------------------------------------------
JBTable::ENUM_RETCODE JBTable::EnumNext( JET_GRBIT crow /* JET_MoveNext */, JET_GRBIT grbit /* 0 */ ) /*
*/ { if(m_InEnumeration == FALSE) { SetLastJetError(JET_errInvalidParameter); return ENUM_ERROR; }
if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); return ENUM_ERROR; }
ENUM_RETCODE retCode = ENUM_CONTINUE;
while( retCode == ENUM_CONTINUE ) { MoveToRecord(crow, grbit);
switch(m_JetErr) { case JET_errSuccess: retCode = ENUM_SUCCESS; break;
case JET_errNoCurrentRecord: retCode = ENUM_END; break;
case JET_errRecordDeleted: retCode = ENUM_CONTINUE; break;
default: retCode = ENUM_ERROR; } }
return retCode; }
//-------------------------------------------------------------
BOOL JBTable::SeekToKey( JBKeyBase* key, DWORD dwSeachParam, JET_GRBIT jetseekgrbit /* =JET_bitSeekGE */ ) /*
*/ { if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); return FALSE; }
#ifdef DEBUG_SEEK
LPTSTR szKey=key->GetIndexKey(); #endif
EnumBegin( key->GetIndexName(), JET_bitMoveFirst );
if(IsSuccess() == FALSE) return FALSE;
if(key->IsEmptyValue() == TRUE) { return TRUE; }
PVOID pbData; unsigned long cbData; JET_GRBIT key_grbit=JET_bitNewKey;
SetLastJetError(JET_errSuccess);
for(DWORD dwComponent=0; dwComponent < key->GetNumKeyComponents(); dwComponent++) { if(key->GetSearchKey(dwComponent, &pbData, &cbData, &key_grbit, dwSeachParam) == FALSE) break;
if(MakeKey(pbData, cbData, key_grbit) == FALSE) break; }
#ifdef DEBUG_SEEK
PVOID pb=NULL; DWORD cb=0; unsigned long actual;
SINGLE_JET_CALL;
m_JetErr = JetRetrieveKey( GetJetSessionID(), GetJetTableID(), pb, cb, &actual, 0 );
pb = (PVOID)AllocateMemory(actual); cb = actual;
m_JetErr = JetRetrieveKey( GetJetSessionID(), GetJetTableID(), pb, cb, &actual, 0 );
FreeMemory(pb); #endif
return IsSuccess() ? SeekValue(jetseekgrbit) : FALSE; }
//-------------------------------------------------------------
BOOL JBTable::EnumBegin( JBKeyBase* key, DWORD dwSearchParam ) /*
*/ { if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); return FALSE; }
if(m_InEnumeration == TRUE) { // what do we do???
}
return SeekToKey(key, dwSearchParam); }
//-------------------------------------------------------------
BOOL JBTable::GetCurrentIndex( LPTSTR pszIndexName, unsigned long* bufferSize ) /*
*/ { char lpszIndexName[MAX_JETBLUE_NAME_LENGTH+1]; int NumChars=0;
SINGLE_JET_CALL;
m_JetErr = JetGetCurrentIndex( GetJetSessionID(), GetJetTableID(), lpszIndexName, sizeof(lpszIndexName) );
if(IsSuccess() == FALSE) goto cleanup;
NumChars = MultiByteToWideChar( GetACP(), MB_PRECOMPOSED, lpszIndexName, -1, pszIndexName, *bufferSize );
if(NumChars == 0) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
*bufferSize = NumChars;
cleanup:
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::GetBookmark( PVOID pbBuffer, PDWORD pcbBufSize ) /*++
--*/ { DWORD cbBufferSize = *pcbBufSize;
SINGLE_JET_CALL;
m_JetErr = JetGetBookmark( GetJetSessionID(), GetJetTableID(), pbBuffer, cbBufferSize, pcbBufSize );
if(m_JetErr == JET_errBufferTooSmall) { SetLastJetError(m_JetErr); SetLastError(ERROR_INSUFFICIENT_BUFFER); }
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::GotoBookmark( PVOID pbBuffer, DWORD cbBuffer ) /*++
--*/ { SINGLE_JET_CALL;
m_JetErr = JetGotoBookmark( GetJetSessionID(), GetJetTableID(), pbBuffer, cbBuffer );
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::ReadLock() { SINGLE_JET_CALL;
m_JetErr = JetGetLock( GetJetSessionID(), GetJetTableID(), JET_bitReadLock );
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::WriteLock() { SINGLE_JET_CALL;
m_JetErr = JetGetLock( GetJetSessionID(), GetJetTableID(), JET_bitWriteLock );
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::RetrieveKey( PVOID pbData, unsigned long cbData, unsigned long* pcbActual, JET_GRBIT grbit ) /*
*/ { unsigned long cbActual; SINGLE_JET_CALL;
m_JetErr = JetRetrieveKey( GetJetSessionID(), GetJetTableID(), pbData, cbData, (pcbActual) ? pcbActual : &cbActual, grbit // user2.doc - unuse.
); return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::MoveToRecord( long crow, JET_GRBIT grbit ) /*
*/ { SINGLE_JET_CALL; m_JetErr = JetMove( GetJetSessionID(), GetJetTableID(), crow, grbit );
return IsSuccess(); }
//-------------------------------------------------------------
unsigned long JBTable::GetIndexRecordCount( unsigned long max ) /*
*/ { unsigned long count; SINGLE_JET_CALL;
m_JetErr = JetIndexRecordCount( GetJetSessionID(), GetJetTableID(), &count, max );
return IsSuccess() ? count : 0; }
//-------------------------------------------------------------
BOOL JBTable::MakeKey( PVOID pbData, unsigned long cbData, JET_GRBIT grbit ) /*
*/ { SINGLE_JET_CALL;
m_JetErr = JetMakeKey( GetJetSessionID(), GetJetTableID(), pbData, cbData, grbit );
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::SeekValue( JET_GRBIT grbit ) /*
*/ { SINGLE_JET_CALL;
m_JetErr = JetSeek( GetJetSessionID(), GetJetTableID(), grbit );
return IsSuccess(); }
//-------------------------------------------------------------
BOOL JBTable::DeleteRecord() /*
*/ { SINGLE_JET_CALL;
// must have current record set
m_JetErr = JetDelete( GetJetSessionID(), GetJetTableID() );
return IsSuccess(); }
//
//////////////////////////////////////////////////////////////
//
CLASS_PRIVATE void JBColumn::Cleanup() /*
*/ { memset(m_szColumnName, 0, sizeof(m_szColumnName)); }
//-----------------------------------------------------------
JBColumn::JBColumn(JBTable* pJetTable) : m_pJetTable(pJetTable), m_JetColId(0), m_JetColType(JET_coltypNil), m_JetMaxColLength(0), m_JetGrbit(0), m_JetColCodePage(TLS_JETBLUE_COLUMN_CODE_PAGE), m_JetColCountryCode(TLS_JETBLUE_COLUMN_COUNTRY_CODE), m_JetColLangId(TLS_JETBLUE_COLUMN_LANGID), m_cbActual(0), m_pbDefValue(NULL), m_cbDefValue(0), m_JetNullColumn(FALSE) /*
*/ { Cleanup(); }
//-----------------------------------------------------------
CLASS_PRIVATE JET_ERR JBColumn::RetrieveColumnValue( IN JET_SESID sesid, IN JET_TABLEID tableid, IN JET_COLUMNID columnid, IN OUT PVOID pbBuffer, IN unsigned long cbBuffer, IN unsigned long offset ) /*
*/ { m_JetRetInfo.cbStruct = sizeof(m_JetRetInfo); m_JetRetInfo.ibLongValue = offset; m_JetNullColumn = FALSE; m_cbActual = 0;
SINGLE_JET_CALL;
//
// JETBLUE bug??? passing zeror buffer size returns Column NULL
//
m_JetErr = JetRetrieveColumn( sesid, tableid, columnid, pbBuffer, cbBuffer, &m_cbActual, 0, NULL // &m_JetRetInfo
);
if(m_JetErr == JET_wrnColumnNull) m_JetNullColumn = TRUE;
return IsSuccess(); }
//-----------------------------------------------------------
CLASS_PRIVATE BOOL JBColumn::LoadJetColumnInfoFromJet( const JET_COLUMNLIST* pColumnList ) /*
*/ { char lpszColumnName[MAX_JETBLUE_NAME_LENGTH+1]; int NumChars;
//
// retrieve column name
//
RetrieveColumnValue( GetJetSessionID(), pColumnList->tableid, pColumnList->columnidcolumnname, lpszColumnName, sizeof(lpszColumnName) );
if(IsSuccess() == FALSE) goto cleanup;
NumChars = MultiByteToWideChar( GetACP(), MB_PRECOMPOSED, lpszColumnName, m_cbActual, m_szColumnName, sizeof(m_szColumnName)/sizeof(m_szColumnName[0]) );
if(NumChars == 0) { SetLastJetError(JET_errInvalidParameter); goto cleanup; }
//DebugOutput(
// _TEXT("Load column %s"),
// m_szColumnName
// );
//
// retrieve column ID
//
RetrieveColumnValue( GetJetSessionID(), pColumnList->tableid, pColumnList->columnidcolumnid, &m_JetColId, sizeof(m_JetColId) );
if(IsSuccess() == FALSE) goto cleanup;
//DebugOutput(
// _TEXT("\tColId - %d"),
// m_JetColId
// );
//
// Retrieve Column Type
//
RetrieveColumnValue( GetJetSessionID(), pColumnList->tableid, pColumnList->columnidcoltyp, &m_JetColType, sizeof(m_JetColType) );
if(IsSuccess() == FALSE) goto cleanup;
//DebugOutput(
// _TEXT("\tCol Type %d"),
// m_JetColType
// );
//
// Retrieve Max. length for LongText and Long Binary
//
RetrieveColumnValue( GetJetSessionID(), pColumnList->tableid, pColumnList->columnidcbMax, &m_JetMaxColLength, sizeof(m_JetMaxColLength) );
if(IsSuccess() == FALSE) goto cleanup;
//DebugOutput(
// _TEXT("\tMax Col Length %d"),
// m_JetMaxColLength
// );
//
// Retrieve Column Grbit
//
RetrieveColumnValue( GetJetSessionID(), pColumnList->tableid, pColumnList->columnidgrbit, &m_JetGrbit, sizeof(m_JetGrbit) );
if(IsSuccess() == FALSE) goto cleanup;
//DebugOutput(
// _TEXT("\tCol grbit %d"),
// m_JetGrbit
// );
cleanup:
//DebugOutput(
// _TEXT("\n")
// );
return IsSuccess(); }
//-----------------------------------------------------------
BOOL JBColumn::IsValid() const /*
*/ { return m_pJetTable != NULL && m_pJetTable->IsValid(); }
//-----------------------------------------------------------
BOOL JBColumn::InsertColumn( PVOID pbData, unsigned long cbData, unsigned long offset ) /*
*/ { //JET_SETINFO setinfo;
if(IsValid() == FALSE) { SetLastJetError(JET_errInvalidParameter); return IsSuccess(); }
SINGLE_JET_CALL;
// if(GetJetColumnType() == JET_coltypLongText || GetJetColumnType() == JET_coltypLongBinary)
if(pbData == NULL || cbData == 0) { m_JetErr = JetSetColumn( GetJetSessionID(), GetJetTableID(), GetJetColumnID(), 0, 0, JET_bitSetZeroLength, NULL );
if(IsSuccess() == FALSE) return FALSE;
m_JetErr = JetSetColumn( GetJetSessionID(), GetJetTableID(), GetJetColumnID(), 0, 0, 0, NULL );
if(IsSuccess() == FALSE) return FALSE; }
m_JetErr = JetSetColumn( GetJetSessionID(), GetJetTableID(), GetJetColumnID(), pbData, cbData, 0, NULL );
return IsSuccess(); }
//-----------------------------------------------------------
BOOL JBColumn::FetchColumn( PVOID pbData, unsigned long cbData, unsigned long starting_offset ) /*
pass NULL and 0 to determine buffer size needed. */ { if(IsValid() == FALSE) { SetLastJetError(JET_errNotInitialized); } else { RetrieveColumnValue( GetJetSessionID(), GetJetTableID(), GetJetColumnID(), pbData, cbData, starting_offset ); }
return IsSuccess(); }
|