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

📄 dbms.cpp

📁 这是一个基于dos的dbms
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{ ClrLine(1,25);
	  PSat(1,25,"文件被修改,是否保存?[Y/N]<Y>");
	  char c=getch();
	  if(c=='y'||c=='Y'||c=='\r'||c=='\n')  Save();
	}
	if(Header.Next!=0) {Release(); Header.Next=CurRec=0;}
	fclose(fp);
	strcpy(FileName,"Untitled.YDB"); /////
	Modified=0;
	State=0;
	Release();
 }
////////////////////////////////////////////////////////////
void TDBF::ListStruct()
 {
  textcolor(RED);
  PSat(20,5,"字段名           字段长度");
  textcolor(YELLOW);
  Line(1,6,79);
  for(int i=0;i<FieldCount;i++)
	{ PSat( 20,7+i,FieldName[i]);
	  char s[11];
	  itoa(FieldWidth[i],s,10);
	  PSat(43,7+i,s);
	}
}
////////////////////////////////////////////////////////////
void TDBF::Goto(word NO)
 {
  TRecord *T=Header.Next;
  while(T!=0&&T->NO!=NO) T=T->Next;
  if(T!=0) CurRec=T;
 }
////////////////////////////////////////////////////////////
void TDBF::Del(word no)
 {
  if(no<1||no>RecCount) return;
  TRecord *t=CurRec;
  int f=1;
  if(CurRec->NO==no)
	 { f=0;
		if(CurRec->Flag=='D')t=t->Next;
	 }
  Goto(no);
  if(CurRec->Flag==' '){ CurRec->Flag='D';CurRec=t; return;}
  if(CurRec->Next!=0) CurRec->Next->Prev=CurRec->Prev;
  if(CurRec->Prev!=0) CurRec->Prev->Next=CurRec->Next;
  RecCount--;
  for(int i=0;i<FieldCount;i++)
	delete CurRec->Values[i];
  delete CurRec;
  Modified=1;
  CurRec=t;
  if(f)  t=t->Next;
  while(t){ t->NO--;t=t->Next;}
 }
////////////////////////////////////////////////////////////
void TDBF::Recall(word no)
 {
  TRecord *t=CurRec;
  Goto(no);
  if(CurRec->Flag=='D'){CurRec->Flag=' ';Modified=1;}
  CurRec=t;

 }
////////////////////////////////////////////////////////////
void State(int whitch=0)
 {
  MenuDraw();
  PSat(1,5," 工作区间      是否被用        文件名        记录数");
  Line(1,6,80);
  gotoxy(1,7);
  if(whitch==0)
  for(int j=0;j<10;j++)
  {
  if(j==CurWork) putch('>');
  else putch(' ');
  if(DBF[j].State==0)
	  cprintf("  %3c           没有         ---------       -----\n\r",	j+'A');
	else
	 cprintf("  %3c           已用          %-15s     %d\n\r",
					 j+'A',DBF[j].FileName,DBF[j].RecCount);
	}
	else if(DBF[whitch].State==0)
		  cprintf("  %3c           没有        ---------        -----\n\r",	whitch+'A');
		  else cprintf("  %3c           已用        %-15s     %d\n\r",
					 whitch+'A',DBF[whitch].FileName,DBF[whitch].RecCount);
  }
////////////////////////////////////////////////////////////
void TDBF::GoTop() { Goto(1); }
////////////////////////////////////////////////////////////
void TDBF::GoBottom() {  Goto(RecCount); }
////////////////////////////////////////////////////////////
void Command()
 {
  char *p=cmdstr;
	Cursor=0x0000;
	ShowCursor();
	clrscr();
	window(1,1,80,25);
loop:
	gettime(&Time);
	ClrLine(1,1);
	cprintf(" YKH 数据库管理统系-[当前工作区间%c-->%s]",CurWork+'A',DBF[CurWork].FileName);
	gotoxy(69,1);
	cprintf("[%2d:%2d:%2d]",Time.ti_hour,Time.ti_min,Time.ti_sec);
	textcolor(BLUE);  Line(1,2,80);
	textcolor(YELLOW);
	MenuDraw();
	ClrLine(1,25);
	PSat(1,25,"命令:");
	char s[80];
	gotoxy(6,25);
	int tk=bioskey(0);
	PSM sm=HaveShortKey(tk);
	if(sm) {SelectSM(sm);goto loop;}
	else {s[1]=1; s[2]=tk;}
	s[0]=80;cgets(s);
	if(s[1]==0||s[2]==27) goto loop;
	strcpy(cmdstr,s+2);
	p=cmdstr;
	gotoxy(1,25);cputs("命令:");
	while(isspace(*p)) p++;
	if(!strncmpi(p,"del",3)||!strncmpi(p,"删除",4))        /// command " del "
		{p+=(!strncmpi(p,"del",3)? 3:4);
		while((*p==' '||isalpha(*p))&&*p!='\n'&&*p!='\r') p++;
		if(*p=='\n'||*p=='\r'||*p=='\0')
			for(int i=1;i<=DBF[CurWork].RecCount;i++) DBF[CurWork].Del(i);
		  else while(1){
				  DBF[CurWork].Del(atoi(p));
				  p=strchr(p,','); if(p){ p++;continue;}
				  else break;
				  }
		  goto loop;
		}
	if(!strncmpi(p,"recall",6)||!strncmpi(p,"恢复",4))  // command " Recall"
		{ while(*p==' '||isalpha(*p)||*p&0x80) p++;
		  if(*p=='\n'||*p=='\r'||*p=='\0')
			 for(int i=1;i<=DBF[CurWork].RecCount;i++) DBF[CurWork].Recall(i);
		  else while(1){
				 DBF[CurWork].Recall(atoi(p));
				 p=strchr(p,','); if(p){ p++; continue;}
				 else break;
				 }
		  goto loop;
		}
	if(!strncmpi(p,"create",6)||!strncmpi(p,"new",3)||!strncmpi(p,"新建",4))
		 {	drawflag=1;
		 if(DBF[CurWork].State!=0)
		  { PSat(1,25,"当前工作区间的记录已被修改,保存吗?[Y/N/Cancel]<Y>:");
		  const char ch=getch();
		  if( ch=='Y'||ch=='y'||ch=='\n'){  DBF[CurWork].Save();	DBF[CurWork].Close();}
		  else if(ch=='c'||ch=='C') goto loop;
			 else DBF[CurWork].Close();
		  }
		  p+=(!strncmpi(p,"create",6)?6:(!strncmpi(p,"New",3)?3:4));
			while(*p==' ') p++;
		  if(*p=='\n'||*p=='\r'||*p=='\0')  DBF[CurWork].Create();
		  else   DBF[CurWork].Create(p);
		 goto loop;
		}
if(!strncmpi(p,"open",4)||!strncmpi(p,"use",3)||!strncmpi(p,"load",4)||!strncmpi(p,"打开",4))
		{
		 drawflag=1;
		 if(DBF[CurWork].State!=0)
		  {
		  PSat(1,25,"当前工作区间的记录已被修改,保存并关闭它吗?[Y/N/C取消]<Y>:");
		  const char ch=getch();
		  if( ch=='Y'||ch=='y'||ch=='\n'){  DBF[CurWork].Save();
														DBF[CurWork].Close();}
		  else if(ch=='c'||ch=='C') return;
			 else DBF[CurWork].Close();
		  }
		 p+=((!strncmpi(p,"open ",5)||!strncmpi(p,"打开 ",5))?4:3);
		 while(*p==' ') p++;
		 if(isalnum(*p)) DBF[CurWork].Load(p);
		 else DBF[CurWork].Load(NULL);goto loop;
		 }
	if(!strncmpi(p,"close",5)||!strncmpi(p,"关闭",4))
	  { drawflag=1;
		 DBF[CurWork].Close();goto loop;
	  }
	if(!strncmpi(p,"Save",4)||!strncmpi(p,"保存",4))
	  {DBF[CurWork].Save();goto loop;
	  }
	if(!strncmpi(p,"exit",4)||!strncmpi(p,"quit",4)||!strncmpi(p,"退出",4))
	  {Quit();goto loop;
		}
	if(!strncmpi(p,"select",6)||!strncmpi(p,"选择",4))
	  {drawflag=1;
		p+=(!strncmpi(p,"select",6)?6:4);
		 while(*p==' ') p++;
		 if(*p=='\0') CurWork=LastWork;
		 else if(isalnum(*p)&&*p>='A'&&*p<='J')  CurWork=*p-'A';
				else if(*p>='0'&&*p<='9')  CurWork=*p-'0';
						else  if(*p>='a'&&*p<='j')	 CurWork=*p-'a';
								else { PSat(1,25,"不是正确的工作区间!"); getch();}
	  }
  if(!strncmpi(p,"state",5)||!strncmpi(p,"状态",4))
	{drawflag=1;
	  p+=(!strncmpi(p,"state",5)?5:4);
	  while(*p==' ') p++;
	  if(*p=='\0') State();
	  else  State(isdigit(*p)?*p-'0':*p-'A');
	  goto loop;
	}
	if(!strncmpi(p,"Modify",6)||!strncmpi(p,"修改",4))
	  {p+=(!strncmpi(p,"modify",6)?6:4);
		while(*p==' ') p++;
		if(*p=='\0') DBF[CurWork].Modify();
		else DBF[CurWork].Modify(atoi(p));
	  }
	if(!strncmpi(p,"Add",3)||!strncmpi(p,"Ins",3)||!strncmpi(p,"添加",4))
	  {p+=(!strncmpi(p,"add",3)||(!strncmpi(p,"ins",3))?3:4);
		while(*p==' ') p++;
		if(*p=='\0')	DBF[CurWork].Add();
		else DBF[CurWork].Add(atoi(p));
		goto loop;}
	if(!strncmpi(p,"dir",3)||!strncmpi(p,"目录",4)) { drawflag=1;	Dir();goto loop;}
	if(*p=='!')
	 { drawflag=1;
		system(p+1);
		goto loop;}
	if(!strncmpi(p,"List",4)||!strncmpi(p,"清单",4))
	  { ListLine=5;
		drawflag=1;
		p+=4; while(*p==' ') p++;
		if(*p=='\0'){DBF[CurWork].List(1,DBF[CurWork].RecCount);goto loop;}
		int n1=atoi(p);while(isdigit(*p)||*p==' ')p++;
 itea:if(*p=='\0') { DBF[CurWork].List(n1,n1);goto loop;}
		if(*p=='-')
		 {  while(!isdigit(*p)) p++;
			 DBF[CurWork].List(n1,atoi(p));
			 while(isdigit(*p)||*p==' ') p++;
			 if(*p=='\0') goto loop;
			 while(isdigit(*p)||*p==' ') p++;
			 if(*p==',')
			  { n1=atoi(p); while(isdigit(*p)||*p==' ') p++; goto itea;}
		 }
		if(*p==',')
		 { DBF[CurWork].List(n1,n1);
			while(*p==' '||*p==',') p++;
			if(*p=='\0') goto loop;
			n1=atoi(p);
			while(isdigit(*p)) p++;
			goto itea;
		 }
		goto loop;
		}
	if(!strncmpi(p,"help",4)||!strncmpi(p,"帮助",4))
	 {
	  Help();goto loop;
	  }
	if(!strncmpi(p,"record",6)||!strncmpi(p,"记录",4))
	 {
	  gotoxy(1,24);
	  cprintf(" 当前记录是:%d",DBF[CurWork].CurRec->NO);
		goto loop;
	  }
	if(!strncmpi(p,"struct",6)||!strncmpi(p,"结构",4))
	  {
		drawflag=1;
	  DBF[CurWork].ListStruct();goto loop;
	  }
	if(!strncmpi(p,"clear",5)||!strncmpi(p,"cls",3)||!strncmpi(p,"清屏",4))
	  {
		drawflag=1;
		clrscr();goto loop;
		}
	if(!strncmpi(p,"skip",4))
	  {
		while(!isdigit(*p)&&*p!='\0')p++;
		int a;
		if(*p=='\0')a=1;
		 else a=atoi(p);
		 DBF[CurWork].Skip(a);
		 goto loop;
		}
	if(!strncmpi(p,"GOTO",4))
	 {
	  if(!strncmpi(p+5,"top",3)) { DBF[CurWork].GoTop();goto loop;}
	  else if(!strncmpi(p+5,"bottom",6)){ DBF[CurWork].GoBottom();goto loop;}
			 else	{ DBF[CurWork].Goto(atoi(p+5));goto loop;}
	 }
	if(!strncmpi(p,"Total",6)||!strncmpi(p,"统计",4))
	{
		gettime(&Time);
		ClrLine(1,25);
		cputs("命令:");
		ClrLine(1,1);
		cprintf(" YKH 数据库管理统系-[当前工作区间%c-->%s]",CurWork+'A',DBF[CurWork].FileName);
		gotoxy(69,1);
		cprintf("[%2d:%2d:%2d]",Time.ti_hour,Time.ti_min,Time.ti_sec);
		textcolor(BLUE);  Line(1,2,80);
		textcolor(YELLOW);
		gotoxy(2,18);cprintf("表文件 [%s]",DBF[CurWork].FileName);
		gotoxy(2,19);cprintf("统计[%d]个记录.",DBF[CurWork].RecCount);
		}
	goto loop;
  }
////////////////////////////////////////////////////////////
PSM smFile,smEdit,smSearch,smRecord,smHelp;
PMI miNew,miOpen,miClose,miCloseAll,miSave,miSaveAll,miPrint,miFileBlank,
    miDos,miExit;
PMI miCopy,miCut,miPaste,miEditBlank,miSwitch,miLast,miState;
PMI miFind,miReplace,miFindAgain;
PMI miEdit,miAdd,miList,miDel,miRecall,miRecallAll,miRecordBlank,miSort,miGoto,miGoTop,miGoBottom;
PMI miTopic,miCommand,miAbout;
////////////////////////////////////////////////////////////////////////
void New(){  DBF[CurWork].Create(NULL);}
void Open(){ DBF[CurWork].Load(NULL);}
void Close(){DBF[CurWork].Close();}
void CloseAll(){ int i=0;for(;i<10;i++) DBF[i].Close();}
void Save(){ DBF[CurWork].Save();}
void SaveAll(){ int i=0;for(;i<10;i++) DBF[i].Save();}
void Print(){Prompt("对不起,本版本还不支持此功能");}
void Dos(){PSat(1,25,"请输入DOS命令:"); char s[80];s[0]=80; cgets(s);if(s[1]==0) goto ret;system(s+2);getch();ret:ClrLine(1,25);}
void Copy(){Prompt("对不起,本版本还不支持此功能");}
void Cut(){Prompt("对不起,本版本还不支持此功能");}
void Paste(){Prompt("对不起,本版本还不支持此功能");}
void state(){ State(0);}
void Find(){Prompt("对不起,本版本还不支持此功能");}
void Replace(){Prompt("对不起,本版本还不支持此功能");}
void FindAgain(){Prompt("对不起,本版本还不支持此功能");}
void Edit(){DBF[CurWork].Modify(0);}
void Add(){DBF[CurWork].Add(0);}
void Del(){DBF[CurWork].Del(0);}
void RecallAll(){DBF[CurWork].Recall(0);}
void Recall(){ PSat(1,25,"请输入要恢复的记录号:");int no;InputInt(22,25,&no);DBF[CurWork].Recall(no);  }
void Goto(){PSat(1,25,"请输入目的记录号:");int no;InputInt(22,25,&no);DBF[CurWork].Goto(no); }
void GoTop(){ DBF[CurWork].GoTop();}
void GoBottom(){ DBF[CurWork].GoBottom();}
void Sort(){Prompt("对不起,本版本还不支持此功能");}
void Topic(){Prompt("对不起,本版本还不支持此功能");}
void command(){Help();}
void Switch(){ ClrLine(1,25);PSat(1,25,"请输入目的记录号:");int n;cscanf("%d",&n);CurWork=n<=9&&n>=0?n:CurWork;}
void Last(){ CurWork=LastWork;}
void List(){ DBF[CurWork].List();}
void About(){
 Rectangle(10,10,70,20);
 PSat(25,13,"YKH数据库管理系统 第2版");
 PSat(23,14,"版权所有(C)余康华 2002,2003");
 Prompt("敲任意键继续.....");
 ClrLine(1,25);
 PSat(1,25,"命令:");
 }
////////////////////////////////////////////////////////////////////////
void main() {
  char *copyrights[]={"        谢谢使用YKH数据库管理系统V2.0!\r\n",
		      "           版权所有(C) 2002. 余康华\n\r",
		      "            作者 :余康华 2002.4.1\n\r",
		      "     更多的信息请访问: http:ykhlab.iscool.net\n\r",
		      "  或者E-Mail至:Yukanghua@etang.com\n\r"};
  smFile=NewSM(3,3,15,"&F文件",kbAltF,0);
  smEdit=NewSM(6,3,25,"&E编辑",kbAltE,1);
  smSearch=NewSM(15,3,17,"&S查找",kbAltS,2);
  smRecord=NewSM(25,3,15,"&R记录",kbAltR,3);
  smHelp=NewSM(35,3,15,"&H帮助",kbAltH,4);
  miNew=NewMI("&N新建",'N'-'A'+1  ,5,"新建表文件",New,NULL);
  miOpen=NewMI("&O打开",'O'-'A'+1 ,6,"打开表文件",Open,NULL);
  miClose=NewMI("&C关闭",3,        7,"关闭当前文件",Close,NULL);
  miCloseAll=NewMI("&A全部关闭",1,   8,"关闭全部打开的文件",CloseAll,NULL);
  miSave=NewMI("&S保存",'S'-'A'+1, 9,"保存当前表文件",Save,NULL);
  miSaveAll=NewMI("&V全部保存",'V'-'A'+1,10,"保存全部打开的文件",SaveAll,NULL);
  miPrint=NewMI("&P打印",'P'-'A'+1,11,"打印当前表文件",Print,NULL);
  miFileBlank=NewMI("\\",0,0,NULL,VOID,NULL);
  miEditBlank=NewMI("\\",0,0,NULL,VOID,NULL);
  miRecordBlank=NewMI("\\",0,0,NULL,VOID,NULL);
  miDos=NewMI("&DOS命令",4,        12,"执行DOS命令",Dos,NULL);
  miExit=NewMI("&E退出",5,         13,"退出系统",Quit,NULL);
  AddMI(smFile,miNew);	    AddMI(smFile,miOpen);
  AddMI(smFile,miClose);    AddMI(smFile,miClose);
  AddMI(smFile,miCloseAll); AddMI(smFile,miSave);
  AddMI(smFile,miSaveAll);  AddMI(smFile,miPrint);
  AddMI(smFile,miFileBlank);AddMI(smFile,miDos);
  AddMI(smFile,miExit);

  miCopy=NewMI("&C复制",3,13,"复制",Copy,NULL);
  miCut=NewMI("&T剪切",'T'-'A'+1,14,"剪切",Cut,NULL);
  miPaste=NewMI("&P粘贴",'P'-'A'+1,15,"粘贴",Paste,NULL);
  miSwitch=NewMI("&W切换到...",'w'-'a'+1,40,"切换到指定工作区间",Switch,NULL);
  miLast=NewMI("&L最后一次工作区间",'l'-'a'+1,50,"切换到最后一次工作区间",Last,NULL);
  miState=NewMI("&S状态",'s'-'a'+1,16,"工作区间使用状态",state,NULL);
  AddMI(smEdit,miCopy);    AddMI(smEdit,miCut);
  AddMI(smEdit,miPaste);   AddMI(smEdit,miEditBlank);
  AddMI(smEdit,miLast);AddMI(smEdit,miSwitch);
  AddMI(smEdit, miState);

  miFind=NewMI("&F查找",5,17,"查找",Find,NULL);
  miReplace=NewMI("&R替换",'r'-'a'+1,18,"替换",Replace,NULL);
  miFindAgain=NewMI("&A继续查找",1,19,"继续查找",FindAgain,NULL);
  AddMI(smSearch,miFind);  AddMI(smSearch,miReplace);
  AddMI(smSearch,miFindAgain);

  miEdit=NewMI("&E编辑",4,20,"编辑",Edit,NULL);
  miAdd=NewMI("&A添加",1,21,"添加",Add,NULL);
  miDel=NewMI("&D删除",4,22,"删除",Del,NULL);
  miRecall=NewMI("&R恢复",'r'-'a'+1,23,"恢复",Recall,NULL);
  miRecallAll=NewMI("&C全恢复",3,30,"全部恢复",RecallAll,NULL);
  miList=NewMI("&L记录清单",'l'-'a'+1,30,"显示记录清单",List,NULL);
  miSort=NewMI("&S排序",'s'-'a'+1,24,"排序",Sort,NULL);
  miGoto=NewMI("&G移动",8,26,"移动当前记录指针",Goto,NULL);
  miGoTop=NewMI("&F第一条记录",7,27,"移动到第一条记录",GoTop,NULL);
  miGoBottom=NewMI("&L最后一条记录",'l'-'a'+1,28,"移动到最后一条记录",GoBottom,NULL);
  AddMI(smRecord,miEdit); AddMI(smRecord,miAdd);
  AddMI(smRecord,miDel); AddMI(smRecord,miRecall);
  AddMI(smRecord,miRecallAll);AddMI(smRecord,miList);
  AddMI(smRecord,miRecordBlank);
  AddMI(smRecord,miGoto);  AddMI(smRecord,miGoTop);
  AddMI(smRecord,miGoBottom);AddMI(smRecord,miSort);

  miTopic=NewMI("&T主题",'t'-'a'+1,25,"主题",Topic,NULL);
  miCommand=NewMI("&C命令",3,      26,"命令",command,NULL);
  miAbout=NewMI("&A关于...",1,     27,"关于本系统",About,NULL);
  AddMI(smHelp,miTopic); AddMI(smHelp,miCommand);
  AddMI(smHelp,miAbout);

  AddSM(smFile);AddSM(smEdit);AddSM(smSearch);AddSM(smRecord);AddSM(smHelp);
  clrscr();
  textcolor(YELLOW);
  HideCursor();
  Rectangle(10,5,70,20);
  for(int i=0;i<6;i++){ PSat(15,10+i,copyrights[i]); }
  getch();
  MenuDraw();
  window(1,3,80,25);
  ShowCursor();
  CurWork=0;
  Command();
 }
////////////////////////////////////////////////////////////
void Quit() {
 for(int i=0;i<10;i++)
 if(DBF[i].Modified&&DBF[CurWork].fp!=NULL)
  {      ClrLine(1,25);
	 gotoxy(1,25);
	 cprintf("工作区间%c--文件:[%s]没有保存,是否保存?[Y/N/Cancel]<Y>",i+'A',DBF[i].FileName);
	 char c=getch();
	 if(c=='c'||c=='C') return;
	 if(c=='y'||c=='Y'||c=='\n') DBF[i].Save();
  }
  clrscr();
  exit(0);
 }
////////////////////////////////////////////////////////////////////////
void Help()
 {
	  ClrLine(1,25);
	  textcolor(RED);
	  PSat(33,5,"系统命令:");
	  Line(1,6,80);
	  textcolor(YELLOW);
	  PSat(5,7,"1.新建/new/create [文件名]         2. 打开/load/open [文件名]");
	  PSat(5,8,"3.保存/save                        4. 状态/state");
	  PSat(5,9,"5.退出/exit/quit                   6. 帮助/help");
	  PSat(5,10,"7.统计/total                       8. GOTO ");
	  PSat(5,11,"9.SKIP [偏移个数]                  10. DIR/目录");
	  PSat(4,12,"11.!DOS命令                       12. 结构/struct "  );
	  PSat(4,13,"13.modify/修改 [记录号]             14. 记录/record");
	  PSat(4,14,"15.清屏/clear/cls                  16. 添加/add/ins [插入位置]");
	  PSat(4,15,"17.关闭/close                      18. 选择/select [工作区间]");
	  PSat(4,16,"19.清单/list [位置] 或 [起始-结束]");
	 return;
	}
////////////////////////////////////////////////////////////////////////
void Dir()
{
  struct find_t ffblk;
  int done,tab=1,num=0;
  window(1,4,79,24);
  done = _dos_findfirst("*.YDB",_A_NORMAL,&ffblk);
  while (!done) {
	 cprintf(" %s     ", ffblk.name);
	 done = _dos_findnext(&ffblk);
	 num++;
	 if(tab++%5==0) cputs("\n\r");
  }
 cprintf("\n\r当前目录共有表文件%d个",num);
 window(1,1,80,25);
}

⌨️ 快捷键说明

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