📄 xkexecengine.cpp
字号:
if(strlen(fieldlist_[j]) == strlen(pas_.pa_[i].GetName()) && strcmp(fieldlist_[j], pas_.pa_[i].GetName()) == 0)
{
valid_ = true;
break;
}
if(!valid_)
{
AfxMessageBox("字段不存在!");
return false;
}
}
//生成一条新纪录
char* source_ = new char[pr_->GetTuple()->GetTupleSize() + 1];
size_t pos_ = 0;
for(i = 0; i < pas_.attrcount_; i++)
{
for(j = 0; j < fieldlist_.size(); j++)
{
if(strlen(fieldlist_[j]) == strlen(pas_.pa_[i].GetName()) && strcmp(fieldlist_[j], pas_.pa_[i].GetName()) == 0)
{
if(pas_.pa_[i].GetType() == t_int)
{
int intval_ = StrToInt(valuelist_[j]);
memcpy(source_ + pos_, &intval_, pas_.pa_[i].GetLength());
pos_ += pas_.pa_[i].GetLength();
break;
}
else if(pas_.pa_[i].GetType() == t_float)
{
float floatval_ = (float)strtod(valuelist_[j],NULL);
memcpy(source_ + pos_, &floatval_, pas_.pa_[i].GetLength());
pos_ += pas_.pa_[i].GetLength();
break;
}
else if(pas_.pa_[i].GetType() == t_string || pas_.pa_[i].GetType() == t_char)
{
memcpy(source_ + pos_, valuelist_[j], pas_.pa_[i].GetLength());
pos_ += pas_.pa_[i].GetLength();
break;
}
}
}
}
source_[pr_->GetTuple()->GetTupleSize()] = '\0';
if(pr_->InsertTuple(source_, pr_->GetTuple()->GetTupleSize()))
{
delete[] source_;
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
pview_->m_recordset.Invalidate(FALSE);
return true;
}
delete[] source_;
return false;
}
void xkExecEngine::LoadTable(const char *tablename_)
{
int i = FindTable(tablename_);
assert(i != -1);
pMem_->LoadTable(i);
}
void xkExecEngine::SaveTable(const char *tablename_)
{
int i = FindTable(tablename_);
assert(i != -1);
pMem_->SaveTable(i);
}
void xkExecEngine::LoadAll()
{
pMem_->LoadAll();
}
void xkExecEngine::SaveAll()
{
pMem_->SaveAll();
}
void xkExecEngine::GetAllTablename(Vector<char*>& vec_)
{
pDict_->GetAllTablename(vec_);
}
void xkExecEngine::GetTableAttributename(const size_t id_,
Vector<char*>& vec_)
{
pDict_->GetTableAttributename(id_, vec_);
}
void xkExecEngine::GetTableAttribute(const size_t id_, xkAttriStruct& pas_)
{
pDict_->GetTableAttribute(id_, pas_);
}
size_t xkExecEngine::GetTabletuplesize(const size_t rid_)
{
xkRelation* pr_ = pDict_->GetRelation(rid_);
return pr_->GetTuple()->GetTupleSize();
}
void xkExecEngine::CreateTable(const size_t RID_)
{
pMem_->CreateTable(RID_);
}
char* xkExecEngine::GetTableAllRecords(const size_t rid_)
{
return pMem_->GetTableAllRecords(rid_);
}
void xkExecEngine::DeleteAllRecords(const size_t rid_)
{
pMem_->DeleteAllRecords(rid_);
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
pview_->m_recordset.Invalidate(FALSE);
}
void xkExecEngine::DisplayTable(const char *tablename_, Vector<char*> *fieldlist_)
{
int rid_ = FindTable(tablename_);
assert(rid_ >= 0);
xkAttriStruct pas_;
GetTableAttribute(rid_, pas_);
assert(pas_.pa_ != 0);
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
//设选中字段
size_t i = 0;
for(i = 0; i < pas_.attrcount_; i++)
pas_.pa_[i].SetSelected(false);//设初始值
if(fieldlist_ != 0)
{
if(fieldlist_->size() != 0)
{
size_t fcount_ = fieldlist_->size();
for(size_t fi = 0; fi < fcount_; fi++)
for(size_t ai = 0; ai < pas_.attrcount_; ai++)
{
if(strlen((*fieldlist_)[fi]) == strlen(pas_.pa_[ai].GetName()) && strcmp((*fieldlist_)[fi], pas_.pa_[ai].GetName()) == 0)
{
pas_.pa_[ai].SetSelected(true);
break;
}
}
}
}
size_t selected_ = 0;
for(i = 0; i < pas_.attrcount_; i++)
{
if(fieldlist_ != 0)
{
if(pas_.pa_[i].GetSelected())
pview_->m_recordset.InsertColumn(selected_++, (LPCTSTR)pas_.pa_[i].GetName(), LVCFMT_LEFT, 100);
}
else
{
pview_->m_recordset.InsertColumn(selected_++, (LPCTSTR)pas_.pa_[i].GetName(), LVCFMT_LEFT, 100);
}
}
// insert all records
size_t tuplesize_ = GetTabletuplesize(rid_);
char* desired_ = 0;
int rowcount_ = 0;
LV_ITEM item_;
item_.mask = LVIF_TEXT;
while((desired_ = GetTableAllRecords(rid_)))
{
size_t pos_ = 0;
bool flag1_ = false;
size_t colcount_ = 0;
char* tmp_ = 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());
tmp_ = new char[11];
_itoa(intval_, tmp_, 10);
tmp_[11] = '\0';
item_.pszText = (LPSTR)tmp_;
item_.iItem = rowcount_;
}
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_);
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_;
}
else if(pas_.pa_[k].GetType() == t_string || pas_.pa_[k].GetType() == t_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_.pszText = (LPSTR)tmp_;
}
if(fieldlist_ != 0)
{
if(pas_.pa_[k].GetSelected())//选中字段
{
if(!flag1_)
{
item_.iSubItem = colcount_++;
pview_->m_recordset.InsertItem(&item_);
flag1_ = true;
}
else
{
item_.iSubItem = colcount_++;
pview_->m_recordset.SetItem(&item_);
}
}
}
else
{
if(!flag1_)
{
item_.iSubItem = colcount_++;
pview_->m_recordset.InsertItem(&item_);
flag1_ = true;
}
else
{
item_.iSubItem = colcount_++;
pview_->m_recordset.SetItem(&item_);
}
}
pos_ += pas_.pa_[k].GetLength();
}
// delete[] tmp_;
delete[] desired_;
desired_ = 0;
rowcount_++;
}
pview_->m_recordset.Invalidate(FALSE);
}
bool xkExecEngine::InsertTuple(const char *tablename_, char *source_, size_t size_)
{
int rid_ = FindTable(tablename_);
assert(rid_ != -1);
xkRelation* pr_ = pDict_->GetRelation(rid_);
if(pr_->InsertTuple(source_, size_))
{
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
pview_->m_recordset.Invalidate(FALSE);
return true;
}
return false;
}
bool xkExecEngine::UpdateTuple(const char* tablename_, Vector<char*>& fieldlist_,
Vector<char*>& valuelist_, char* key_, char* keyval_)
{
int rid_ = FindTable(tablename_);
assert(rid_ != -1);
xkRelation* pr_ = pDict_->GetRelation(rid_);
size_t tuplesize_ = pr_->GetTuple()->GetTupleSize();
xkAttriStruct pas_;
GetTableAttribute(rid_, pas_);
assert(pas_.pa_ != 0);
//判断字段列表是否合法
size_t i = 0, j = 0;
for(i = 0; i < fieldlist_.size(); i++)
{
bool valid_ = false;
for(j = 0; j < pas_.attrcount_; j++)
if(strlen(fieldlist_[i]) == strlen(pas_.pa_[j].GetName()) &&
strcmp(fieldlist_[i], pas_.pa_[j].GetName()) == 0)
{
valid_ = true;
break;
}
if(!valid_)
{
AfxMessageBox("字段不存在!");
return false;
}
}
char* source_ = new char[tuplesize_ + 1];
size_t k = 0;
for(k = 0; k < pas_.attrcount_; k++)
if(pas_.pa_[k].IsKey())
break;
//将关键字转换为字符串
int intval_ = 0;
float floatval_ = 0;
if(pas_.pa_[k].GetType() == t_int)
{
intval_ = StrToInt(keyval_);
if(pr_->GetSelectedTuple(pas_.pa_[k], &intval_, source_) == false)
return false;
}
else if(pas_.pa_[k].GetType() == t_float)
{
floatval_ = (float)strtod(keyval_,NULL);
if(pr_->GetSelectedTuple(pas_.pa_[k], &floatval_, source_) == false)
return false;
}
else if(pas_.pa_[k].GetType() == t_string || pas_.pa_[k].GetType() == t_char)
{
if(!pr_->GetSelectedTuple(pas_.pa_[k], keyval_, source_))
return false;
}
//设置新记录内容
for(i = 0; i < fieldlist_.size(); i++)
{
size_t pos_ = 0;
for(j = 0; j < pas_.attrcount_; j++)
{
if(strlen(fieldlist_[i]) == strlen(pas_.pa_[j].GetName()) &&
strcmp(fieldlist_[i], pas_.pa_[j].GetName()) == 0)
{
if(pas_.pa_[j].GetType() == t_int)
{
int intval1_ = StrToInt(valuelist_[i]);
memcpy(source_ + pos_, &intval1_, pas_.pa_[j].GetLength());
break;
}
else if(pas_.pa_[j].GetType() == t_float)
{
float floatval1_ = (float)strtod(valuelist_[i], NULL);
memcpy(source_ + pos_, &floatval1_, pas_.pa_[j].GetLength());
break;
}
else if(pas_.pa_[j].GetType() == t_string || pas_.pa_[j].GetType() == t_char)
{
memcpy(source_ + pos_, valuelist_[i], pas_.pa_[j].GetLength());
break;
}
}
pos_ += pas_.pa_[j].GetLength();
}
}
source_[tuplesize_] = '\0';
switch (pas_.pa_[k].GetType())
{
case t_int:
{
if(pr_->UpdateTuple(pas_.pa_[k], &intval_, source_))
{
SaveTable(tablename_);//将新内容保存到外存
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
pview_->m_recordset.Invalidate(FALSE);
return true;
}
return false;
}
case t_float:
{
if(pr_->UpdateTuple(pas_.pa_[k], &floatval_, source_))
{
SaveTable(tablename_);//将新内容保存到外存
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
pview_->m_recordset.Invalidate(FALSE);
return true;
}
return false;
}
case t_string:
case t_char:
{
if(pr_->UpdateTuple(pas_.pa_[k], keyval_, source_))
{
SaveTable(tablename_);//将新内容保存到外存
CxkDBMSView* pview_ = (CxkDBMSView*) ((CMainFrame*)theApp.m_pMainWnd)->GetActiveView();
pview_->m_recordset.Invalidate(FALSE);
return true;
}
return false;
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -