📄 xkdbmsview.cpp
字号:
if(!pEngine_->CreateRelation(tablename_, fieldname_, attrtype_, iskey_, count_))
{
for(size_t k = 0; k < count_; k++)
if(fieldname_[k])
delete[] fieldname_[k];
delete[] tablename_;
return;
}
m_iskeyword.EnableWindow(TRUE);
m_iskeyword.SetCheck(0);
m_field.SetWindowText("");
m_newtablename.SetWindowText("");
Vector<char*> vec_;
//清空原来的内容
m_tableset.ResetContent();
pEngine_->GetAllTablename(vec_);
char** iterator_;
int k = 0;
for(iterator_ = vec_.begin(); iterator_ != vec_.end(); iterator_++)
{
m_tableset.InsertString(k++, (LPCTSTR)(*iterator_));
}
//no memory leak,now
for(size_t j = 0; j < count_; j++)
if(fieldname_[j])
delete[] fieldname_[j];
delete[] tablename_;
}
void CxkDBMSView::OnSavedict()
{
// TODO: Add your command handler code here
pEngine_->SaveDict();
}
void CxkDBMSView::OnSavetable()
{
// TODO: Add your command handler code here
int tablecount_;
if((tablecount_ = m_tableset.GetCount()) == 0)
return;
int focus_ = m_tableset.GetCurSel();
if(focus_ == -1)
return;
CString tablename_;
m_tableset.GetText(focus_, tablename_);
pEngine_->SaveTable(tablename_.GetBuffer(tablename_.GetLength()));
}
void CxkDBMSView::OnLoaddict()
{
// TODO: Add your command handler code here
pEngine_->LoadDict();
Vector<char*> vec_;
//清空原来的内容
m_tableset.ResetContent();
pEngine_->GetAllTablename(vec_);
char** iterator_;
int i = 0;
for(iterator_ = vec_.begin(); iterator_ != vec_.end(); iterator_++)
{
m_tableset.InsertString(i++, (LPCTSTR)(*iterator_));
}
}
/*
* 将m_recordset列表控件上的数据存入
m_tableset列表上当前选择的数据表
*/
void CxkDBMSView::OnInsertRecord()
{
// TODO: Add your control notification handler code here
int tablecount_;
if((tablecount_ = m_tableset.GetCount()) == 0)
return;
int focus_ = m_tableset.GetCurSel();
if(focus_ == -1)
return;
CString tablename_, str_;
m_tableset.GetText(focus_, tablename_);
if(tablename_ == "")
return;
int rid_ = pEngine_->FindTable(tablename_.GetBuffer(tablename_.GetLength()));
xkAttriStruct pas_;
pEngine_->GetTableAttribute(rid_, pas_);
int rowcount_ = m_recordset.GetItemCount();
size_t tuplesize_ = pEngine_->GetTabletuplesize(rid_);
char* source_ = new char[tuplesize_ + 1];
for(size_t i = 0; i < rowcount_; i++)
{
//防止空行被写入
bool flag_ = false;
for(size_t k = 0; k < pas_.attrcount_; k++)
{
if(m_recordset.GetItemText(i, k) == "")
{
flag_ = true;
break;
}
}
if(flag_)
continue;
size_t pos_ = 0;
for(size_t j = 0; j < pas_.attrcount_; j++)
{
if(pas_.pa_[j].GetType() == t_int)
{
str_ = m_recordset.GetItemText(i, j);
int intval_ = StrToInt(str_.GetBuffer(str_.GetLength()));
memcpy(source_ + pos_, &intval_, pas_.pa_[j].GetLength());
pos_ += pas_.pa_[j].GetLength();
}
else if(pas_.pa_[j].GetType() == t_float)
{
str_ = m_recordset.GetItemText(i, j);
float floatval_ = (float)strtod(str_.GetBuffer(str_.GetLength()),NULL);
memcpy(source_ + pos_, &floatval_, pas_.pa_[j].GetLength());
pos_ += pas_.pa_[j].GetLength();
}
else if(pas_.pa_[j].GetType() == t_string || pas_.pa_[j].GetType() == t_char)
{
str_ = m_recordset.GetItemText(i, j);
char* tmp_ = new char[pas_.pa_[j].GetLength() + 1];
strcpy(tmp_, str_.GetBuffer(str_.GetLength()));
memcpy(source_ + pos_, tmp_, pas_.pa_[j].GetLength());
delete[] tmp_;
pos_ += pas_.pa_[j].GetLength();
}
}
source_[tuplesize_] = '\0';
pEngine_->InsertTuple(tablename_.GetBuffer(tablename_.GetLength()), source_, tuplesize_);
}
delete[] source_;
pEngine_->SaveTable(tablename_.GetBuffer(tablename_.GetLength()));
}
void CxkDBMSView::ShowRecord()
{
//clear old content
int row_count_ = m_recordset.GetItemCount();
for(size_t r = 0; r < row_count_; r++)
m_recordset.DeleteItem(0);
int col_count_ = m_recordset.GetHeaderCtrl()->GetItemCount();
for(size_t c = 0; c < col_count_; c++)
m_recordset.DeleteColumn(0);
int focus_ = m_tableset.GetCurSel();
if(focus_ == LB_ERR)
return;
CString tablename_;
m_tableset.GetText(focus_, tablename_);
int rid_ = 0;
rid_ = pEngine_->FindTable(tablename_.GetBuffer(tablename_.GetLength()));
if(rid_ < 0)
return;
Vector<char*> attr_vec_;
pEngine_->GetTableAttributename(rid_, attr_vec_);
size_t attrcount_ = attr_vec_.size();
for(size_t i = 0; i < attrcount_; i++)
{
m_recordset.InsertColumn(i, (LPCTSTR)attr_vec_[i], LVCFMT_LEFT, 100);
}
// insert all records
size_t tuplesize_ = pEngine_->GetTabletuplesize(rid_);
char* desired_ = 0;
xkAttriStruct pas_;
pEngine_->GetTableAttribute(rid_, pas_);
assert(pas_.pa_ != 0);
int rowcount_ = 0;
LV_ITEM item_;
item_.mask = LVIF_TEXT;
while((desired_ = pEngine_->GetTableAllRecords(rid_)))
{
size_t pos_ = 0;
for(size_t k = 0; k < pas_.attrcount_; k++)
{
if(pas_.pa_[k].GetType() == t_int)
{
int intval_;
memcpy(&intval_, desired_ + pos_, pas_.pa_[k].GetLength());
char* tmp_ = new char[11];
_itoa(intval_, tmp_, 10);
item_.pszText = (LPSTR)tmp_;
item_.iItem = rowcount_;
item_.iSubItem = k;
if(k == 0)
m_recordset.InsertItem(&item_);
else
m_recordset.SetItem(&item_);
delete[] tmp_;
}
else if(pas_.pa_[k].GetType() == t_float)
{
float floatval_;
memcpy(&floatval_, desired_ + pos_, pas_.pa_[k].GetLength());
char* buf_ = 0;
int decimal_ = 0, sign_ = 0;
buf_ = _ecvt(double(floatval_), 10, &decimal_, &sign_);
char* tmp_ = new char[12];
size_t t = 0;
if(sign_)
tmp_[t++] = '-';
for(size_t j = 0; j < 10; j++)
{
if(j == decimal_)
tmp_[t++] = '.';
tmp_[t++] = buf_[j];
}
tmp_[12] = '\0';
item_.pszText = (LPSTR)tmp_;
item_.iItem = rowcount_;
item_.iSubItem = k;
if(k == 0)
m_recordset.InsertItem(&item_);
else
m_recordset.SetItem(&item_);
}
else if(pas_.pa_[k].GetType() == t_string || pas_.pa_[k].GetType() == t_char)
{
char* tmp_ = new char[pas_.pa_[k].GetLength() + 1];
memcpy(tmp_, desired_ + pos_, pas_.pa_[k].GetLength());
tmp_[pas_.pa_[k].GetLength()] = '\0';
item_.iItem = rowcount_;
item_.iSubItem = k;
item_.pszText = (LPSTR)tmp_;
if(k == 0)
m_recordset.InsertItem(&item_);
else
m_recordset.SetItem(&item_);
delete[] tmp_;
}
pos_ += pas_.pa_[k].GetLength();
}
delete[] desired_;
desired_ = 0;
rowcount_++;
}
m_recordset.Invalidate(FALSE);
}
void CxkDBMSView::OnSelchangeTableset()
{
// TODO: Add your control notification handler code here
int i = m_tab.GetCurSel();
if(i == 0)
ShowRecord();
else
{
InitFieldSet();
ShowField();
}
}
void CxkDBMSView::ShowField()
{
int focus_ = m_tableset.GetCurSel();
if(focus_ == LB_ERR)
return;
//clear old content
int row_count_ = m_fieldSet.GetItemCount();
for(size_t r = 0; r < row_count_; r++)
m_fieldSet.DeleteItem(0);
CString tablename_;
m_tableset.GetText(focus_, tablename_);
int rid_ = 0;
rid_ = pEngine_->FindTable(tablename_.GetBuffer(tablename_.GetLength()));
if(rid_ < 0)
return;
xkAttriStruct pas_;
pEngine_->GetTableAttribute(rid_, pas_);
assert(pas_.pa_ != 0);
for(size_t a = 0; a < pas_.attrcount_; a++)
{
LV_ITEM item_;
item_.mask = LVIF_TEXT;
item_.iItem = a;
item_.iSubItem = 0;
item_.pszText = (LPSTR)pas_.pa_[a].GetName();
m_fieldSet.InsertItem(&item_);
item_.iSubItem = 1;
switch(pas_.pa_[a].GetType())
{
case 0:
item_.pszText = "整数";
break;
case 1:
item_.pszText = "浮点数";
break;
case 2:
item_.pszText = "字符串";
break;
case 3:
item_.pszText = "字符";
break;
default:
break;
}
m_fieldSet.SetItem(&item_);
item_.iSubItem = 2;
if(pas_.pa_[a].IsKey())
item_.pszText = "是";
else
item_.pszText = "否";
m_fieldSet.SetItem(&item_);
}
}
void CxkDBMSView::OnEndlabeleditRecordlist(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
LV_ITEM item_ = pDispInfo->item;
size_t nitem_ = item_.iItem;
size_t ncol_ = item_.iSubItem;
LPSTR str_ = item_.pszText;
m_recordset.SetItemText(nitem_, ncol_, str_);
*pResult = 0;
}
void CxkDBMSView::OnDeleteRecord()
{
// TODO: Add your control notification handler code here
int tablecount_;
if((tablecount_ = m_tableset.GetCount()) == 0)
return;
int focus_ = m_tableset.GetCurSel();
if(focus_ == -1)
return;
CString tablename_;
m_tableset.GetText(focus_, tablename_);
if(tablename_ == "")
return;
int rid_ = pEngine_->FindTable(tablename_.GetBuffer(tablename_.GetLength()));
assert(rid_ != -1);
CxkDelRecDlg dlg_;
int ret_ = dlg_.DoModal();
if(ret_ == IDOK)
{
if(keyword_ == "")
return;
xkAttriStruct pas_;
pEngine_->GetTableAttribute(rid_, pas_);
assert(pas_.pa_ != 0);
xkAttribute *attr_ = 0;
size_t keyno_ = 0;
for(keyno_ = 0; keyno_ < pas_.attrcount_; keyno_++)
{
if(pas_.pa_[keyno_].IsKey())
break;
}
attr_ = &pas_.pa_[keyno_];
assert(attr_ != 0);
pEngine_->DeleteTuple(tablename_, attr_->GetName(), keyword_.GetBuffer(keyword_.GetLength()));
}
}
void CxkDBMSView::OnUpdateRecord()
{
// TODO: Add your control notification handler code here
//destroy old records
int tablecount_;
if((tablecount_ = m_tableset.GetCount()) == 0)
return;
int focus_ = m_tableset.GetCurSel();
if(focus_ == -1)
return;
CString tablename_;
m_tableset.GetText(focus_, tablename_);
if(tablename_ == "")
return;
int rid_ = pEngine_->FindTable(tablename_.GetBuffer(tablename_.GetLength()));
assert(rid_ != -1);
pEngine_->DeleteAllRecords(rid_);
//insert latest records
OnInsertRecord();
}
void CxkDBMSView::OnUpdateTableList()
{
// TODO: Add your control notification handler code here
Vector<char*> vec_;
//清空原来的内容
m_tableset.ResetContent();
pEngine_->GetAllTablename(vec_);
char** iterator_;
int k = 0;
for(iterator_ = vec_.begin(); iterator_ != vec_.end(); iterator_++)
{
m_tableset.InsertString(k++, (LPCTSTR)(*iterator_));
}
}
/*
* 执行SQL语句
*/
void CxkDBMSView::OnSqlExec()
{
// TODO: Add your control notification handler code here
CString sql_;
m_sql.GetWindowText(sql_);
if(sql_ == "")
return;
//clear m_recordset control's old content
int row_count_ = m_recordset.GetItemCount();
for(size_t r = 0; r < row_count_; r++)
m_recordset.DeleteItem(0);
int col_count_ = m_recordset.GetHeaderCtrl()->GetItemCount();
for(size_t c = 0; c < col_count_; c++)
m_recordset.DeleteColumn(0);
m_tab.SetCurSel(0);
//parse sql statement
xkInputSource* pis_ = new xkInputSource(sql_.GetBuffer(sql_.GetLength()));
xkSQLParser* psp_ = new xkSQLParser(pis_, pEngine_);
psp_->Parse();
delete pis_;
delete psp_;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -