📄 dbfunc.c
字号:
// FUNCTION: ShowPropDesc(CEPROPID PropId, TCHAR * pDBName, LONG dwCurrectRecord )
//
// PURPOSE: Display database property information in edit control
//
// PARAMETERS:
//
// RETURN VALUE:
//
// COMMENTS:
//
void WINAPI ShowPropDesc(CEPROPID PropId, DWORD dwOpenHandle, LONG dwCurrentRecord)
{
TCHAR szBuf[200];
WORD cPropID = 1;
LPBYTE bData = NULL;
DWORD cbData = 0;
SYSTEMTIME SystemTime;
CEOID CeOID = 0;
DWORD dwIndex;
if ( (HANDLE) dwOpenHandle == INVALID_HANDLE_VALUE)
{
wsprintf(szBuf, TEXT("ERROR: CeOpenDatabase failed to open database.(Error: %ld)\r\n"), GetLastError());
OutputDebugString(szBuf);
MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
}
else
{
if ( dwCurrentRecord == -1 )
{
if ( !CeSeekDatabase((HANDLE) dwOpenHandle, CEDB_SEEK_CURRENT, 0, &dwIndex) )
{
dwIndex = 0;
wsprintf(szBuf, TEXT("ERROR: CeSeekDatabase failed to get record index.(Error: %ld)\r\n"), GetLastError());
OutputDebugString(szBuf);
MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM) (LPTSTR) TEXT(""));
return;
}
}
else
dwIndex = dwCurrentRecord;
// check for eof by reading after a seek failure
if( !CeReadRecordProps((HANDLE)dwOpenHandle, CEDB_ALLOWREALLOC, &cPropID,&PropId,&bData,&cbData) )
{
DWORD dwError;
if ( (dwError=GetLastError()) != ERROR_NO_MORE_ITEMS )
{
wsprintf(szBuf, TEXT("ERROR: CeReadRecordProps failed to read database.(Error: %ld)\r\n"), dwError);
OutputDebugString(szBuf);
MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM) (LPTSTR) TEXT(""));
}
else
SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM) (LPTSTR) TEXT("End-OF-File"));
return;
}
}
if( bData == NULL )
{
wsprintf(szBuf, TEXT("ERROR: CeReadRecordProps failed to read database.(Error: %ld)\r\n"), GetLastError());
MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OKCANCEL );
OutputDebugString(szBuf);
return;
}
switch(TypeFromPropID(PropId))
{
case CEVT_I2:
wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Short\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.iVal: 0) ;
break;
case CEVT_UI2:
wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Unsigned Short\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.uiVal: 0) ;
break;
case CEVT_I4:
wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Long\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.lVal: 0) ;
break;
case CEVT_UI4:
wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: Unsigned Long\r\nDATA:\r\n%d"), dwIndex, bData?((PCEPROPVAL) bData)->val.ulVal: 0) ;
break;
case CEVT_FILETIME:
if ( bData != NULL )
{
FileTimeToSystemTime(&(((PCEPROPVAL) bData)->val.filetime), &SystemTime);
wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: File Time\r\nDATA:\r\nYear:%d\r\nMonth:%d\r\n"
TEXT("Day:%d\r\nDay of Week:%d\r\nHour:%d\r\nMinute:%d\r\nSecond:%d\r\nMilliseconds:%d")),
dwIndex, SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay, SystemTime.wDayOfWeek,
SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds) ;
}
else
wsprintf(szBuf,TEXT("Record: %ld\r\nProperty: File Time"), dwIndex);
break;
case CEVT_LPWSTR:
wsprintf(szBuf, TEXT("Record: %ld\r\nProperty: String\r\nDATA:\r\n%-70s"), dwIndex,
bData?((PCEPROPVAL) bData)->val.lpwstr: NULL) ;
if ( bData && lstrlen(((PCEPROPVAL) bData)->val.lpwstr) > 70 )
lstrcat(szBuf, TEXT("..."));
break;
case CEVT_BLOB:
{
DWORD dwMaxShow = 15;
TCHAR szTempBuf[6];
DWORD i;
wsprintf(szBuf,TEXT("Record: %ld\r\nProperty: BLOB\r\nDATA:\r\n"), dwIndex);
if( bData )
{
dwMaxShow = min(dwMaxShow, ((PCEPROPVAL) bData)->val.blob.dwCount);
for (i = 0; i < dwMaxShow; i++)
{
wsprintf (szTempBuf, TEXT("%#2x,"), (BYTE)((PCEPROPVAL) bData)->val.blob.lpb[i]);
lstrcat (szBuf, szTempBuf);
}
if (dwMaxShow < ((PCEPROPVAL) bData)->val.blob.dwCount )
lstrcat (szBuf, TEXT("..."));
}
break;
}
default:
wsprintf(szBuf, TEXT("Record: %ld\r\nUnknown record property"),dwIndex);
break;
}
if ( bData )
LocalFree(bData);
SendMessage(hwndEdit,WM_SETTEXT, 0, (LPARAM)(LPCTSTR)szBuf);
}
void WINAPI AddRecToCurrentDB(HWND hwnd)
{
HWND hwndTV;
HWND hParent;
HTREEITEM hItem;
TCHAR szDBName[CEDB_MAXDBASENAMELEN];
TV_ITEM tvCurrent = {0};
if( (hParent = GetParent(hwnd) ) )
hwndTV = GetDlgItem(hParent, IDC_TREEVIEW);
else
hwndTV = GetDlgItem(hwnd, IDC_TREEVIEW);
if( (hItem = TreeView_GetSelection( hwndTV )) )
{
tvCurrent.hItem = hItem;
tvCurrent.mask |= (TVIF_TEXT|TVIF_PARAM);
tvCurrent.pszText = szDBName;
tvCurrent.cchTextMax = CEDB_MAXDBASENAMELEN;
if (!TreeView_GetItem(hwndTV, &tvCurrent))
OutputDebugString(TEXT("ERROR: Database Deletion failed.\r\n"));
else
{
if ( _tcsstr( szDBName, TEXT("_TEST") ) && (HANDLE) tvCurrent.lParam != INVALID_HANDLE_VALUE)
{
int nRet;
INSERTSTRUCT NewRecord;
if ( (nRet=DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_NEWRECORD), hwnd,
(DLGPROC)AddRecDlgProc,(LPARAM)&NewRecord)) != -1)
{
if( nRet == IDOK)
{
CEPROPVAL NewRecProps[7];
SYSTEMTIME SystemTime;
FILETIME FileTime;
NewRecProps[0].propid = PROP_SHORT;
NewRecProps[0].wLenData = 0;
NewRecProps[0].wFlags = 0;
NewRecProps[0].val.iVal = NewRecord.shNumber;
NewRecProps[1].propid = PROP_USHORT;
NewRecProps[1].wLenData = 0;
NewRecProps[1].wFlags = 0;
NewRecProps[1].val.uiVal = NewRecord.ushNumber;
NewRecProps[2].propid = PROP_LONG;
NewRecProps[2].wLenData = 0;
NewRecProps[2].wFlags = 0;
NewRecProps[2].val.lVal = NewRecord.lNumber;
NewRecProps[3].propid = PROP_ULONG;
NewRecProps[3].wLenData = 0;
NewRecProps[3].wFlags = 0;
NewRecProps[3].val.ulVal = NewRecord.ulNumber;
GetSystemTime(&SystemTime );
SystemTimeToFileTime(&SystemTime,&FileTime);
NewRecProps[4].propid = PROP_FILETIME;
NewRecProps[4].wLenData = 0;
NewRecProps[4].wFlags = 0;
NewRecProps[4].val.filetime = FileTime;
NewRecProps[5].propid = PROP_LPWSTR;
NewRecProps[5].wLenData = 0;
NewRecProps[5].wFlags = 0;
NewRecProps[5].val.lpwstr = NewRecord.pString;
NewRecProps[6].propid = PROP_CEBLOB;
NewRecProps[6].wLenData = 0;
NewRecProps[6].wFlags = 0;
NewRecProps[6].val.blob.dwCount = NewRecord.cbBlob;
NewRecProps[6].val.blob.lpb = NewRecord.pBlob;
if( !CeWriteRecordProps((HANDLE) tvCurrent.lParam, 0, 7, NewRecProps) )
{
TCHAR szError[50];
wsprintf(szError, TEXT("ERROR: CeWriteRecordProps failed (%ld)"), GetLastError());
MessageBox(hwnd, szError, TEXT("ERROR"), MB_OKCANCEL );
OutputDebugString(szError);
}
if( NewRecord.pBlob)
LocalFree(NewRecord.pBlob);
if( NewRecord.pString)
LocalFree(NewRecord.pString);
}
}
}
else
{
TCHAR szError[50];
wsprintf(szError, TEXT("Can not modify this database."));
MessageBox(hwnd, szError, TEXT("DBView"), MB_OKCANCEL);
}
}
}
else // database property
OutputDebugString(TEXT("Deleting currently selected DB.\r\n"));
}
//
// FUNCTION: DeleteCurrentDB(HWND hwnd)
//
// PURPOSE: Delete the currently selected Database
//
// PARAMETERS:
//
// RETURN VALUE:
//
// COMMENTS:
//
void WINAPI DeleteCurrentDB(HWND hwnd)
{
HWND hwndTV;
HWND hParent;
HTREEITEM hItem;
TCHAR szDBName[CEDB_MAXDBASENAMELEN];
TCHAR szBuf[200];
TV_ITEM tvCurrent = {0};
if( (hParent = GetParent(hwnd) ) )
hwndTV = GetDlgItem(hParent, IDC_TREEVIEW);
else
hwndTV = GetDlgItem(hwnd, IDC_TREEVIEW);
if( (hItem = TreeView_GetSelection( hwndTV )) )
{
//memset(&tvCurrent, 0, sizeof(TV_ITEM));
tvCurrent.hItem = hItem;
tvCurrent.mask |= (TVIF_TEXT|TVIF_PARAM);
tvCurrent.pszText = szDBName;
tvCurrent.cchTextMax = CEDB_MAXDBASENAMELEN;
if (!TreeView_GetItem(hwndTV, &tvCurrent))
OutputDebugString(TEXT("ERROR: Database Deletion failed.\r\n"));
else
{
if ( _tcsstr( szDBName, TEXT("_TEST") ) )
{
HANDLE hNewDB;
CEOID CeOid = (CEOID)NULL;
wsprintf(szBuf, TEXT("Delete Database: %s"), szDBName);
if ( MessageBox(hwnd, szBuf, TEXT("Delete Database"), MB_YESNO) == IDYES )
{
// Try to open DB and get ID required for deletion
hNewDB = CeOpenDatabase(&CeOid, szDBName, 0, 0, NULL);
if ( hNewDB == INVALID_HANDLE_VALUE)
{
TCHAR szError[50];
wsprintf(szError, TEXT("ERROR: CeOpenDatabase failed after creating DB (%ld)"), GetLastError());
MessageBox(hwnd, szError, TEXT("ERROR"), MB_OKCANCEL );
OutputDebugString(szError);
}
else
{
// close 2 DB before deleting
// 1) used to get ID
// 2) used current record stuff
if ( CloseHandle(hNewDB) && CloseHandle((HANDLE) tvCurrent.lParam))
{
if ( !CeDeleteDatabase(CeOid) )
{
wsprintf(szBuf, TEXT("ERROR: CeDeleteDatabase failed with error: %ld\r\n"), GetLastError());
MessageBox(hwnd, szBuf, TEXT("ERROR"), MB_OKCANCEL );
OutputDebugString(szBuf);
}
else
TreeView_DeleteItem(hwndTV, hItem);
}
else
{
wsprintf(szBuf, TEXT("ERROR: CloseHandle failed with error: %ld\r\n"), GetLastError());
MessageBox(hwnd, szBuf, TEXT("ERROR"), MB_OKCANCEL );
OutputDebugString(szBuf);
}
}
}
}
else
MessageBox(hwndTV, TEXT("Selected Database not created by test program."), TEXT("Invalid Database"), MB_OKCANCEL );
}
}
else // database property
OutputDebugString(TEXT("Deleting currently selected DB.\r\n"));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -