📄 databasedoc.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 + -