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

📄 btdebug.c

📁 btree的实现源代码
💻 C
字号:
#include <stdio.h>#include "treelib.h"#include "btree.h"#include "debug.h"long atol();void pad(char *, int);void GetTreeInfo(BTREE *tree);main(int argc,char **argv){	char 	indxbuff[40];	char 	buff1[65];	char 	buff2[65];	int 	dups,reply,quit,index_exists,tfd,tok,lng,stat,print_key;	struct 	KeyGroup 	k,*kp;	union 	Key 		bk;	long	update_val;	char 	file[15];	char 	command[95];	struct 	Current_Key;	char 	buffer[BUFSIZ];	long 	current_node;        BTREE * btree;        int dblevel;	fprintf(stderr,"==========================================================\n");	fprintf(stderr,"        Test program to exercise the B+Tree\n");	fprintf(stderr,"Copr. 1991 Larry A. Walker & Co. Sterling, Va 22170\n");	fprintf(stderr,"==========================================================\n");	/**/	/* Get the name of the index*/	/**/	if(argc == 2){		strcpy(indxbuff,*(argv+1));	}else{		fprintf(stderr,"\n\nWhat is the name of the index\n: ");		gets(indxbuff);	}	index_exists = ( (tfd=open(indxbuff,O_RDONLY)) == -1 )?0:1;	if(index_exists){		close(tfd);		dups = 0;		lng = 0;		tok = UNDEF_KEY;	}else{		/**/		/* Duplicates required needed for opening new index*/		/**/		fprintf(stderr,"1.  Duplicates allowed.\n");		fprintf(stderr,"2.  No duplicates allowed.\n");		fprintf(stderr,"\nEnter a number to select an item.\n: ");		gets(buff1);		dups=atoi(buff1);		if( (dups < 1) || (dups > 2) ){			fprintf(stderr,"Must be either 1 or 2\n");			exit(1);		}		dups=(dups == 2)?0:1;		/**/		/* Type of key required for opening new index*/		/**/		fprintf(stderr,"Please enter the type of key to use.\n");		fprintf(stderr,"%d.  Variable length keys\n",VAR_LNG_KEY);		fprintf(stderr,"%d.  Fixed length keys\n",FIX_LNG_KEY);		fprintf(stderr,"%d.  Long keys\n",LONG_KEY);		fprintf(stderr,"%d.  Double keys\n",DOUBLE_KEY);		fprintf(stderr,"\nEnter a number to select an item.\n: ");		gets(buff1);		tok=atoi(buff1);		switch(tok){			case VAR_LNG_KEY:				lng = -1;				break;			case FIX_LNG_KEY:				fprintf(stderr,"Please enter the key length.\n: ");				gets(buff1);				lng = atoi(buff1);				break;			case LONG_KEY:				lng = sizeof(long);				break;			case DOUBLE_KEY:				lng = sizeof(double);				break;			default:				fprintf(stderr,"Invalid response.\n");				exit(1);				break;		}	}	/* index_name, create, type of key, */	/* duplicates, fixed length key size*/		btree = OpenBtree( indxbuff, (index_exists)?0:CREATE, tok, dups, lng);	if(btree == NULL){		fprintf(stderr, "Can't open index %s\n", indxbuff);		exit(1);	}	/* If you already know the index exists, you can open it*/	/* with default parameters as "Btree tree(indxbuff)"*/	/* test the install routine*/		if(tok == UNDEF_KEY){		tok = (int)btree->type_of_key;		GetTreeInfo(btree);	}        printf("1. No debugging\n");        printf("2. Debug level \n");        printf("3. Trace level \n");        printf("\nEnter a number to select an item.\n: ");        gets(buff2);        dblevel = (atoi(buff2));        if( dblevel < 1 || dblevel > 3){                fprintf(stderr, "Debugging Must be either 1, 2, or 3\n");                exit(1);        }        if(dblevel == 3)                debug_open( TRACE, "btdebug.log");        else                if(dblevel == 2)                        debug_open( DEBUG, "btdebug.log");	quit=0;	while(!quit) {		print_key = 0;			fprintf(stderr,"\n===========================================\n");		fprintf(stderr,"|Pick an operation to perform on the index|\n");		fprintf(stderr,"|f.  Find a key   i.  Insert a key        |\n");		fprintf(stderr,"|d.  Delete a key n.  Next key            |\n");		fprintf(stderr,"|p.  Prior key    t.  First key           |\n");		fprintf(stderr,"|l.  Last key     c.  Current key         |\n");		fprintf(stderr,"|x.  Exit/Quit    u.  Update              |\n");		fprintf(stderr,"|m.  Dump         e.  Examine             |\n");		fprintf(stderr,"|g.  Get Tree Info                        |\n");		fprintf(stderr, "===========================================\n");		fprintf(stderr, ": ");		gets(buff2);		reply = buff2[0];		print_key = 0;		switch(reply) {			case 'g':			case 'G':				GetTreeInfo(btree);				break;			case 'f':			case 'F':				fprintf(stderr,"Check index for what key?\n: ");				gets(buff2);				fprintf(stderr,"finding ->%s<-\n",buff2);				switch(tok){					case VAR_LNG_KEY:						create_index_string(bk.key,buff2);						break;					case FIX_LNG_KEY:						if(strlen(buff2) < lng )							pad(buff2,lng);						memcpy(bk.key,buff2,lng);						break;					case LONG_KEY:						bk.long_key = atol(buff2);						break;					case DOUBLE_KEY:						bk.double_key = atof(buff2);						break;				}				if(Locate(btree,&bk) == FAIL) {					fprintf(stderr,"not in index\n");					break;				} else {					if( (kp = CurrentKey(btree)) == NULL) {						fprintf(stderr,"No current key\n");						break;					}				}				print_key = 1;				break;				case 'd':			case 'D':				fprintf(stderr,"What key to delete\n: ");				gets(buff2);				switch(tok){					case VAR_LNG_KEY:						create_index_string(bk.key,buff2);						break;					case FIX_LNG_KEY:						if(strlen(buff2) < lng )							pad(buff2,lng);						memcpy(bk.key,buff2,lng);						break;					case LONG_KEY:						bk.long_key = atol(buff2);						break;					case DOUBLE_KEY:						bk.double_key = atof(buff2);						break;				}				if( (stat = DeleteKey(btree,&bk)) == FAIL) {					fprintf(stderr,"Key not deleted\n");				}				else fprintf(stderr,"Successful delete\n");				break;					case 'i':			case 'I':				fprintf(stderr,"What key to add\n: ");				gets(buff1);				switch(tok){					case VAR_LNG_KEY:						create_index_string(k.k.key,buff1);						break;					case FIX_LNG_KEY:						if(strlen(buff1) < lng )							pad(buff1,lng);						memcpy(k.k.key,buff1,lng);						break;					case LONG_KEY:						k.k.long_key = atol(buff1);						break;					case DOUBLE_KEY:						k.k.double_key = atof(buff1);						break;				}				fprintf(stderr,"What data\n: ");				gets(buff2);				k.KeyData.address = atol(buff2);				if( (stat = InsertKey(btree,&k) ) == FAIL){					fprintf(stderr,"Key add failed\n");				}				break;					case 'n':			case 'N':					kp = Increment(btree);				if(kp == NULL){					fprintf(stderr,"next key not found\n");					break;				}				print_key = 1;				break;					case 'p':			case 'P':					kp = Decrement(btree);				if(kp == NULL){					fprintf(stderr,"previous key not found\n");					break;				}				print_key = 1;				break;				case 't':			case 'T':					kp=First(btree);				if(kp == NULL){					fprintf(stderr,"first key not found\n");					break;				}				print_key = 1;				break;					case 'l':			case 'L':					kp=Last(btree);				if(kp == NULL){					fprintf(stderr,"last key not found\n");					break;				}				print_key = 1;				break;					case 'c':			case 'C':					if((kp=CurrentKey(btree)) == NULL) {					fprintf(stderr,"No current key\n");					break;				}				print_key = 1;				break;				case 'x':			case 'X':			case 'q':			case 'Q':				quit=1;				break;			case 'U':			case 'u':				fprintf(stderr,"What data\n: ");				gets(buff2);				update_val = atol(buff2);				if(!Update(btree,&update_val))					fprintf(stderr,"Failed\n");				print_key = 1;				break;			case 'M':			case 'm':				fprintf(stderr, "Output to a file (dump.out)?\n");				gets(buff2);				if( buff2[0] == 'y' || buff2[0] == 'Y'){					int local_fd;					local_fd = 					  open("dump.out", O_WRONLY|O_CREAT|O_TRUNC, 0666);					if(local_fd == -1){						fprintf(stderr, "Error opening\ file dump.out\n");						Close(btree);						exit(0);					}					close(1);					close(2);					dup(local_fd);					dup(local_fd);				}				DumpBtree(btree);				Close(btree);				exit(0);				break;			case 'E':			case 'e':/*				get_info(btree, (struct bfh_data *)&b);*/				current_node = btree->rootnode;				do{					printf("NODE: %ld\n", current_node);					GetPrintNode(btree,current_node);					printf("\nEnter new node ID\n: ");					gets(buffer);					if( (buffer[0] > '9')  ||  (buffer[0] < '1') )						break;					current_node = atol(buffer);				}while(1);				break;			}		if(print_key){			switch(tok){				case VAR_LNG_KEY:					create_c_string(buff1,kp->k.key);					fprintf(stderr,"found ->%s<-\ndata -> %ld\n",buff1, kp->KeyData.address);					break;				case FIX_LNG_KEY:					/* this doesnt take care of */					/* a fix length key being*/					/* a struct of info*/					memcpy(buff1,kp->k.key,btree->fix_lng_key_lng);					buff1[btree->fix_lng_key_lng] = 0;												fprintf(stderr,"found ->%s<-\ndata -> %ld\n",buff1, kp->KeyData.address);					break;				case LONG_KEY:					fprintf(stderr,"found ->%ld<-\ndata -> %ld\n",kp->k.long_key, kp->KeyData.address);					break;				case DOUBLE_KEY:					fprintf(stderr,"found ->%f<-\ndata -> %ld\n",kp->k.double_key, kp->KeyData.address);					break;				}		}	}	Close(btree);	exit(0);}/**//* pad an area with null values to a length*//**/void pad( char *ptr ,int lng){	int i;	for(i = strlen(ptr); i < lng; i++ ){		*(ptr+i) = (char)0;	}}void GetTreeInfo(BTREE *btree){			PrintBtDescriptor( btree );	PrintBfhDescriptor( btree->bfh );/*	tok = (int)btree->type_of_key;	dups = (int)btree->duplicates;	lng = (int)ReportState(btree,KEY_LENGTH);	fprintf(stderr,"Type of key = ");	switch(tok){		case VAR_LNG_KEY:			fprintf(stderr,"VAR_LNG_KEY");			break;		case FIX_LNG_KEY:			fprintf(stderr,"FIX_LNG_KEY");			break;		case LONG_KEY:			fprintf(stderr,"LONG_KEY");			break;		case DOUBLE_KEY:			fprintf(stderr,"DOUBLE_KEY");			break;	}	fprintf(stderr," duplicates = %s ",(dups)?"YES":"NO");	fprintf(stderr," key length = %d ",lng);	tme = (time_t)btree->time_of_last_close;	t_ptr = ctime(&tme) ;	fprintf(stderr,"\n number of keys = %ld, last access %s", 		btree->number_of_keys, t_ptr);	fprintf(stderr," Tree Exhausted = %s\n",(btree->exhausted))?		"TRUE":"FALSE");*/}

⌨️ 快捷键说明

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