|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 7897 (0x1ed9) Types: TextFile Names: »dbexample.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/others/rdbm/dbexample.c« └─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/others/rdbm/dbexample.c«
/* Program dbexample * Written March 1988, William J. Romine * Purpose This program provides a demonstration of a simple database * program using the dbm routines. It is designed to assist in * the development of remote operations dbm routines. */ #include <dbm.h> #undef NULL #include <stdio.h> #include <curses.h> #define UP 11 #define DOWN 10 #define RIGHT 12 #define LEFT 8 #define NEXT 13 #define ABORT 24 #define DONE 4 int dbopen(), dbclose(), dbedit(), dbadd(), dbdelete(), dbfind(), dbset(), dbnext(), dbfirst(), dblast(); #define DBOK 1 #define DBNOTOK 0 static struct m_foo { int strs; #define MAXSTRS 30 int xs[MAXSTRS]; int ys[MAXSTRS]; char str[MAXSTRS][80]; int items; int key; #define MAXITEMS 30 int size[MAXITEMS]; int xd[MAXITEMS]; int yd[MAXITEMS]; int up[MAXITEMS]; int down[MAXITEMS]; int right[MAXITEMS]; int left[MAXITEMS]; int next[MAXITEMS]; int where[MAXITEMS]; int rsize; } m; static char gstr[1025]; static void display(), eline(), tostr(), movexy(), blank(); static datum tokey(), todat(); static char edititem(), editstr(); main(argc,argv) int argc; char *argv[]; { char ch = ' '; if (argc != 2) { printf("Usage: dbexample host:file\n"); exit(1); } if (dbopen(argv[1]) != DBOK) exit(1); movexy(0,0); printw("(A)dd (V)iew (E)dit (D)elete (F)irst (N)ext e(X)it"); movexy(0,1); printw("Command:"); refresh(); while (ch != 'X') { editstr(12,1,&ch,1); ch = ( (ch >= 'a') && (ch <= 'z') ) ? ch - 'a' + 'A' : ch; eline(""); switch (ch) { case 'A': dbadd(); break; case 'V': dbfind(); break; case 'E': dbedit(); break; case 'D': dbdelete(); break; case 'F': dbfirst(); break; case 'N': dbnext(); break; case 'X': break; default: eline("Unknown command"); printw("%c",7); refresh(); break; } } dbclose(); exit(0); } int dbopen(fname) char *fname; { int i; FILE *fp; char mname[200]; initscr(); clear(); refresh(); if (dbminit(fname) != 0) { fprintf(stderr,"dbopen: cant open file, %s\n",fname); perror("dbopen"); return(DBNOTOK); } (void) strcpy(mname,fname); (void) strcat(mname,".msk"); if ((fp = fopen(mname,"r")) == (FILE *) NULL) { fprintf(stderr,"dbopen: cant open file %s\n",fname); perror("dbopen"); return(DBNOTOK); } fscanf(fp,"%d",&m.strs); for (i = 0; i < m.strs; i++) { if (fscanf(fp,"%d,%d,'%[^']'",&m.xs[i],&m.ys[i],m.str[i]) != 3) { fprintf(stderr,"dbopen: cant read mask file string %d\n",i); return(DBNOTOK); } movexy(m.xs[i],m.ys[i]); printw("%s",m.str[i]); } fscanf(fp,"%d,%d",&m.items,&m.key); m.rsize = 0; for (i = 0; i < m.items; i++) { if (fscanf(fp,"%d,%d,%d,%d,%d,%d,%d,%d",&m.size[i],&m.xd[i], &m.yd[i],&m.up[i],&m.down[i],&m.right[i], &m.left[i],&m.next[i]) != 8) { fprintf(stderr,"dbopen: cant read mask file item %d\n",i); return(DBNOTOK); } m.where[i] = m.rsize; m.rsize += m.size[i]; } (void) fclose(fp); refresh(); return(DBOK); } int dbclose() { clear(); refresh(); endwin(); return(DBOK); } int dbedit() { datum key; datum dat; if (dbfind() == DBOK) { key = tokey(gstr); delete(key); if (editdata() == DBOK) { dat = todat(gstr); store(key,dat); eline("Record updated"); return(DBOK); } else { dat = fetch(key); tostr(dat,gstr); display(gstr); eline("Record not updated"); } } return(DBNOTOK); } int dbdelete() { datum key; if (dbfind() == DBOK) { key = tokey(gstr); if (delete(key) == 0) { eline("Record removed"); return(DBOK); } else eline("dbdelete: delete returned non zero"); } return(DBNOTOK); } int dbadd() { datum key, dat; blank(gstr); if (editdata() != DBOK) return(DBNOTOK); key = tokey(gstr); dat = fetch(key); if (dat.dsize == 0) { dat = todat(gstr); if (store(key,dat) != 0) eline("dblib:add:store returned non zero"); return(DBOK); } else eline("That key already exists...record not added"); return(DBNOTOK); } int dbfind() { datum key, dat; blank(gstr); display(gstr); (void) edititem(m.key); key = tokey(gstr); dat = fetch(key); if (dat.dsize == 0) { blank(gstr); display(gstr); eline("Cant find that record"); return(DBNOTOK); } tostr(dat,gstr); display(gstr); return(DBOK); } int dbfirst() { datum key, dat; key = firstkey(); dat = fetch(key); tostr(dat,gstr); display(gstr); return(DBOK); } int dbnext() { datum dat, key; key = tokey(gstr); key = nextkey(key); dat = fetch(key); if (dat.dsize == 0) { eline("No more records"); return(DBNOTOK); } tostr(dat,gstr); display(gstr); return(DBOK); } static int editdata() { int item; eline("Press ^D when done, or ^X to abort edit"); display(gstr); item = m.key; while (1) { switch ((int) edititem(item)) { case UP: item = m.up[item]; break; case DOWN: item = m.down[item]; break; case RIGHT: item = m.right[item]; break; case LEFT: item = m.left[item]; break; case NEXT: item = m.next[item]; break; case DONE: eline(""); return(DBOK); case ABORT: eline(""); return(DBNOTOK); default: clear(); refresh(); fprintf(stderr,"dblib: Unidentified return from edititem\n"); fprintf(stderr,"dblib: program aborted.\n"); } } } static char edititem(item) int item; { return(editstr(m.xd[item],m.yd[item],&gstr[m.where[item]],m.size[item])); } static char editstr(x,y,str,len) int x, y, len; char *str; { char ch; int point = 0, flag = TRUE; raw(); noecho(); movexy(x,y); refresh(); while (flag == TRUE) { ch = fgetc(stdin) & 127; switch (ch) { case 0: break; case 3: exit(1); case UP: case DOWN: case NEXT: case DONE: case ABORT: flag = FALSE; break; case RIGHT: if (point < len) { point++; movexy(x+point,y); refresh(); } else flag = FALSE; break; case LEFT: if (point > 0) { point--; movexy(x+point,y); refresh(); } else flag = FALSE; break; case 127: if (point > 0) { point--; movexy(x+point,y); printw(" "); movexy(x+point,y); refresh(); str[point] = ' '; } else printw("%c",7); refresh(); break; default: if ( (ch >= ' ') && (ch <= 'z') && (point < len) ) { printw("%c",ch); str[point++] = ch; } else printw("%c",7); refresh(); } } echo(); noraw(); return(ch); } static void display(dat) char *dat; { int i, k, j = 0; for (i = 0; i < m.items; i++) { movexy(m.xd[i],m.yd[i]); for (k = 0; k < m.size[i]; k++) printw("%c",dat[j++]); } return; } static void eline(str) char *str; { movexy(0,2); printw(" "); movexy(0,2); printw("%s",str); refresh(); } static void tostr(key,dat) datum key; char *dat; { strncpy(dat,key.dptr,key.dsize); } static datum todat(str) char *str; { static datum dat; dat.dptr = str; dat.dsize = m.rsize; return(dat); } static datum tokey(str) char *str; { static datum key; key.dptr = &str[m.where[m.key]]; key.dsize = m.size[m.key]; return(key); } static void blank(str) char *str; { int i; for (i = 0; i < m.rsize; i++) str[i] = ' '; } static void movexy(x,y) int x, y; { if (x < 80) move(y,x); else move(y+1,x-80); }