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 + -
显示快捷键?