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

📄 xkdbmsview.cpp

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