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

📄 databaseview.cpp

📁 数据库模拟程序 实现控制台命令词法分析
💻 CPP
字号:
// dataBaseView.cpp : implementation of the CDataBaseView class
//

#include "StdAfx.h"
#include "dataBase.h"

#include "dataBaseDoc.h"
#include "dataBaseView.h"
#include "FindDlg.h"
#include "TableInsert.h"
#include "RebuildDlg.h"
#include "Dlg1.h"
#include <fstream.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDataBaseView

IMPLEMENT_DYNCREATE(CDataBaseView, CView)

BEGIN_MESSAGE_MAP(CDataBaseView, CView)
//{{AFX_MSG_MAP(CDataBaseView)
ON_WM_CREATE()
ON_WM_CHAR()
ON_COMMAND(ID_COMPLIER_FILE, OnComplierFile)
ON_COMMAND(ID_READ_INDEX, OnReadIndex)
	ON_COMMAND(ID_READ_TABLE, OnReadTable)
ON_COMMAND(ID_FIND, OnFind)
	ON_COMMAND(IDR_READ_CIDIAN, OnReadCidian)
	ON_COMMAND(ID_DEL, OnDel)
	ON_COMMAND(ID_ALTER, OnAlter)
	ON_COMMAND(ID_SHOW, OnShow)
	//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDataBaseView construction/destruction

CDataBaseView::CDataBaseView()
{
	// TODO: add construction code here
	m_ptCaret.x=0;
	m_ptCaret.y=0;
	m_sTemp = "";
}

CDataBaseView::~CDataBaseView()
{
}

BOOL CDataBaseView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDataBaseView drawing

void CDataBaseView::OnDraw(CDC* pDC)
{
	CDataBaseDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CDataBaseView printing

BOOL CDataBaseView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDataBaseView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDataBaseView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDataBaseView diagnostics

#ifdef _DEBUG
void CDataBaseView::AssertValid() const
{
	CView::AssertValid();
}

void CDataBaseView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDataBaseDoc* CDataBaseView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDataBaseDoc)));
	return (CDataBaseDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDataBaseView message handlers

int CDataBaseView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	
	TEXTMETRIC tm;
	CClientDC dc(this);
	dc.TextOut(0,0,">",1);
	dc.GetTextMetrics(&tm);
	CreateSolidCaret(tm.tmAveCharWidth/ 8,tm.tmHeight);
	ShowCaret();
	
	CSize sz;
	sz = dc.GetTextExtent(">",1);
	POINT pt;
	pt.y=sz.cy;
	pt.x=sz.cx;
	m_ptCaret.x=pt.x;
	m_ptCaret.y=pt.y;
	SetCaretPos(pt);
	return 0;
}

void CDataBaseView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CSize sz;
	
	CClientDC dc(this);
	sz = dc.GetTextExtent(">",1);
	
	POINT caretStartPoint;
	caretStartPoint.x = sz.cx;
	caretStartPoint.y = m_ptCaret.y;
	
	if(0xd == nChar)
	{
		m_anylise.SetString(m_sTemp);
		m_anylise.go();
		
		m_sTemp.Empty();
		caretStartPoint.x = sz.cx;
		caretStartPoint.y += sz.cy;	
		
		m_ptCaret.x = caretStartPoint.x;
		m_ptCaret.y = caretStartPoint.y;
	}
	else if('\b' == nChar)
	{
		if(m_ptCaret.x != sz.cx)
		{
			dc.SetTextColor(RGB(255,255,255));
			dc.TextOut(caretStartPoint.x,caretStartPoint.y,m_sTemp);
			dc.SetTextColor(RGB(255,0,255));
			m_sTemp = m_sTemp.Left(m_sTemp.GetLength() - 1);
		}
	}
	else
	{
		m_sTemp += (char)nChar;
	}
	
	if(m_sTemp != "")
		dc.TextOut(caretStartPoint.x,caretStartPoint.y,m_sTemp);
	else
	{
		m_sTemp = ">";
		dc.TextOut(0,caretStartPoint.y,m_sTemp);
		m_sTemp.Empty();
	}
	
	sz = dc.GetTextExtent(m_sTemp);
	m_ptCaret.x = caretStartPoint.x + sz.cx;
	m_ptCaret.y = caretStartPoint.y;
	SetCaretPos(m_ptCaret);
	
	CView::OnChar(nChar, nRepCnt, nFlags);
}

void CDataBaseView::OnComplierFile() 
{
	// TODO: Add your command handler code here
	CFileDialog fileDlg(true);
	ifstream file;
	char readBuff[150];
	
	CClientDC dc(this);
	CPoint point;
	
	CSize sz = dc.GetTextExtent("*******");
	
	CMyAnylise anylse;
	
	if(fileDlg.DoModal() == IDOK)
	{
		
		file.open(fileDlg.GetPathName());
		char ctemp;
		while(file.read(&ctemp,1) != 0)
		{
			m_sTemp.Empty();
			memset(readBuff,0,150);
			file.seekg(file.tellg() - 1);
			file.getline(readBuff,150);
			m_sTemp = readBuff;
			if(m_sTemp != "")
			{
				anylse.SetString(m_sTemp);
				anylse.go();
				m_ptCaret.x += sz.cx; 
				anylse.ComplingOutPut(m_ptCaret,m_sTemp);
				m_ptCaret.x -= sz.cx;
			}
		}
		
		CRect rect;
		GetClientRect(&rect);
		dc.TextOut(0, rect.Height() - 20, "Compling is end!");
		
		m_sTemp.Empty();
		
		m_ptCaret.y += sz.cy;
		m_ptCaret.x = sz.cx;
		
		point.x = sz.cx;
		point.y = m_ptCaret.y;
		SetCaretPos(point);
		ShowCaret();
	}	
}

void CDataBaseView::OnReadIndex() 
{
	// TODO: Add your command handler code here
	CDBControl cdb;
	IndexForCiDian index;
	cdb.ReadFromIndex();
}

void CDataBaseView::OnFind() 
{
	// TODO: Add your command handler code here
	CFindDlg dlg;
	if(IDOK == dlg.DoModal())
	{
		int i = 0;
		IndexForCiDian index;
		CDBControl control;
		CString str;
		
		char temp[10];///用于存储类型名称
		memset(temp, 0, 10);
		
		strcpy(index.name, dlg.m_str);
		
		switch(dlg.m_type)
		{
		case TABLE:index.indexType = TABLE;strcpy(temp, "TABLE");break;
		case VIEW: index.indexType = VIEW;strcpy(temp, "VIEW");break;
		case INDEX:index.indexType = INDEX;strcpy(temp, "INDEX");break;
		}
		
		switch(dlg.m_findType)
		{
		case 0:
			{
				IndexForCiDian index;
				memset(&index, 0, sizeof(IndexForCiDian));
				if(control.ReadFromIndex(atoi(dlg.m_str), index))
				{
					str.Empty();
					str.Format("type = %s, name = %s, len = %ld, startOffset = %ld", temp, index.name, index.item_len, 
						index.startOffset);			
				}
				else
				{
					str.Empty();
					str.Format("标号%s越界! ", dlg.m_str);
				}
				break;
			}
		case 1:
			{
				if(control.findInIndexFile(index) != -1){	
					str.Empty();
					str.Format("type = %s, name = %s, len = %ld, startOffset = %ld", temp, index.name, index.item_len, 
						index.startOffset);			
				}
				else
				{
					str.Empty();
					str.Format("%s不在索引表中! ", index.name);
				}
				break;
			}
		default:
			MessageBox("系统错误!");
			break;
		}
		MessageBox(str);
	}
}

void CDataBaseView::OnReadCidian() 
{
	// TODO: Add your command handler code here
	CDBControl db;
	int i = 0, j = 0;
	Data data;
	memset(&data, 0, sizeof(Data));
	
	CString str, temp;
	while(db.ReadFromCiDian(i, data))
	{		
		str.Format("name = %s,", data.name);
		for(j = 0; j < data.pDataArray_len; j++)
		{
			str += "( 属性 ";
			str += data.pDataArray[j].name;
			switch(data.pDataArray[j].type)
			{
			case 0:temp = "INTEGER";break;//int
			case 2:temp.Format("CHAR(%d)", data.pDataArray[j].len);break;//char
			}
			str += " 类型 ";
			str += temp;
			str += ");";
			temp.Empty();
		}
		AfxMessageBox(str);
		str.Empty();
		
		delete [] data.pDataArray;
		memset(&data, 0, sizeof(Data));
		i++;
	}
}

////////afasfafafasf
void CDataBaseView::OnReadTable() 
{
	// TODO: Add your command handler code here
	CDlg1 dlg;
	CString strTemp;
	if(IDOK == dlg.DoModal())
	{
		strTemp = dlg.m_str;
		if(strTemp.IsEmpty()){
			AfxMessageBox("表名为空!");
			return;
		}else	if(strTemp.Find(".tab",0) == -1)
			strTemp += ".tab";
	}

	ifstream file;
	file.open(strTemp);
	Data data;
	memset(&data, 0, sizeof(Data));
	char countBuff[10];
	char buff[100];
	memset(buff, 0, 100);
	memset(countBuff, 0, 10);
	file.read(countBuff, 10);
	file.read(buff, 1);
//	file.read(data.name, NAME_LEN);
	char ch[2];
	memset(ch, 0, 2);
	int count = atoi(countBuff);

	char a[10][ITEM_LEN + 1];//此语句限定程序只能处理最大10个属性
	memset(a, 0, 10 * ITEM_LEN + 1);
	
	int i;
	CString str;
	while(file.read(buff, 1))
	{
		str.Empty();
		file.seekg(-1, ios::cur);
		int offset = file.tellg();
		file.read(data.name, NAME_LEN);
		offset = file.tellg();

		str.Format("表名:%s, 属性数据: ", data.name);
		i = 0;
		for(i = 0; i < count; i++)
		{
			file.getline(a[i], ITEM_LEN + 2, ';');//数据项最大ITEM_LEN但为了能读到‘;’所以加长一个单位,加长一个结束符。
			offset = file.tellg();
			str += a[i];
			str += "; ";
		}
		
		if(data.name[0] != 0)//如果是空数据则不显示。
		{
			AfxMessageBox(str);
		}

		file.read(buff, 1);//读取回车
	}
	file.close();
}
//////////////////////////

void CDataBaseView::OnDel() 
{
	// TODO: Add your command handler code here
	CTableInsert table;
	
	ifstream file;
	file.open("T.tab");
	char countBuff[10];
	char buff[100];
	memset(buff, 0, 100);
	memset(countBuff, 0, 10);
	file.read(countBuff, 10);
	file.read(buff, 1);
	file.close();

//	file.read(data.name, NAME_LEN);
	char ch[2];
	memset(ch, 0, 2);
	int count = atoi(countBuff);

	fstream ff;
	if(IDOK == table.DoModal())
	{
		ff.open("T.tab", ios::in | ios::out);
		ff.seekg(10 + 2, ios::beg);//跳过表头信息;
		int off = ff.tellg();
		ff.seekg(ff.tellg() + table.m_index * ((NAME_LEN + (ITEM_LEN + 1) * count ) + 2), ios::beg);
		off = ff.tellg();
		
		long len = NAME_LEN + (ITEM_LEN + 1) * count;
		memset(buff, 0, 200);
		off = ff.tellg();
		ff.write(buff, NAME_LEN);
		int i = 0;
		i= 0;
		for(i = 0; i < count; i++)
		{
			ff.write(buff, ITEM_LEN );
			ff.write(";", 1);
		}
		off = ff.tellg();
		
		if(ff.fail())
		{
			AfxMessageBox("删除操作失败!");
		}
		else
			AfxMessageBox("删除操作成功!");

		ff<<endl;
		
	}
	ff.close();
}

void CDataBaseView::OnAlter()
{
	// TODO: Add your command handler code here
	ifstream file;
	file.open("T.tab");
	Data data;
	memset(&data, 0, sizeof(Data));
	char countBuff[10];
	char buff[100];
	memset(buff, 0, 100);
	memset(countBuff, 0, 10);
	file.read(countBuff, 10);
	file.read(buff, 1);
//	file.read(data.name, NAME_LEN);
	char ch[2];
	memset(ch, 0, 2);
	int count = atoi(countBuff);

	char a[10][ITEM_LEN + 1];//此语句限定程序只能处理最大10个属性
	memset(a, 0, 10 * ITEM_LEN + 1);
	//char (*a)[count] = new char[NAME_LEN][count];
	
	int i;
	CString str;
	while(file.read(buff, 1))
	{
		str.Empty();
		file.seekg(-1, ios::cur);
		int offset = file.tellg();
		file.read(data.name, NAME_LEN);
		offset = file.tellg();

		str.Format("表名:%s, 属性数据: ", data.name);
		i = 0;
		for(i = 0; i < count; i++)
		{
			file.getline(a[i], ITEM_LEN + 2, ';');//数据项最大ITEM_LEN但为了能读到‘;’所以加长一个单位,加长一个结束符。
			offset = file.tellg();
			str += a[i];
			str += "; ";
		}

		CRebuildDlg dlg;
		dlg.DoModal();
		
		if(data.name[0] != 0)//如果是空数据则不显示。
		{
			AfxMessageBox("空项!");
			
		}
		else
		{
			
		}

		file.read(buff, 1);//读取回车
	}
	file.close();
}

void CDataBaseView::OnShow(CString str, Word word[], int len) 
{
	// TODO: Add your command handler code here
	
	char temp[20];
	strcpy(temp, "display ");
	strcat(temp, word[3].name);
	WinExec(temp, SW_SHOW);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -