diff options
Diffstat (limited to 'qdbm/odmgr.c')
-rw-r--r-- | qdbm/odmgr.c | 1085 |
1 files changed, 0 insertions, 1085 deletions
diff --git a/qdbm/odmgr.c b/qdbm/odmgr.c deleted file mode 100644 index 7b688280..00000000 --- a/qdbm/odmgr.c +++ /dev/null @@ -1,1085 +0,0 @@ -/************************************************************************************************* - * Utility for debugging Odeum and its applications - * Copyright (C) 2000-2007 Mikio Hirabayashi - * This file is part of QDBM, Quick Database Manager. - * QDBM is free software; you can redistribute it and/or modify it under the terms of the GNU - * Lesser General Public License as published by the Free Software Foundation; either version - * 2.1 of the License or any later version. QDBM is distributed in the hope that it will be - * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * You should have received a copy of the GNU Lesser General Public License along with QDBM; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - * 02111-1307 USA. - *************************************************************************************************/ - - -#include <depot.h> -#include <cabin.h> -#include <odeum.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#undef TRUE -#define TRUE 1 /* boolean true */ -#undef FALSE -#define FALSE 0 /* boolean false */ - -#define MAXSRCHWORDS 256 /* max number of search words */ -#define WOCCRPOINT 10000 /* points per occurence */ -#define MAXKEYWORDS 8 /* max number of keywords */ -#define SUMMARYWIDTH 16 /* width of each phrase in a summary */ -#define MAXSUMMARY 128 /* max number of words in a summary */ - - -/* for RISC OS */ -#if defined(__riscos__) || defined(__riscos) -#include <unixlib/local.h> -int __riscosify_control = __RISCOSIFY_NO_PROCESS; -#endif - - -/* global variables */ -const char *progname; /* program name */ - - -/* function prototypes */ -int main(int argc, char **argv); -void usage(void); -char *readstdin(int *sp); -void otcb(const char *fname, ODEUM *odeum, const char *msg); -int runcreate(int argc, char **argv); -int runput(int argc, char **argv); -int runout(int argc, char **argv); -int runget(int argc, char **argv); -int runsearch(int argc, char **argv); -int runlist(int argc, char **argv); -int runoptimize(int argc, char **argv); -int runinform(int argc, char **argv); -int runmerge(int argc, char **argv); -int runremove(int argc, char **argv); -int runbreak(int argc, char **argv); -void pdperror(const char *name); -void printdoc(const ODDOC *doc, int tb, int hb, int score, ODEUM *odeum, const CBLIST *skeys); -char *docsummary(const ODDOC *doc, const CBLIST *kwords, int num, int hilight); -CBMAP *listtomap(const CBLIST *list); -int docreate(const char *name); -int doput(const char *name, const char *text, const char *uri, const char *title, - const char *author, const char *date, int wmax, int keep); -int doout(const char *name, const char *uri, int id); -int doget(const char *name, const char *uri, int id, int tb, int hb); -int dosearch(const char *name, const char *text, int max, int or, int idf, int ql, - int tb, int hb, int nb); -int dolist(const char *name, int tb, int hb); -int dooptimize(const char *name); -int doinform(const char *name); -int domerge(const char *name, const CBLIST *elems); -int doremove(const char *name); -int dobreak(const char *text, int hb, int kb, int sb); - - -/* main routine */ -int main(int argc, char **argv){ - char *env; - int rv; - cbstdiobin(); - progname = argv[0]; - if((env = getenv("QDBMDBGFD")) != NULL) dpdbgfd = atoi(env); - if(argc < 2) usage(); - rv = 0; - if(!strcmp(argv[1], "create")){ - odsetotcb(otcb); - rv = runcreate(argc, argv); - } else if(!strcmp(argv[1], "put")){ - odsetotcb(otcb); - rv = runput(argc, argv); - } else if(!strcmp(argv[1], "out")){ - odsetotcb(otcb); - rv = runout(argc, argv); - } else if(!strcmp(argv[1], "get")){ - rv = runget(argc, argv); - } else if(!strcmp(argv[1], "search")){ - rv = runsearch(argc, argv); - } else if(!strcmp(argv[1], "list")){ - rv = runlist(argc, argv); - } else if(!strcmp(argv[1], "optimize")){ - odsetotcb(otcb); - rv = runoptimize(argc, argv); - } else if(!strcmp(argv[1], "inform")){ - rv = runinform(argc, argv); - } else if(!strcmp(argv[1], "merge")){ - odsetotcb(otcb); - rv = runmerge(argc, argv); - } else if(!strcmp(argv[1], "remove")){ - rv = runremove(argc, argv); - } else if(!strcmp(argv[1], "break")){ - rv = runbreak(argc, argv); - } else if(!strcmp(argv[1], "version") || !strcmp(argv[1], "--version")){ - printf("Powered by QDBM version %s\n", dpversion); - printf("Copyright (c) 2000-2007 Mikio Hirabayashi\n"); - rv = 0; - } else { - usage(); - } - return rv; -} - - -/* print the usage and exit */ -void usage(void){ - fprintf(stderr, "%s: administration utility for Odeum\n", progname); - fprintf(stderr, "\n"); - fprintf(stderr, "usage:\n"); - fprintf(stderr, " %s create name\n", progname); - fprintf(stderr, " %s put [-uri str] [-title str] [-author str] [-date str]" - " [-wmax num] [-keep] name [file]\n", progname); - fprintf(stderr, " %s out [-id] name expr\n", progname); - fprintf(stderr, " %s get [-id] [-t|-h] name expr\n", progname); - fprintf(stderr, " %s search [-max num] [-or] [-idf] [-t|-h|-n] name words...\n", progname); - fprintf(stderr, " %s list [-t|-h] name\n", progname); - fprintf(stderr, " %s optimize name\n", progname); - fprintf(stderr, " %s inform name\n", progname); - fprintf(stderr, " %s merge name elems...\n", progname); - fprintf(stderr, " %s remove name\n", progname); - fprintf(stderr, " %s break [-h|-k|-s] [file]\n", progname); - fprintf(stderr, " %s version\n", progname); - fprintf(stderr, "\n"); - exit(1); -} - - -/* read the standard input */ -char *readstdin(int *sp){ - char *buf; - int i, blen, c; - blen = 256; - buf = cbmalloc(blen); - for(i = 0; (c = getchar()) != EOF; i++){ - if(i >= blen - 1) buf = cbrealloc(buf, blen *= 2); - buf[i] = c; - } - buf[i] = '\0'; - *sp = i; - return buf; -} - - -/* report the outturn */ -void otcb(const char *fname, ODEUM *odeum, const char *msg){ - char *name; - name = odname(odeum); - printf("%s: %s: %s: %s\n", progname, fname, name, msg); - free(name); -} - - -/* parse arguments of create command */ -int runcreate(int argc, char **argv){ - char *name; - int i, rv; - name = NULL; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - usage(); - } else if(!name){ - name = argv[i]; - } else { - usage(); - } - } - if(!name) usage(); - rv = docreate(name); - return rv; -} - - -/* parse arguments of put command */ -int runput(int argc, char **argv){ - char *name, *file, *uri, *title, *author, *date, *text; - int i, wmax, keep, size, rv; - name = NULL; - file = NULL; - uri = NULL; - title = NULL; - author = NULL; - date = NULL; - wmax = -1; - keep = FALSE; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-uri")){ - if(++i >= argc) usage(); - uri = argv[i]; - } else if(!strcmp(argv[i], "-uri")){ - if(++i >= argc) usage(); - uri = argv[i]; - } else if(!strcmp(argv[i], "-title")){ - if(++i >= argc) usage(); - title = argv[i]; - } else if(!strcmp(argv[i], "-author")){ - if(++i >= argc) usage(); - author = argv[i]; - } else if(!strcmp(argv[i], "-date")){ - if(++i >= argc) usage(); - date = argv[i]; - } else if(!strcmp(argv[i], "-wmax")){ - if(++i >= argc) usage(); - wmax = atoi(argv[i]); - } else if(!strcmp(argv[i], "-keep")){ - keep = TRUE; - } else { - usage(); - } - } else if(!name){ - name = argv[i]; - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - if(!name) usage(); - if(!uri) uri = file; - if(!uri) usage(); - if(file){ - if(!(text = cbreadfile(file, &size))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - text = readstdin(&size); - } - rv = doput(name, text, uri, title, author, date, wmax, keep); - free(text); - return rv; -} - - -/* parse arguments of out command */ -int runout(int argc, char **argv){ - char *name, *expr; - int i, ib, id, rv; - name = NULL; - expr = NULL; - ib = FALSE; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-id")){ - ib = TRUE; - } else { - usage(); - } - } else if(!name){ - name = argv[i]; - } else if(!expr){ - expr = argv[i]; - } else { - usage(); - } - } - if(!name || !expr) usage(); - id = -1; - if(ib){ - id = atoi(expr); - if(id < 1) usage(); - } - rv = doout(name, expr, id); - return rv; -} - - -/* parse arguments of get command */ -int runget(int argc, char **argv){ - char *name, *expr; - int i, ib, tb, hb, id, rv; - name = NULL; - expr = NULL; - ib = FALSE; - tb = FALSE; - hb = FALSE; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-id")){ - ib = TRUE; - } else if(!strcmp(argv[i], "-t")){ - tb = TRUE; - } else if(!strcmp(argv[i], "-h")){ - hb = TRUE; - } else { - usage(); - } - } else if(!name){ - name = argv[i]; - } else if(!expr){ - expr = argv[i]; - } else { - usage(); - } - } - if(!name || !expr) usage(); - id = -1; - if(ib){ - id = atoi(expr); - if(id < 1) usage(); - } - rv = doget(name, expr, id, tb, hb); - return rv; -} - - -/* parse arguments of search command */ -int runsearch(int argc, char **argv){ - char *name, *srchwords[MAXSRCHWORDS]; - int i, wnum, max, or, idf, ql, tb, hb, nb, rv; - CBDATUM *text; - name = NULL; - wnum = 0; - max = -1; - or = FALSE; - idf = FALSE; - ql = FALSE; - tb = FALSE; - hb = FALSE; - nb = FALSE; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-max")){ - if(++i >= argc) usage(); - max = atoi(argv[i]); - } else if(!strcmp(argv[i], "-or")){ - or = TRUE; - } else if(!strcmp(argv[i], "-idf")){ - idf = TRUE; - } else if(!strcmp(argv[i], "-ql")){ - ql = TRUE; - } else if(!strcmp(argv[i], "-t")){ - tb = TRUE; - } else if(!strcmp(argv[i], "-h")){ - hb = TRUE; - } else if(!strcmp(argv[i], "-n")){ - nb = TRUE; - } else { - usage(); - } - } else if(!name){ - name = argv[i]; - } else if(wnum < MAXSRCHWORDS){ - srchwords[wnum++] = argv[i]; - } - } - if(!name) usage(); - text = cbdatumopen(NULL, -1); - for(i = 0; i < wnum; i++){ - if(i > 0) cbdatumcat(text, " ", 1); - cbdatumcat(text, srchwords[i], -1); - } - rv = dosearch(name, cbdatumptr(text), max, or, idf, ql, tb, hb, nb); - cbdatumclose(text); - return rv; -} - - -/* parse arguments of list command */ -int runlist(int argc, char **argv){ - char *name; - int i, tb, hb, rv; - name = NULL; - tb = FALSE; - hb = FALSE; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-t")){ - tb = TRUE; - } else if(!strcmp(argv[i], "-h")){ - hb = TRUE; - } else { - usage(); - } - } else if(!name){ - name = argv[i]; - } else { - usage(); - } - } - if(!name) usage(); - rv = dolist(name, tb, hb); - return rv; -} - - -/* parse arguments of optimize command */ -int runoptimize(int argc, char **argv){ - char *name; - int i, rv; - name = NULL; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - usage(); - } else if(!name){ - name = argv[i]; - } else { - usage(); - } - } - if(!name) usage(); - rv = dooptimize(name); - return rv; -} - - -/* parse arguments of inform command */ -int runinform(int argc, char **argv){ - char *name; - int i, rv; - name = NULL; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - usage(); - } else if(!name){ - name = argv[i]; - } else { - usage(); - } - } - if(!name) usage(); - rv = doinform(name); - return rv; -} - - -/* parse arguments of merge command */ -int runmerge(int argc, char **argv){ - char *name; - CBLIST *elems; - int i, rv; - name = NULL; - elems = cblistopen(); - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - usage(); - } else if(!name){ - name = argv[i]; - } else { - cblistpush(elems, argv[i], -1); - } - } - if(!name) usage(); - if(cblistnum(elems) < 1){ - cblistclose(elems); - usage(); - } - rv = domerge(name, elems); - cblistclose(elems); - return rv; -} - - -/* parse arguments of remove command */ -int runremove(int argc, char **argv){ - char *name; - int i, rv; - name = NULL; - for(i = 2; i < argc; i++){ - if(!name && argv[i][0] == '-'){ - usage(); - } else if(!name){ - name = argv[i]; - } else { - usage(); - } - } - if(!name) usage(); - rv = doremove(name); - return rv; -} - - -/* parse arguments of break command */ -int runbreak(int argc, char **argv){ - char *file, *text; - int i, hb, kb, sb, size, rv; - file = NULL; - hb = FALSE; - kb = FALSE; - sb = FALSE; - for(i = 2; i < argc; i++){ - if(!file && argv[i][0] == '-'){ - if(!strcmp(argv[i], "-h")){ - hb = TRUE; - } else if(!strcmp(argv[i], "-k")){ - kb = TRUE; - } else if(!strcmp(argv[i], "-s")){ - sb = TRUE; - } else { - usage(); - } - } else if(!file){ - file = argv[i]; - } else { - usage(); - } - } - if(file){ - if(!(text = cbreadfile(file, &size))){ - fprintf(stderr, "%s: %s: cannot open\n", progname, file); - return 1; - } - } else { - text = readstdin(&size); - } - rv = dobreak(text, hb, kb, sb); - free(text); - return rv; -} - - -/* print an error message */ -void pdperror(const char *name){ - fprintf(stderr, "%s: %s: %s\n", progname, name, dperrmsg(dpecode)); -} - - -/* print the contents of a document */ -void printdoc(const ODDOC *doc, int tb, int hb, int score, ODEUM *odeum, const CBLIST *skeys){ - const CBLIST *words; - CBMAP *scores; - CBLIST *kwords; - const char *title, *author, *word, *date; - char *summary; - int i, wsiz; - title = oddocgetattr(doc, "title"); - author = oddocgetattr(doc, "author"); - date = oddocgetattr(doc, "date"); - if(hb){ - printf("ID: %d\n", oddocid(doc)); - printf("URI: %s\n", oddocuri(doc)); - if(title) printf("TITLE: %s\n", title); - if(author) printf("AUTHOR: %s\n", author); - if(date) printf("DATE: %s\n", date); - if(score >= 0) printf("SCORE: %d\n", score); - scores = oddocscores(doc, MAXKEYWORDS, odeum); - kwords = cblistopen(); - printf("KEYWORDS: "); - cbmapiterinit(scores); - while((word = cbmapiternext(scores, &wsiz)) != NULL){ - if(cblistnum(kwords) > 0) printf(", "); - printf("%s (%s)", word, cbmapget(scores, word, wsiz, NULL)); - cblistpush(kwords, word, wsiz); - } - putchar('\n'); - summary = docsummary(doc, skeys ? skeys : kwords, MAXSUMMARY, skeys != NULL); - printf("SUMMARY: %s\n", summary); - free(summary); - cblistclose(kwords); - cbmapclose(scores); - printf("\n\n"); - } else if(tb){ - printf("%d\t%s\t%s\t%s\t%s\t%d\n", oddocid(doc), oddocuri(doc), - title ? title : "", author ? author : "", date ? date : "", score); - words = oddocnwords(doc); - for(i = 0; i < cblistnum(words); i++){ - word = cblistval(words, i, &wsiz); - if(i > 0) putchar('\t'); - printf("%s", word); - } - putchar('\n'); - words = oddocawords(doc); - for(i = 0; i < cblistnum(words); i++){ - word = cblistval(words, i, &wsiz); - if(i > 0) putchar('\t'); - printf("%s", word); - } - putchar('\n'); - } else { - printf("%d\t%s\t%d\n", oddocid(doc), oddocuri(doc), score); - } -} - - -/* get a list handle contains summary of a document */ -char *docsummary(const ODDOC *doc, const CBLIST *kwords, int num, int hilight){ - const CBLIST *nwords, *awords; - CBMAP *kmap, *map; - const char *normal, *asis; - char *sbuf; - int i, j, bsiz, ssiz, lnum, nwsiz, awsiz, pv, bi, first; - bsiz = 256; - sbuf = cbmalloc(bsiz); - ssiz = 0; - nwords = oddocnwords(doc); - awords = oddocawords(doc); - kmap = listtomap(kwords); - map = listtomap(kwords); - lnum = cblistnum(nwords); - first = TRUE; - for(i = 0; i < lnum && i < SUMMARYWIDTH; i++){ - normal = cblistval(nwords, i, &nwsiz); - asis = cblistval(awords, i, &awsiz); - if(awsiz < 1) continue; - cbmapout(map, normal, nwsiz); - if(ssiz + awsiz + 16 >= bsiz){ - bsiz = bsiz * 2 + awsiz; - sbuf = cbrealloc(sbuf, bsiz); - } - if(!first) ssiz += sprintf(sbuf + ssiz, " "); - if(hilight && normal[0] != '\0' && cbmapget(kmap, normal, nwsiz, NULL)){ - ssiz += sprintf(sbuf + ssiz, "<<%s>>", asis); - } else { - ssiz += sprintf(sbuf + ssiz, "%s", asis); - } - first = FALSE; - num--; - } - ssiz += sprintf(sbuf + ssiz, " ..."); - pv = i; - while(i < lnum){ - if(cbmaprnum(map) < 1){ - cbmapclose(map); - map = listtomap(kwords); - } - normal = cblistval(nwords, i, &nwsiz); - if(cbmapget(map, normal, nwsiz, NULL)){ - bi = i - SUMMARYWIDTH / 2; - bi = bi > pv ? bi : pv; - for(j = bi; j < lnum && j <= bi + SUMMARYWIDTH; j++){ - normal = cblistval(nwords, j, &nwsiz); - asis = cblistval(awords, j, &awsiz); - if(awsiz < 1) continue; - cbmapout(map, normal, nwsiz); - if(ssiz + awsiz + 16 >= bsiz){ - bsiz = bsiz * 2 + awsiz; - sbuf = cbrealloc(sbuf, bsiz); - } - ssiz += sprintf(sbuf + ssiz, " "); - if(hilight && normal[0] != '\0' && cbmapget(kmap, normal, nwsiz, NULL)){ - ssiz += sprintf(sbuf + ssiz, "<<%s>>", asis); - } else { - ssiz += sprintf(sbuf + ssiz, "%s", asis); - } - num--; - } - ssiz += sprintf(sbuf + ssiz, " ..."); - i = j; - pv = i; - } else { - i++; - } - if(num <= 0) break; - } - cbmapclose(map); - cbmapclose(kmap); - return sbuf; -} - - -/* get a map made from a list */ -CBMAP *listtomap(const CBLIST *list){ - CBMAP *map; - const char *tmp; - int i, tsiz; - map = cbmapopen(); - for(i = 0; i < cblistnum(list); i++){ - tmp = cblistval(list, i, &tsiz); - cbmapput(map, tmp, tsiz, "", 0, FALSE); - } - return map; -} - - -/* perform create command */ -int docreate(const char *name){ - ODEUM *odeum; - if(!(odeum = odopen(name, OD_OWRITER | OD_OCREAT | OD_OTRUNC))){ - pdperror(name); - return 1; - } - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform put command */ -int doput(const char *name, const char *text, const char *uri, const char *title, - const char *author, const char *date, int wmax, int keep){ - ODEUM *odeum; - ODDOC *doc; - CBLIST *awords; - const char *asis; - char *normal; - int i; - if(!(odeum = odopen(name, OD_OWRITER))){ - pdperror(name); - return 1; - } - doc = oddocopen(uri); - if(title) oddocaddattr(doc, "title", title); - if(author) oddocaddattr(doc, "author", author); - if(date) oddocaddattr(doc, "date", date); - awords = odbreaktext(text); - for(i = 0; i < cblistnum(awords); i++){ - asis = cblistval(awords, i, NULL); - normal = odnormalizeword(asis); - oddocaddword(doc, normal, asis); - free(normal); - } - cblistclose(awords); - if(!odput(odeum, doc, wmax, keep ? FALSE : TRUE)){ - pdperror(name); - oddocclose(doc); - odclose(odeum); - return 1; - } - oddocclose(doc); - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform out command */ -int doout(const char *name, const char *uri, int id){ - ODEUM *odeum; - if(!(odeum = odopen(name, OD_OWRITER))){ - pdperror(name); - return 1; - } - if(id > 0){ - if(!odoutbyid(odeum, id)){ - pdperror(name); - odclose(odeum); - return 1; - } - } else { - if(!odout(odeum, uri)){ - pdperror(name); - odclose(odeum); - return 1; - } - } - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform get command */ -int doget(const char *name, const char *uri, int id, int tb, int hb){ - ODEUM *odeum; - ODDOC *doc; - if(!(odeum = odopen(name, OD_OREADER))){ - pdperror(name); - return 1; - } - if(id > 0){ - if(!(doc = odgetbyid(odeum, id))){ - pdperror(name); - odclose(odeum); - return 1; - } - } else { - if(!(doc = odget(odeum, uri))){ - pdperror(name); - odclose(odeum); - return 1; - } - } - printdoc(doc, tb, hb, -1, odeum, NULL); - oddocclose(doc); - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform search command */ -int dosearch(const char *name, const char *text, int max, int or, int idf, int ql, - int tb, int hb, int nb){ - ODEUM *odeum; - CBLIST *awords, *nwords, *uris, *hits; - ODPAIR *pairs, *last, *tmp; - ODDOC *doc; - const char *asis; - char *normal, numbuf[32]; - int i, j, pnum, lnum, hnum, tnum, shows; - double ival; - if(!(odeum = odopen(name, OD_OREADER))){ - pdperror(name); - return 1; - } - awords = odbreaktext(text); - nwords = cblistopen(); - uris = cblistopen(); - hits = cblistopen(); - last = NULL; - lnum = 0; - if(ql){ - last= odquery(odeum, text, &lnum, NULL); - } else { - for(i = 0; i < cblistnum(awords); i++){ - asis = cblistval(awords, i, NULL); - normal = odnormalizeword(asis); - cblistpush(nwords, normal, -1); - if(strlen(normal) < 1){ - free(normal); - continue; - } - if(!(pairs = odsearch(odeum, normal, or ? max : -1, &pnum))){ - pdperror(name); - free(normal); - continue; - } - if((hnum = odsearchdnum(odeum, normal)) < 0) hnum = 0; - if(idf){ - ival = odlogarithm(hnum); - ival = (ival * ival) / 4.0; - if(ival < 4.0) ival = 4.0; - for(j = 0; j < pnum; j++){ - pairs[j].score = (int)(pairs[j].score / ival); - } - } - cblistpush(uris, normal, -1); - sprintf(numbuf, "%d", hnum); - cblistpush(hits, numbuf, -1); - if(last){ - if(or){ - tmp = odpairsor(last, lnum, pairs, pnum, &tnum); - } else { - tmp = odpairsand(last, lnum, pairs, pnum, &tnum); - } - free(last); - free(pairs); - last = tmp; - lnum = tnum; - } else { - last = pairs; - lnum = pnum; - } - free(normal); - } - } - if(hb){ - printf("TOTAL: %d\n", lnum); - printf("EACHWORD: "); - } else { - printf("%d", lnum); - } - for(i = 0; i < cblistnum(uris); i++){ - if(hb){ - if(i > 0) printf(", "); - printf("%s(%s)", cblistval(uris, i, NULL), cblistval(hits, i, NULL)); - } else { - printf("\t%s\t%s", cblistval(uris, i, NULL), cblistval(hits, i, NULL)); - } - } - putchar('\n'); - if(hb) putchar('\n'); - if(last){ - if(max < 0) max = lnum; - shows = 0; - for(i = 0; i < lnum && shows < max; i++){ - if(nb){ - printf("%d\t%d\n", last[i].id, last[i].score); - shows++; - } else { - if(!(doc = odgetbyid(odeum, last[i].id))) continue; - printdoc(doc, tb, hb, last[i].score, odeum, nwords); - oddocclose(doc); - shows++; - } - } - free(last); - } - cblistclose(uris); - cblistclose(hits); - cblistclose(nwords); - cblistclose(awords); - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform list command */ -int dolist(const char *name, int tb, int hb){ - ODEUM *odeum; - ODDOC *doc; - if(!(odeum = odopen(name, OD_OREADER))){ - pdperror(name); - return 1; - } - if(!oditerinit(odeum)){ - odclose(odeum); - pdperror(name); - return 1; - } - while(TRUE){ - if(!(doc = oditernext(odeum))){ - if(dpecode == DP_ENOITEM) break; - odclose(odeum); - pdperror(name); - return 1; - } - printdoc(doc, tb, hb, -1, odeum, NULL); - oddocclose(doc); - } - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform optimize command */ -int dooptimize(const char *name){ - ODEUM *odeum; - if(!(odeum = odopen(name, OD_OWRITER))){ - pdperror(name); - return 1; - } - if(!odoptimize(odeum)){ - pdperror(name); - odclose(odeum); - return 1; - } - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform inform command */ -int doinform(const char *name){ - ODEUM *odeum; - char *tmp; - if(!(odeum = odopen(name, OD_OREADER))){ - pdperror(name); - return 1; - } - tmp = odname(odeum); - printf("name: %s\n", tmp ? tmp : "(null)"); - free(tmp); - printf("file size: %.0f\n", odfsiz(odeum)); - printf("index buckets: %d\n", odbnum(odeum)); - printf("used buckets: %d\n", odbusenum(odeum)); - printf("all documents: %d\n", oddnum(odeum)); - printf("all words: %d\n", odwnum(odeum)); - printf("inode number: %d\n", odinode(odeum)); - printf("modified time: %.0f\n", (double)odmtime(odeum)); - if(!odclose(odeum)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform merge command */ -int domerge(const char *name, const CBLIST *elems){ - if(!odmerge(name, elems)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform remove command */ -int doremove(const char *name){ - if(!odremove(name)){ - pdperror(name); - return 1; - } - return 0; -} - - -/* perform break command */ -int dobreak(const char *text, int hb, int kb, int sb){ - CBLIST *awords, *kwords; - CBMAP *scores; - ODDOC *doc; - const char *asis; - char *normal, *summary; - int i, first; - awords = odbreaktext(text); - if(kb || sb){ - doc = oddocopen(""); - for(i = 0; i < cblistnum(awords); i++){ - asis = cblistval(awords, i, NULL); - normal = odnormalizeword(asis); - oddocaddword(doc, normal, asis); - free(normal); - } - scores = oddocscores(doc, MAXKEYWORDS, NULL); - cbmapiterinit(scores); - kwords = cbmapkeys(scores); - if(kb){ - for(i = 0; i < cblistnum(kwords); i++){ - if(i > 0) putchar('\t'); - printf("%s", cblistval(kwords, i, NULL)); - } - putchar('\n'); - } else { - summary = docsummary(doc, kwords, MAXSUMMARY, FALSE); - printf("%s\n", summary); - free(summary); - } - cblistclose(kwords); - cbmapclose(scores); - oddocclose(doc); - } else if(hb){ - printf("NWORDS: "); - first = TRUE; - for(i = 0; i < cblistnum(awords); i++){ - asis = cblistval(awords, i, NULL); - normal = odnormalizeword(asis); - if(normal[0] == '\0'){ - free(normal); - continue; - } - if(!first) putchar(' '); - first = FALSE; - printf("%s", normal); - free(normal); - } - putchar('\n'); - printf("AWORDS: "); - first = TRUE; - for(i = 0; i < cblistnum(awords); i++){ - asis = cblistval(awords, i, NULL); - if(asis[0] == '\0') continue; - if(!first) putchar(' '); - first = FALSE; - printf("%s", asis); - } - putchar('\n'); - } else { - for(i = 0; i < cblistnum(awords); i++){ - asis = cblistval(awords, i, NULL); - normal = odnormalizeword(asis); - printf("%s\t%s\n", normal, asis); - free(normal); - } - } - cblistclose(awords); - return 0; -} - - - -/* END OF FILE */ |