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

📄 databasedoc.cpp

📁 有计算机图形学、图像处理、dbms、sniffer、中游俄罗斯外挂、othello、遗传算法、舌苔分析等程序。
💻 CPP
字号:
// DatabaseDoc.cpp : implementation of the CDatabaseDoc class
//

#include "stdafx.h"
#include "Database.h"

#include "DatabaseDoc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDatabaseDoc

IMPLEMENT_DYNCREATE(CDatabaseDoc, CDocument)

BEGIN_MESSAGE_MAP(CDatabaseDoc, CDocument)
	//{{AFX_MSG_MAP(CDatabaseDoc)
	ON_COMMAND(ID_OPEN_DATABASE, OnOpenDatabase)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDatabaseDoc construction/destruction

CDatabaseDoc::CDatabaseDoc()
{
	// TODO: add one-time construction code here
    rt=NULL;
}

CDatabaseDoc::~CDatabaseDoc()
{
	PR_Item r_itm=rt;
	PR_Item r_next;
	if(r_itm&&r_itm->next!=rt)
	{
		do
		{
			r_itm->next->rel->WriteBack();
			r_next=r_itm->next;
			r_itm->next=r_itm->next->next;
			delete r_next->rel;
			delete r_next;
		}
		while(r_itm->next!=rt);
	}
    ASSERT(!r_itm || (r_itm->next==rt) );
	if(r_itm)
	{
		r_itm->rel->WriteBack();
		delete r_itm->rel;
		delete r_itm;
	}

	tree_name.WriteBack(NULL,0);
	tree_no.WriteBack(NULL,0);
	CMemory::WriteBackAll();
}

BOOL CDatabaseDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	::CreateDirectory("D:\\DB",NULL);
    GetSchemaIndex();

	CSchemaFile cscmf("D:\\DB\\0.scmf",CFile::modeCreate
		|CFile::modeNoTruncate|CFile::modeReadWrite,0);

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CDatabaseDoc serialization

void CDatabaseDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CDatabaseDoc diagnostics

#ifdef _DEBUG
void CDatabaseDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDatabaseDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDatabaseDoc commands

void CDatabaseDoc::OnOpenDatabase() 
{
	// TODO: Add your command handler code here
	CDbView *dbview=((CMainFrame *)(::AfxGetApp()->m_pMainWnd))->Ldbview;
	CManageView *mview=((CMainFrame *)(::AfxGetApp()->m_pMainWnd))->Tmview;
    CTreeCtrl &mtree=mview->GetTreeCtrl();
	CListCtrl &dbList=dbview->GetListCtrl();
	CString RelName=mtree.GetItemText(mtree.GetSelectedItem());

	Relationship *R=GetRelation(RelName);
	if(R)
	{
		dbview->DrawRelationship(R);
	}
}


Relationship * CDatabaseDoc::GetRelation(CString name)
{
	WORD i;
	PR_Item r_item=rt;
	Relationship *newr=NULL;
    KEY k(0,name);
	CResult res=tree_name.SearchBTree(k);
	if(res.success)
	{
		//在内存中找
		do
		{
			if(r_item&&(r_item->db_addr!=res.recptr))
				r_item=r_item->next;
			else 
				break;
		}
		while(r_item!=rt);
		
		if(r_item&&(r_item->db_addr==res.recptr))//已在内存中
		{
			newr=r_item->rel;
		}	
		else//需读盘
		{
			CSchemaFile cscmf("D:\\DB\\0.scmf",CFile::modeReadWrite);
			
			newr=cscmf.ReadSchema(res.recptr);
			newr->tree=new CBplusTree;
			newr->tree->Construct(newr->IndexMainFile);
			//读索引
			for(i=1;i<=newr->attr_num;i++)
			{
				if(newr->at[i].IndexMainFile!=0)//建立过索引
				{
					newr->at[i].tree=new CBplusTree;
					newr->at[i].tree->Construct(newr->at[i].IndexMainFile);
					newr->CurNode=newr->tree->m_sqt;
					//记录号的索引的m_sqt
				}
			}
			//关系加入内存,不激活
			NewRelationship(res.recptr,newr);
		}
	}
	else
	{
		AfxMessageBox("No Relationship");
		return NULL;
	}
	return newr;
}

void CDatabaseDoc::NewRelationship(PDB db_addr, Relationship *r)
{
	PR_Item r_item=new R_Item(db_addr,r);

    if(!rt)
	{
		rt=r_item;
		rt->next=rt;
	}
	else
	{
		r_item->next=rt->next;
		rt->next=r_item;
	}
}

BOOL CDatabaseDoc::GetSchemaIndex()
{
	UINT MainFileNo=1;
	BOOL Dup=0;
	BYTE KeyType=CHAR_TYPE;
	BYTE KeyNum=1;
	WORD KeyLength=10;
    
	UINT IndexID=0;//索引文件号
	//建立模式名索引
	
    CFile f;
	f.Open("D:\\DB\\1.mdx",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
	f.SeekToBegin();
	if(f.GetLength()==0)
	{
		IndexID=CMemory::AllocateID(FILE_ID);
		tree_name=CBplusTree(1,0,CHAR_TYPE,1,KEY_LENGTH,IndexID);
		
        CString s;
		s.Format("D:\\DB\\%d.index",IndexID);
		CIndexFile cidxf1(LPCTSTR(s),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite,IndexID);
		f.Close();
	}
	else
	{
		f.Close();
        tree_name.Construct(1); //文件号是1       
	}
	
	
	f.Open("D:\\DB\\2.mdx",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
	MainFileNo=2;
	Dup=0;
	KeyType=INT_TYPE;
	KeyNum=1;
	KeyLength=4;
    
	f.SeekToBegin();
	if(f.GetLength()==0)
	{
		IndexID=CMemory::AllocateID(FILE_ID);
		tree_no=CBplusTree(2,0,INT_TYPE,1,4,IndexID);
		
        CString s;
		s.Format("D:\\DB\\%d.index",IndexID);
		CIndexFile cidxf2(LPCTSTR(s),CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite,IndexID);
		f.Close();
	}
	else
	{
		f.Close();
        tree_no.Construct(2);     //文件号是2   
	}
	return TRUE;
}

Relationship * CDatabaseDoc::GetRelation(UINT RelNo)
{
	if(RelNo==0)
		return NULL;
    WORD i;
	PR_Item r_item=rt;
	Relationship *newr=NULL;
    KEY k(0,RelNo);
	CResult res=tree_no.SearchBTree(k);
	if(res.success)
	{
		//在内存中找
		do
		{
			if(r_item&&(r_item->db_addr!=res.recptr))
				r_item=r_item->next;
			else 
				break;
		}
		while(r_item!=rt);
		
		if(r_item&&(r_item->db_addr==res.recptr))//已在内存中
		{
			newr=r_item->rel;
		}	
		else//需读盘
		{
			CSchemaFile cscmf("D:\\DB\\0.scmf",CFile::modeReadWrite);
			
			newr=cscmf.ReadSchema(res.recptr);
			newr->tree=new CBplusTree;
			newr->tree->Construct(newr->IndexMainFile);
			//读索引
			for(i=1;i<=newr->attr_num;i++)
			{
				if(newr->at[i].IndexMainFile!=0)//建立过索引
				{
					newr->at[i].tree=new CBplusTree;
					newr->at[i].tree->Construct(newr->at[i].IndexMainFile);
					newr->CurNode=newr->tree->m_sqt;
					//记录号的索引的m_sqt
				}
			}
			//关系加入内存,不激活
			NewRelationship(res.recptr,newr);
		}
	}
	else
	{
		AfxMessageBox("No Relationship");
		return NULL;
	}
	return newr;
}

void CDatabaseDoc::CreateRelation(Relationship *newr)
{
    CSchemaFile cscmf("D:\\DB\\0.scmf",CFile::modeReadWrite,0);
	
    UINT id=CMemory::AllocateID(SCHEMA_ID);
	newr->ID=id;//ID
	newr->time=CMemory::GetTime();//time
	
	CResult res[2];
	KEY k1(0,newr->name),k2(0,newr->ID);
	res[0]=tree_name.SearchBTree(k1);
	res[1]=tree_no.SearchBTree(k2);
	ASSERT(!(res[1].success));
	if(res[0].success)
	{
        AfxMessageBox("Dup Relationship");
		return;
	}
	else
	{
		newr->CreateIndex(0);//为记录ID建立索引
        UINT DataFileID=CMemory::AllocateID(FILE_ID);
		newr->DataFileNo=DataFileID;//DataFileNo
		PDB pdb_R=cscmf.Location(newr);
		newr->db_addr=pdb_R;//db_addr/////////////////////至关重要

	    tree_name.InsertBTree(k1,pdb_R,res[0].pdbNode,res[0].pos);
		tree_no.InsertBTree(k2,pdb_R,res[1].pdbNode,res[1].pos);
		NewRelationship(pdb_R,newr);

		
		CManageView *mview=((CMainFrame *)(::AfxGetApp()->m_pMainWnd))->Tmview;
        CTreeCtrl &mtree=mview->GetTreeCtrl();
		mtree.InsertItem(LPCTSTR(newr->name),TVI_ROOT,TVI_LAST);
	}
}

BOOL CDatabaseDoc::ExecuteSql(CString sql)
{
    return TRUE;
	
}

⌨️ 快捷键说明

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