⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xkexecengine.cpp

📁 简单数据库管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -