X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=index%2Fzebrash.c;h=0bc43eaefc95726e84424e96a1b5fd9871d70b4a;hb=dbd6f3a01791401472b07250bf35dcbc3ead4f92;hp=09afedea9282974c27caea464d1830c204130655;hpb=4a7fb99818837b391aa7e70cf35385e77aa3deeb;p=idzebra-moved-to-github.git diff --git a/index/zebrash.c b/index/zebrash.c index 09afede..0bc43ea 100644 --- a/index/zebrash.c +++ b/index/zebrash.c @@ -1,5 +1,5 @@ /* zebrash.c - command-line interface to zebra API - * $ID$ + * $Id: zebrash.c,v 1.12 2003-06-23 15:35:25 adam Exp $ * * Copyrigth 2003 Index Data Aps * @@ -7,7 +7,7 @@ #include #include -#include +#include #include #if HAVE_READLINE_READLINE_H @@ -18,6 +18,7 @@ #endif #include "zebraapi.h" +#include #define MAX_NO_ARGS 32 #define MAX_OUT_BUFF 4096 @@ -31,211 +32,633 @@ ZebraService zs=0; /* our global handle to zebra */ ZebraHandle zh=0; /* the current session */ - /* time being, only one session works */ +/* time being, only one session works */ /************************************** * Help functions */ -static int split_args( char *line, char** argv ) +static int split_args( char *line, char** args ) { /* splits line into individual null-terminated strings, - * returns pointers to them in argv */ - char *p=line; - int i=0; - argv[0]=0; /* by default */ - while (*p==' ' || *p=='\t' || *p=='\n') - p++; - while (*p) - { + * returns pointers to them in args */ + /* FIXME - do we need to handle quoted args ?? */ + char *p=line; + int i=0; + int n=0; + args[0]=0; /* by default */ while (*p==' ' || *p=='\t' || *p=='\n') - p++; - argv[i++]=p; - argv[i]=0; - while (*p && *p!=' ' && *p!='\t' && *p!='\n') - p++; - *p++='\0'; - } - return i; + p++; + while (*p) + { + while (*p==' ' || *p=='\t' || *p=='\n') + p++; + if (*p=='#') /* skip comments */ + break; + args[i++]=p; + args[i]=0; + while (*p && *p!=' ' && *p!='\t' && *p!='\n' && *p!='#') + p++; + *p++='\0'; + } + n=i; + while (n1) - argv[0]= line + (argv[1]-argbuf); /* rest of the line */ - else - argv[0]=""; - return ((cmds[i].testfunc)(argv,outbuff)); - } - sprintf (outbuff, "Unknown command '%s'. Try help",argv[0] ); - return -1; - } - - int cmd_help( char *args[], char *outbuff) - { - int i; - char tmp[MAX_ARG_LEN]; - for (i=0;cmds[i].cmd;i++) - if (cmds[i].explanation) - { - sprintf(tmp, "%s %s %s\n", - cmds[i].cmd, cmds[i].args, cmds[i].explanation); - strcat(outbuff,tmp); - } - return 0; - } +struct cmdstruct +{ + char * cmd; + char * args; + char * explanation; + int (*testfunc)(char *args[], char *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", + "Creates a database", + cmd_create_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}, + { "", "Misc:","", 0}, + { "echo", "string", + "ouputs the string", + cmd_echo }, + { "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 */ + char *outbuff, /* output goes here */ + const char *prevout) /* prev output, for 'expect' */ +{ + int i; + char *args[MAX_NO_ARGS]; + int n; + 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 */ + n=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 : ""); + } +#endif + if (0==n) + return -90; /* no command on line, too bad */ + + if (0==strcmp(args[0],"expect")) + { + char *rest; + if (n>1) + rest= line + (args[1]-argbuf); /* rest of the line */ + else + return -1; /* need something to expect */ + printf("expecting '%s'\n",rest); /*!*/ + if (0==strstr(prevout,rest)) + { + printf( "Failed expectation, '%s' not found\n", res); + exit(9); + } + return 0; + } + for (i=0;cmds[i].cmd;i++) + if (0==strcmp(cmds[i].cmd, args[0])) + { + if (n>1) + args[0]= line + (args[1]-argbuf); /* rest of the line */ + else + args[0]=""; + return ((cmds[i].testfunc)(args,outbuff)); + } + strcat(outbuff, "Unknown command '"); + strcat(outbuff,args[0] ); + strcat(outbuff,"'. Try help"); + logf(LOG_APP,"Unknown command"); + return -90; +} + +static int cmd_help( char *args[], char *outbuff) +{ + int i; + char tmp[MAX_ARG_LEN]; + if (args[1]) + { /* help for a single command */ + for (i=0;cmds[i].cmd;i++) + if (0==strcmp(cmds[i].cmd, args[1])) + { + strcat(outbuff,cmds[i].cmd); + strcat(outbuff," "); + strcat(outbuff,cmds[i].args); + strcat(outbuff,"\n"); + strcat(outbuff,cmds[i].explanation); + strcat(outbuff,"\n"); + return 0; + } + strcat(outbuff, "Unknown command "); + strcat(outbuff, args[1] ); + } + else + { /* list all commands */ + strcpy(tmp," "); + for (i=0;cmds[i].cmd;i++) + if (cmds[i].explanation) + { + /* sprintf(tmp, "%s %s %s\n", + cmds[i].cmd, cmds[i].args, cmds[i].explanation); + */ + strcat(tmp, cmds[i].cmd); + strcat(tmp," "); + if (!*cmds[i].cmd) + { + strcat(outbuff, tmp); + strcat(outbuff,"\n"); + strcpy(tmp," "); + if (*cmds[i].args) + { + strcat(outbuff, cmds[i].args); + strcat(outbuff,"\n"); + } + } + if (strlen(tmp)>50) + { + strcat(outbuff,tmp); + strcat(outbuff,"\n"); + strcpy(tmp," "); + } + } + strcat(outbuff,tmp); + } + return 0; +} + +/* If Zebra reports an error after an operation, + * append it to the outbuff and log it */ +static void Zerrors ( char *outbuff) +{ + int ec; + char tmp[MAX_OUT_BUFF]; + if (!zh) + return ; + ec=zebra_errCode (zh); + if (ec) + { + sprintf(tmp, " Zebra error %d: %s, (%s)", + ec, zebra_errString (zh), + zebra_errAdd (zh) ); + strcat(outbuff, tmp); + strcat(outbuff, "\n"); + logf(LOG_APP, tmp); + zebra_clearError(zh); + } +} + /************************************** * The shell */ void shell() { - int rc=0; - while (rc!=-99) - { - char buf[MAX_ARG_LEN]; - char outbuff[MAX_OUT_BUFF]; + int rc=0; + char tmp[MAX_ARG_LEN]; + char outbuff[MAX_OUT_BUFF]=""; + char prevout[MAX_OUT_BUFF]=""; /* previous output for 'expect' */ + while (rc!=-99) + { + char buf[MAX_ARG_LEN]; #if HAVE_READLINE_READLINE_H - char* line_in; - line_in=readline(PROMPT); - if (!line_in) + char* line_in; + line_in=readline(PROMPT); + if (!line_in) break; #if HAVE_READLINE_HISTORY_H - if (*line_in) + if (*line_in) add_history(line_in); #endif - if(strlen(line_in) > MAX_ARG_LEN-1) { + if(strlen(line_in) > MAX_ARG_LEN-1) { fprintf(stderr,"Input line too long\n"); break; - }; - strcpy(buf,line_in); - free (line_in); + }; + strcpy(buf,line_in); + free (line_in); #else - printf (PROMPT); - fflush (stdout); - if (!fgets (buf, MAX_ARG_LEN-1, stdin)) - break; + printf (PROMPT); + fflush (stdout); + if (!fgets (buf, MAX_ARG_LEN-1, stdin)) + break; #endif - outbuff[0]='\0'; - rc=onecommand(buf, outbuff); + + strncpy(prevout, outbuff, MAX_OUT_BUFF); + outbuff[0]='\0'; + rc=onecommand(buf, outbuff, prevout); + if (rc==0) + { + strcat(outbuff, " OK\n"); + logf(LOG_APP, "OK"); + } + else if (rc>-90) + { + sprintf(tmp, " command returned %d\n",rc); + strcat(outbuff,tmp); + } + Zerrors(outbuff); printf("%s\n", outbuff); - } - - } - + } /* while */ +} /* shell() */ + /************************************** * Main */ -int main (int argc, char ** argv) +int main (int argc, char ** args) { - shell(); - return 0; + shell(); + return 0; } /* main */