File: tsidel.c

package info (click to toggle)
libtabe 0.2.6-1.2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 5,576 kB
  • ctags: 1,777
  • sloc: ansic: 17,458; sh: 9,848; makefile: 273
file content (127 lines) | stat: -rw-r--r-- 2,363 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 * Copyright 1999, TaBE Project, All Rights Reserved.
 * Copyright 1999, Pai-Hsiang Hsiao, All Rights Reserved.
 *
 * $Id: tsidel.c,v 1.4 2002/08/11 01:58:11 kcwu Exp $
 *
 */
#ifdef HAVE_CONFIG_H
#include "../config.h"
#endif

#ifdef HPUX
#  define _INCLUDE_POSIX_SOURCE
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include <db.h>
#include <tabe.h>
#include "../src/version.h"

#define BUF_SIZE 1000

void
usage(void)
{
  printf("tsidel: libtabe-%s\n", RELEASE_VER);
  printf("Usage: tsidel -d <TsiDB> [-f input file]\n");
  printf("   -d <TsiDB>     \t path to TsiDB\n");
  printf("   -f <input file>\t input file in plain text (default: stdin)\n");
  exit(0);
}

void
del(struct TsiDB *db, FILE *fp)
{
  struct TsiInfo *tsi;
  int rval, i, j;
  char buf[BUF_SIZE];
  DBT key;

  rval = db->RecordNumber(db);
  if (rval < 0) {
    fprintf(stderr, "tsidel: wrong DB format.\n");
    usage();
  }

  tsi = (struct TsiInfo *)malloc(sizeof(struct TsiInfo));
  memset(tsi, 0, sizeof(struct TsiInfo));
  tsi->tsi = (ZhiStr)malloc(sizeof(unsigned char)*80);
  memset(tsi->tsi, 0, 80);

  i = j = 0;
  while (1) {
    if (!fgets(buf, BUF_SIZE-1, fp)) {
      break;
    }
    sscanf(buf, "%80s", tsi->tsi);
    i++;
    rval = db->Get(db, tsi);
    if (!rval) {
      memset(&key, 0, sizeof(DBT));
      key.data = tsi->tsi;
      key.size = strlen((char *)tsi->tsi);
      rval = ((DB *)(db->dbp))->del((DB *)db->dbp, NULL, &key, 0);
      j++;
    }
    else {
      /* donothing */
    }
  }

  printf("There're %d queries, %d deleted.\n", i, j);
  db->Close(db);
}

int
main(int argc, char **argv)
{
  int ch;
  FILE *fp;
  struct TsiDB *db;
extern char *optarg;
extern int optind, opterr, optopt;

  char *db_name, *op_name;

  db_name = op_name = (char *)NULL;

  while ((ch = getopt(argc, argv, "d:f:")) != -1) {
    switch(ch) {
      case 'd':
        db_name = (char *)strdup(optarg);
        break;
      case 'f':
        op_name = (char *)strdup(optarg);
        break;
      default:
        usage();
        break;
    }
  }
  argc -= optind;
  argv += optind;

  if (!db_name) {
    usage();
  }

  db = tabeTsiDBOpen(DB_TYPE_DB, db_name, 0);
  if (!db) {
    usage();
  }

  if (op_name) {
    fp = fopen(op_name, "r");
    del(db, fp);
    fclose(fp);
  }
  else {
    del(db, stdin);
  }

  return(0);
}