DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T d

⟦44303f614⟧ TextFile

    Length: 7897 (0x1ed9)
    Types: TextFile
    Names: »dbexample.c«

Derivation

└─⟦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« 

TextFile

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