/* perform import command */ int doimport(const char *name, int bnum, int dnum, int bin){ CURIA *curia; char *buf, *kbuf, *vbuf, *ktmp, *vtmp; int i, err, ktsiz, vtsiz; /* open a database */ if(!(curia = cropen(name, CR_OWRITER | CR_OCREAT, bnum, dnum))){ pdperror(name); return 1; } /* loop for each line */ err = FALSE; for(i = 1; (buf = getl()) != NULL; i++){ kbuf = buf; if((vbuf = strchr(buf, '\t')) != NULL){ *vbuf = '\0'; vbuf++; /* store a record */ if(bin){ ktmp = cbbasedecode(kbuf, &ktsiz); vtmp = cbbasedecode(vbuf, &vtsiz); if(!crput(curia, ktmp, ktsiz, vtmp, vtsiz, CR_DOVER)){ pdperror(name); err = TRUE; } free(vtmp); free(ktmp); } else { if(!crput(curia, kbuf, -1, vbuf, -1, CR_DOVER)){ pdperror(name); err = TRUE; } } } else { fprintf(stderr, "%s: %s: invalid format in line %d\n", progname, name, i); } free(buf); if(err) break; } /* close the database */ if(!crclose(curia)){ pdperror(name); return 1; } return err ? 1 : 0; }
/* Store a record. */ int gdbm_store(GDBM_FILE dbf, datum key, datum content, int flag){ int dmode; assert(dbf); if(!key.dptr || key.dsize < 0 || !content.dptr || content.dsize < 0){ gdbm_errno = GDBM_ILLEGAL_DATA; return -1; } if(dbf->depot){ if(!dpwritable(dbf->depot)){ gdbm_errno = GDBM_READER_CANT_STORE; return -1; } dmode = (flag == GDBM_INSERT) ? DP_DKEEP : DP_DOVER; if(!dpput(dbf->depot, key.dptr, key.dsize, content.dptr, content.dsize, dmode)){ gdbm_errno = gdbm_geterrno(dpecode); if(dpecode == DP_EKEEP) return 1; return -1; } if(dbf->syncmode && !dpsync(dbf->depot)){ gdbm_errno = gdbm_geterrno(dpecode); return -1; } } else { if(!crwritable(dbf->curia)){ gdbm_errno = GDBM_READER_CANT_STORE; return -1; } dmode = (flag == GDBM_INSERT) ? CR_DKEEP : CR_DOVER; if(!crput(dbf->curia, key.dptr, key.dsize, content.dptr, content.dsize, dmode)){ gdbm_errno = gdbm_geterrno(dpecode); if(dpecode == DP_EKEEP) return 1; return -1; } if(dbf->syncmode && !crsync(dbf->curia)){ gdbm_errno = gdbm_geterrno(dpecode); return -1; } } return 0; }