childfrm.cpp
来自「FastDb是高效的内存数据库系统」· C++ 代码 · 共 1,423 行 · 第 1/3 页
CPP
1,423 行
// prepare database query for selecting whole table
query.Format(PLAIN_SQL_SELECT, m_dbTable.c_str(), m_queryCond.c_str());
try
{
statement= cli_prepare_query(m_dbHandle, query);
// if query fails close view
if (statement <=0)
{
PostMessage(WM_CLOSE, 0,0);
return;
}
// execute query
memset(m_buffer, 0, m_bufferSize);
r= cli_execute_query(statement, 0, m_buffer);
if (r>0) // if any rows in query result
{
j=0; // row counter
// iterate query result rows
cli_get_first(statement);
do
{
// set first column to oid
int id= cli_get_oid(statement);
value.Format("#%04X", id);
m_view.InsertItem(j, value);
// also mark list row with oid for easier reference
m_view.SetItemData(j, id);
// fill all columns
for (i= 0; i< m_fieldCnt; i++)
{
GetItemValue(value, &m_fieldDefs[i], m_buffer);
m_view.SetItemText(j, i+1, value);
}
++j;
}
while (cli_get_next(statement) >=0);
}
cli_free(statement);
cli_commit(m_dbHandle);
}
catch (dbException exc)
{
MessageBox(exc.getMsg(), APP_NAME, MB_OK|MB_ICONEXCLAMATION);
PostMessage(WM_CLOSE, 0,0);
}
}
void CChildFrame::CreateDataView()
{
// set table content view caption
CStdString title;
title.Format("Table data: %s.%s", m_dbName.c_str(), m_dbTable.c_str());
SetWindowText(title);
// first column always shows object id
m_view.AddColumn("Oid", 0);
m_view.SetColumnWidth(0, 50);
// get record structure and create record buffer
if (!GetFieldDefs(m_dbTable, m_fieldCnt, m_bufferSize, m_fieldDefs, true))
{
PostMessage(WM_CLOSE, 0,0);
return;
}
m_buffer= new char[m_bufferSize];
// fill table content
RefreshTableData();
}
void CChildFrame::RefreshArrayData()
{
CStdString query, value, handle;
m_view.DeleteAllItems();
try
{
query.Format(PLAIN_SQL_SELECT, m_dbTable.c_str(), "current= %p");
int i, statement;
statement= cli_prepare_query(m_dbHandle, query);
memset(m_buffer, 0, m_bufferSize);
// query successfull?
if (statement >=0 && m_buffer && cli_execute_query(statement, 0, m_buffer, m_currentOid)>0)
{
// seek current record
int r= cli_seek(statement, m_currentOid);
if (r>=0) // record found?
{
// get array field content
cli_array_t arr= *(cli_array_t*)(m_buffer+ m_currentField.ofs);
// iterate array
for (i=0; i< arr.size; ++i)
{
// convert element content to string
switch (m_currentField.type)
{
case cli_array_of_oid:
value.Format("#%04X", ((cli_oid_t*)arr.data)[i]);
break;
case cli_array_of_bool:
value.Format("%s", ((cli_bool_t*)arr.data)[i] ? "true":"false");
break;
case cli_array_of_int1:
value.Format("%d", ((cli_int1_t*)arr.data)[i]);
break;
case cli_array_of_int2:
value.Format("%d", ((cli_int2_t*)arr.data)[i]);
break;
case cli_array_of_int4:
value.Format("%d", ((cli_int4_t*)arr.data)[i]);
break;
case cli_array_of_int8:
value.Format("%d", ((cli_int8_t*)arr.data)[i]);
break;
case cli_array_of_real4:
{
float x= ((cli_real4_t*)arr.data)[i];
value.Format("%g", x);
}
break;
case cli_array_of_real8:
value.Format("%g", ((cli_real8_t*)arr.data)[i]);
break;
case cli_array_of_string:
{
char *s= ((char**)arr.data)[i];
value.Format("%s", s);
}
break;
}
// insert element into list
m_view.InsertItem(i, value);
}
}
}
cli_free(statement);
cli_commit(m_dbHandle);
}
catch (dbException exc)
{
MessageBox(exc.getMsg(), APP_NAME, MB_OK|MB_ICONEXCLAMATION);
PostMessage(WM_CLOSE, 0,0);
}
}
void CChildFrame::CreateArrayView()
{
CStdString title;
// set array content view caption
title.Format("Array data: %s.%s[#%04X]", m_dbName.c_str(), m_dbTable.c_str(), m_currentOid);
SetWindowText(title);
// set field name as sole column title
m_view.AddColumn(m_currentField.name, 0,0);
m_view.SetColumnWidth(0,200);
// create record buffer;
m_buffer= new char[m_bufferSize];
RefreshArrayData();
}
void CChildFrame::RefreshRecordData()
{
CStdString query, value;
int statement;
try
{
query.Format(PLAIN_SQL_SELECT, m_dbTable.c_str(), "current= %p");
statement= cli_prepare_query(m_dbHandle, query);
memset(m_buffer, 0, m_bufferSize);
// query successfull?
if (statement >=0 && m_buffer && cli_execute_query(statement, 0, m_buffer, m_currentOid)>0)
{
// seek current record
int r= cli_seek(statement, m_currentOid);
if (r>=0)
{
m_view.DeleteAllItems();
// iterate record fields
for (int i=0; i<m_fieldCnt; ++i)
{
m_view.InsertItem(i, m_fieldDefs[i].name);
GetItemValue(value, &m_fieldDefs[i], m_buffer);
m_view.SetItemText(i, 1, value);
}
}
}
cli_free(statement);
cli_commit(m_dbHandle);
}
catch (dbException exc)
{
MessageBox(exc.getMsg(), APP_NAME, MB_OK|MB_ICONEXCLAMATION);
PostMessage(WM_CLOSE, 0,0);
}
}
void CChildFrame::CreateRecordView()
{
CStdString title;
// set detail view caption
title.Format("Record data: %s.%s[#%04X]", m_dbName.c_str(), m_dbTable.c_str(), m_currentOid);
SetWindowText(title);
// set column titles
m_view.AddColumn("Field", 0);
m_view.SetColumnWidth(0,100);
m_view.AddColumn("Value", 1);
m_view.SetColumnWidth(1,300);
GetFieldDefs(m_dbTable, m_fieldCnt, m_bufferSize, m_fieldDefs, false);
// create record buffer;
m_buffer= new char[m_bufferSize];
RefreshRecordData();
}
LRESULT CChildFrame::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
m_allViews.push_back(this);
m_mdiClient= m_hWndMDIClient;
// create list view for showing content
m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN
| LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL,
WS_EX_CLIENTEDGE);
// extend list view with grid lines, moveable columns and one click activation
m_view.SetExtendedListViewStyle(LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP
|LVS_EX_GRIDLINES|LVS_EX_ONECLICKACTIVATE);
// for detail view create edit field and combobox
if (m_vt== eRecordView)
{
CRect rc(CPoint(0,0), CSize(100,10));
m_fieldEdit.Create(m_view, rc, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |WS_BORDER);
m_fieldEdit.SetFont(m_view.GetFont());
m_refSelector.Create(m_view, rc, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |WS_BORDER
| CBS_DROPDOWNLIST | CBS_SORT);
m_refSelector.SetFont(m_view.GetFont());
}
// remove (potential) file extension from database name
int pos= m_dbName.Find('.');
if (pos!= -1)
{
m_dbName= m_dbName.Left(pos);
}
// create view
switch(m_vt)
{
case eDbView:
CreateDbView();
break;
case eSchemaView:
CreateTableView();
break;
case eDataView:
CreateDataView();
break;
case eArrayView:
CreateArrayView();
break;
case eRecordView:
CreateRecordView();
break;
default:
PostMessage(WM_CLOSE, 0,0);
break;
}
bHandled = FALSE;
return 1;
}
LRESULT CChildFrame::OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/)
{
LPMSG pMsg = (LPMSG)lParam;
if(CMDIChildWindowImpl<CChildFrame>::PreTranslateMessage(pMsg))
return TRUE;
return m_view.PreTranslateMessage(pMsg);
}
LRESULT CChildFrame::OnActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
m_currentDB= m_dbHandle;
return 0;
}
void CChildFrame::Init(CChildFrame* pChild, EViewType vt)
{
pChild->m_bufferSize= m_bufferSize;
pChild->m_vt= vt;
pChild->m_fieldDefs= m_fieldDefs;
pChild->m_fieldCnt= m_fieldCnt;
pChild->m_queryCond= m_queryCond;
}
LRESULT CChildFrame::OnItemRClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
CMenu menu;
CMenu menuTrackPopup; // shortcut menu
NMITEMACTIVATE& ia= *(NMITEMACTIVATE*)pnmh;
if (!s_editing)
return 0;
if (!menu.LoadMenu(IDR_CONTEXT))
return 0;
switch (m_vt)
{
case eDataView:
menuTrackPopup = menu.GetSubMenu(0);
break;
case eRecordView:
menuTrackPopup = menu.GetSubMenu(1);
break;
case eArrayView:
menuTrackPopup = menu.GetSubMenu(2);
break;
default:
return 0;
}
CPoint pt(ia.ptAction);
ClientToScreen(&pt);
menuTrackPopup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
pt.x, pt.y, m_hWnd);
return 0;
}
LRESULT CChildFrame::OnSave(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
EndEdit(true);
return 0;
}
LRESULT CChildFrame::OnNewRecord(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
AddNewRecord();
return 0;
}
LRESULT CChildFrame::OnDeleteRecord(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
DeleteSelectedRecord();
return 0;
}
LRESULT CChildFrame::OnItemActivated(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled)
{
NMITEMACTIVATE& ia= *(NMITEMACTIVATE*)pnmh;
CChildFrame* pChild=0;
TFieldDef* field;
// get caption of selected item/subitem
CString item;
m_view.GetItemText(ia.iItem, ia.iSubItem, item);
if (s_editing && m_vt== eRecordView && ia.iSubItem==1)
{
CRect rc;
field= &m_fieldDefs[ia.iItem];
if (ia.iItem!= m_currentEdit && field->type >=cli_oid && field->type < cli_pasciiz)
{
if (HasChanged())
{
//int r= (MessageBox("Item data has changed. Save data?", APP_NAME, MB_YESNO|MB_ICONQUESTION)== IDYES) ? 1:0;
//if (r)
UpdateField();
m_dbWindow.SendMessage(WM_REFRESH_DATA, 1, 0);
}
m_currentEdit= ia.iItem;
m_view.GetItemRect(ia.iItem, rc, LVIR_BOUNDS);
rc.left= m_view.GetColumnWidth(0);
if (field->type==cli_oid)
{
FillList(field->refTable);
m_fieldEdit.ShowWindow(SW_HIDE);
m_refSelector.SetWindowPos(HWND_TOP, rc.left, rc.top, rc.Width(), rc.Height(), SWP_SHOWWINDOW);
m_refSelector.SelectString(0,item);
}
else
{
m_refSelector.ShowWindow(SW_HIDE);
m_fieldEdit.SetWindowPos(HWND_TOP, rc.left, rc.top, rc.Width(), rc.Height(), SWP_SHOWWINDOW);
m_fieldEdit.SetWindowText(item);
}
}
}
else if (!item.IsEmpty() && item[0]=='#') // assume object id was clicked
{
CStdString table= m_dbTable;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?