|
|
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);
}