📄 zebrash.c
字号:
return rc;}static int cmd_find( char *args[], WRBUF outbuff){ char *setname=DEFAULTRESULTSET; int rc; int hits=0; WRBUF qry=wrbuf_alloc(); if (0==strstr(args[0],"@attr")) wrbuf_puts(qry, "@attr 1=/ "); wrbuf_puts(qry,restargs(args,1)); if (!zh) onecommand("quickstart", outbuff, ""); wrbuf_printf(outbuff, "find %s\n",wrbuf_buf(qry)); rc=zebra_search_PQF(zh, wrbuf_buf(qry), setname, &hits); if (0==rc) { wrbuf_printf(outbuff,"%d hits found\n",hits); nextrecno=1; } wrbuf_free(qry,1); return rc;}static int cmd_show( char *args[], WRBUF outbuff){ int start=defargint(args[1], nextrecno); int nrecs=defargint(args[2],1); char *setname=defarg(args[3],DEFAULTRESULTSET); int rc=0; ZebraRetrievalRecord *recs; ODR odr; Z_RecordComposition *pcomp=0; int i; oid_value format; odr=odr_createmem(ODR_ENCODE); recs= odr_malloc(odr,sizeof(ZebraRetrievalRecord)*nrecs); rc =z_RecordComposition(odr, &pcomp, 0,"recordComposition"); format=oid_getvalbyname ("xml"); /*FIXME - let the user specify*/ for (i=0;i<nrecs;i++) recs[i].position=start+i; rc = zebra_records_retrieve (zh, odr, setname, pcomp, format, nrecs,recs); if (0==rc) { for (i=0;i<nrecs;i++) { printf("Err %d: %d\n",i,recs[i].errCode); if (recs[i].buf) { wrbuf_printf(outbuff,"Record %d\n", recs[i].position); wrbuf_write(outbuff, recs[i].buf, recs[i].len); wrbuf_puts(outbuff, "\n"); } else wrbuf_printf(outbuff,"NO Record %d\n", recs[i].position); } nextrecno=start+nrecs+1; } odr_destroy(odr); return rc;}/**************************************) * Command table, parser, and help */struct cmdstruct{ char *cmd; char *args; char *explanation; int (*testfunc)(char *args[], WRBUF outbuff);} ; struct cmdstruct cmds[] = { /* special cases: * if text is 0, does not list the command * if cmd is "", adds the args (and newline) in command listing */ { "", "Starting and stopping:", "", 0 }, { "zebra_start", "[configfile]", "starts the zebra service. You need to call this first\n" "if no configfile is given, assumes " DEFAULTCONFIG, cmd_zebra_start }, { "zebra_stop", "", "stops the zebra service", cmd_zebra_stop }, { "zebra_open", "", "starts a zebra session. Once you have called zebra_start\n" "you can call zebra_open to start working", cmd_zebra_open }, { "zebra_close", "", "closes a zebra session", cmd_zebra_close }, { "quickstart", "[configfile]", "Does a zebra_start, zebra_open, and sets up the log", cmd_quickstart }, { "", "Log file:","", 0}, { "yaz_log_file", "[filename]", "Directs the log to filename (or stderr)", cmd_yaz_log_file }, { "yaz_log_level", "[level]", "Sets the logging level (or returns to default)", cmd_yaz_log_level }, { "yaz_log_prefix", "[prefix]", "Sets the log prefix", cmd_yaz_log_prefix}, { "logf", "[level] text...", "writes an entry in the log", cmd_logf}, { "", "Error handling:","", 0}, { "err", "", "Displays zebra's error status (code, str, add)", cmd_err}, { "errcode", "", "Displays zebra's error code", cmd_errcode}, { "errstr", "", "Displays zebra's error string", cmd_errstr}, { "erradd", "", "Displays zebra's additional error message", cmd_erradd}, { "", "Admin:","", 0}, { "init", "", "Initializes the zebra database, destroying all data in it", cmd_init}, { "select_database", "basename", "Selects a database", cmd_select_database}, { "create_database", "basename", "Create database", cmd_create_database}, { "drop_database", "basename", "Drop database", cmd_drop_database}, { "begin_trans", "[rw]", "Begins a transaction. rw=1 means write, otherwise read-only", cmd_begin_trans}, { "end_trans","", "Ends a transaction", cmd_end_trans}, { "","Updating:","",0}, { "record_insert","record", "inserts an sgml record into Default", cmd_record_insert}, { "exchange_record","database record-id action record", "inserts (1), updates (2), or deletes (3) a record \n" "record-id must be a unique identifier for the record", cmd_exchange_record}, { "","Searching and retrieving:","",0}, { "search_pqf","setname query", "search ", cmd_search_pqf}, { "find","query", "simplified search", cmd_find}, { "f","query", "simplified search", cmd_find}, { "show","[start] [numrecs] [resultset]", "shows a result", cmd_show}, { "s","[start] [numrecs] [resultset]", "shows a result", cmd_show}, { "", "Misc:","", 0}, { "echo", "string", "ouputs the string", cmd_echo }, { "q", "", "exits the program", cmd_quit }, { "quit", "", "exits the program", cmd_quit }, { "help", "[command]", "Gives help on command, or lists them all", cmd_help }, { "", "help [command] gives more info on command", "",0 }, {0,0,0,0} /* end marker */}; int onecommand( char *line, /* input line */ WRBUF outbuff, /* output goes here */ const char *prevout) /* prev output, for 'expect' */{ int i; char *args[MAX_NO_ARGS]; int nargs; char argbuf[MAX_ARG_LEN]; logf(LOG_APP,"%s",line); strncpy(argbuf,line, MAX_ARG_LEN-1); argbuf[MAX_ARG_LEN-1]='\0'; /* just to be sure */ /*memset(args,'\0',MAX_NO_ARGS*sizeof(char *));*/ nargs=split_args(argbuf, args); #if 0 for (i = 0; i <= n; i++) { const char *cp = args[i]; printf ("args %d :%s:\n", i, cp ? cp : "<null>"); }#endif if (0==nargs) return -90; /* no command on line, too bad */ if (0==strcmp(args[0],"expect")) { char *rest; if (nargs>1) /* args[0] is not yet set, can't use restargs */ rest= line + (args[1]-argbuf); /* rest of the line */ else return -1; /* need something to expect */ if (0==strstr(prevout,rest)) { printf( "Failed expectation, '%s' not found\n", rest); exit(9); } return 0; } for (i=0;cmds[i].cmd;i++) if (0==strcmp(cmds[i].cmd, args[0])) { if (nargs>1) args[0]= line + (args[1]-argbuf); /* rest of the line */ else args[0]=""; return ((cmds[i].testfunc)(args,outbuff)); } wrbuf_printf(outbuff, "Unknown command '%s'. Try help\n",args[0]); logf(LOG_APP,"Unknown command"); return -90; } static int cmd_help( char *args[], WRBUF outbuff){ int i; int linelen; if (args[1]) { /* help for a single command */ for (i=0;cmds[i].cmd;i++) if (0==strcmp(cmds[i].cmd, args[1])) { wrbuf_printf(outbuff,"%s %s\n%s\n", cmds[i].cmd, cmds[i].args, cmds[i].explanation); return 0; } wrbuf_printf(outbuff, "Unknown command '%s'", args[1]); } else { /* list all commands */ linelen=9999; for (i=0;cmds[i].cmd;i++) { if (*cmds[i].cmd) { /* ordinary command */ if (linelen>50) { wrbuf_puts(outbuff,"\n "); linelen=0; } linelen += strlen(cmds[i].cmd) + 2; wrbuf_printf(outbuff,"%s ", cmds[i].cmd); } else { /* section head */ wrbuf_printf(outbuff,"\n%s\n ",cmds[i].args); linelen=0; } } /* for */ wrbuf_puts(outbuff,"\n"); } return 0;} /* If Zebra reports an error after an operation, * append it to the outbuff and log it */static void Zerrors ( WRBUF outbuff){ int ec; if (!zh) return ; ec=zebra_errCode (zh); if (ec) { logf(LOG_APP, " Zebra error %d: %s, (%s)", ec, zebra_errString (zh), zebra_errAdd (zh) ); wrbuf_printf(outbuff, " Zebra error %d: %s, (%s)\n", ec, zebra_errString (zh), zebra_errAdd (zh) ); zebra_clearError(zh); }}/************************************** * The shell */ void shell(){ int rc=0; WRBUF outbuff=wrbuf_alloc(); char prevout[MAX_OUT_BUFF]=""; /* previous output for 'expect' */ wrbuf_puts(outbuff,"Zebrash at your service"); while (rc!=-99) { char *nl_cp; char buf[MAX_ARG_LEN]; char* line_in = 0;#if HAVE_READLINE_READLINE_H if (isatty(0)) { line_in=readline(PROMPT); if (!line_in) break;#if HAVE_READLINE_HISTORY_H if (*line_in) add_history(line_in);#endif }#endif /* line_in != NULL if readine is present and input is a tty */ printf (PROMPT); fflush (stdout); if (line_in) { if(strlen(line_in) > MAX_ARG_LEN-1) { fprintf(stderr,"Input line too long\n"); break; } strcpy(buf,line_in); free (line_in); } else { if (!fgets (buf, MAX_ARG_LEN-1, stdin)) break; } /* get rid of \n in line */ if ((nl_cp = strchr(buf, '\n'))) *nl_cp = '\0'; strncpy(prevout, wrbuf_buf(outbuff), MAX_OUT_BUFF); wrbuf_rewind(outbuff); rc=onecommand(buf, outbuff, prevout); if (rc==0) { wrbuf_puts(outbuff, " OK\n"); logf(LOG_APP, "OK"); } else if (rc>-90) { wrbuf_printf(outbuff, " command returned %d\n",rc); } Zerrors(outbuff); printf("%s\n", wrbuf_buf(outbuff)); } /* while */ wrbuf_free(outbuff,1);} /* shell() *//************************************** * Main */ int main (int argc, char ** args){ shell(); return 0;} /* main */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -