/* Copyright (C) 1991, Marcus J. Ranum. All rights reserved. */ #ifndef lint static char RCSid[] = "$Header: /usr/users/mjr/hacks/umud/DB/RCS/loaddb.c,v 1.2 91/08/11 19:46:35 mjr Exp $"; #endif /* configure all options BEFORE including system stuff. */ #include "config.h" #include <stdio.h> #include "mud.h" extern char *optarg; extern int optind; extern int opterr; #ifdef DB_DIRHASH extern int dhdb_init(); extern int dhdb_travstart(); extern int dhdb_traverse(); extern int dhdb_travend(); extern int dhdb_put(); extern int dhdb_close(); #endif #ifdef DB_DBMFILE extern int dddb_init(); extern int dddb_travstart(); extern int dddb_traverse(); extern int dddb_travend(); extern int dddb_put(); extern int dddb_close(); #endif #ifdef DB_GDBMFILE extern int dgdb_init(); extern int dgdb_travstart(); extern int dgdb_traverse(); extern int dgdb_travend(); extern int dgdb_put(); extern int dgdb_close(); #endif main(ac,av) int ac; char **av; { int (*initin)() = 0; int (*objput)() = 0; int (*closer)() = 0; char obuf[MAXOID]; Obj *op; FILE *in = stdin; FILE *out = stdout; char typ = '\0'; char *fdir = (char *)0; char *cexp = (char *)0; int vflg = 0; int lflg = 0; int xflg = 0; int cnt = 0; int bflg = 0; int avsiz = 0; int losiz = 1000000; int hisiz = 0; int sflg = 0; #ifdef COMPRESS_OIF int cin = 0; /* input compressed */ int cout = 0; /* output compressed */ #endif int x; #ifdef COMPRESS_OIF comp_init(); #endif while((x = getopt(ac,av,"C:b:c:i:f:hsdgvlo:x")) != EOF) { switch(x) { #ifdef COMPRESS_OIF case 'C': if(*optarg == 'i') cin = 1; if(*optarg == 'o') cout = 1; break; #endif case 'i': in = fopen(optarg,"r"); if(in == (FILE *)0) { perror(optarg); exit(1); } break; case 'o': out = fopen(optarg,"w"); if(out == (FILE *)0) { perror(optarg); exit(1); } break; case 'b': bflg = atoi(optarg); if(bflg <= 0) { fprintf(stderr,"illegal size %s\n",optarg); exit(1); } break; #ifdef DB_DIRHASH case 'h': initin = dhdb_init; objput = dhdb_put; closer = dhdb_close; typ = 'h'; break; #endif #ifdef DB_DBMFILE case 'd': initin = dddb_init; objput = dddb_put; closer = dddb_close; typ = 'd'; break; #endif #ifdef DB_GDBMFILE case 'g': initin = dgdb_init; objput = dgdb_put; closer = dgdb_close; typ = 'g'; break; #endif case 'c': cexp = optarg; break; case 'f': fdir = optarg; break; case 'v': vflg++; break; case 's': sflg++; break; case 'x': xflg++; break; case 'l': lflg++; break; case '?': default: exit(usage()); } } if(!xflg && initin == 0) { fprintf(stderr,"what kind of database is this?\n"); exit(1); } if(fdir) { #ifdef DB_DIRHASH if(typ == 'h') { dhdb_sethpath(fdir); if(bflg) dhdb_sethsiz(bflg); } #endif #ifdef DB_DBMFILE if(typ == 'd') { dddb_setfile(fdir); if(bflg) dddb_setbsiz(bflg); } #endif #ifdef DB_GDBMFILE if(typ == 'g') dgdb_setfile(fdir); #endif } if(cexp != (char *)0 && setexpr(cexp)) exit(1); if(!xflg && (*initin)()) { fprintf(stderr,"cannot initialize db layer\n"); exit(1); } obuf[0] = '\0'; while(1) { tmp_sync(); #ifdef COMPRESS_OIF if(cin) comp_on(1); else comp_on(0); #endif op = oiffromFILE(in,obuf); if(op == (Obj *)0) break; if(obuf[0] == '\0') { fprintf(stderr,"unnamed object in input\n"); objfree(op); obuf[0] = '\0'; continue; } if(cexp != (char *)0 && checkexpr(obuf,op) == 0) { if(vflg) fprintf(stderr,"<- %s\n",obuf); objfree(op); obuf[0] = '\0'; continue; } if(sflg) { int nsiz; nsiz = oif_objsiz(op,obuf); avsiz = ((avsiz * cnt) + nsiz) / (cnt + 1); if(nsiz > hisiz) hisiz = nsiz; else if(nsiz < losiz) losiz = nsiz; } /* list only */ if(lflg) { printf("%s\n",obuf); objfree(op); obuf[0] = '\0'; cnt++; continue; } #ifdef COMPRESS_OIF if(cout) comp_on(1); else comp_on(0); #endif /* copy to stdout */ if(xflg) { oiftoFILE(op,out,obuf); objfree(op); obuf[0] = '\0'; cnt++; continue; } if((*objput)(op,obuf)) { fprintf(stderr,"cannot store object %s\n",obuf); objfree(op); obuf[0] = '\0'; continue; } else { cnt++; if(vflg) fprintf(stderr,"<+ %s\n",obuf); objfree(op); obuf[0] = '\0'; } } if(!xflg && (*closer)()) { fprintf(stderr,"cannot close db layer\n"); exit(1); } if(xflg) fprintf(stderr,"selected %d objects\n",cnt); else fprintf(stderr,"stored %d objects\n",cnt); if(sflg) fprintf(stderr,"object size: %d min, %d average, %d max\n", losiz,avsiz,hisiz); exit(0); } usage() { fprintf(stderr,"usage: loaddb -d|h|g|x [-f datapath] [-i infile]\n"); fprintf(stderr,"[-v (verbose)] [-l (list only)] [-o outfile]\n"); fprintf(stderr,"[-s (object size statistics)]\n"); fprintf(stderr,"[-c selection_expression]\n"); #ifdef COMPRESS_OIF fprintf(stderr,"[-C i (input is compressed)] [-C o (compress output)]\n"); #endif return(1); }