/* zebrash.c - command-line interface to zebra API
- * $Id: zebrash.c,v 1.8 2003-06-02 13:13:59 adam Exp $
+ * $Id: zebrash.c,v 1.11 2003-06-23 14:35:41 heikki Exp $
*
* Copyrigth 2003 Index Data Aps
*
return v;
}
-int onecommand( char *line, char *outbuff);
+int onecommand( char *line, char *outbuff, const char *prevout);
/**************************************
* Simple support commands
static int cmd_quickstart( char *args[], char *outbuff)
{
char tmp[128];
- onecommand("yaz_log_file zebrash.log",outbuff);
- onecommand("yaz_log_prefix ZebraSh", outbuff);
+ int rc=0;
+ if (!rc)
+ rc=onecommand("yaz_log_file zebrash.log",outbuff,"");
+ if (!rc)
+ rc=onecommand("yaz_log_prefix ZebraSh", outbuff,"");
sprintf(tmp, "yaz_log_level 0x%x", LOG_DEFAULT_LEVEL | LOG_APP);
- onecommand(tmp,outbuff);
+ if (!rc)
+ rc=onecommand(tmp,outbuff,"");
logf(LOG_APP,"quickstart");
- onecommand("zebra_start",outbuff);
- onecommand("zebra_open",outbuff);
- onecommand("select_database Default",outbuff);
- strcat(outbuff,"ok\n");
- return 0;
+ if (!rc)
+ rc=onecommand("zebra_start",outbuff,"");
+ if (!rc)
+ rc=onecommand("zebra_open",outbuff,"");
+ if (!rc)
+ rc=onecommand("select_database Default",outbuff,"");
+ return rc;
}
/**************************************
static int cmd_select_database ( char *args[], char *outbuff)
{
char *db=args[1];
- if (!db)
- db="Default";
- return zebra_select_database(zh, args[1]);
+ if (!db) {
+ db="Default";
+ strcat(outbuff,"Selecting database 'Default'\n");
+ }
+ return zebra_select_database(zh, db);
}
-/**************************************
+static int cmd_create_database( char *args[], char *outbuff)
+{
+ char *db=args[1];
+ int rc;
+ if (!db)
+ db="Default";
+ strcat(outbuff,"Creating database ");
+ strcat(outbuff,db);
+ strcat(outbuff,"\n");
+
+ return zebra_create_database(zh, db);
+}
+
+static int cmd_begin_trans( char *args[], char *outbuff)
+{
+ int rw=0;
+ if (args[1] && ( (args[1][0]=='1') || (args[1][0]=='w') ))
+ rw=1;
+ return zebra_begin_trans(zh,rw);
+}
+static int cmd_end_trans( char *args[], char *outbuff)
+{
+ return zebra_end_trans(zh);
+}
+/*************************************
+ * Inserting and deleting
+ */
+
+static int cmd_record_insert( char *args[], char *outbuff)
+{
+ int sysno=0;
+ char buf[MAX_ARG_LEN];
+ int i;
+ int rc;
+
+ i=1;
+ buf[0]='\0';
+ while (args[i])
+ {
+ strcat(buf, args[i++]);
+ strcat(buf, " ");
+ }
+ rc=zebra_record_insert(zh,buf, strlen(buf), &sysno);
+ if (0==rc)
+ {
+ sprintf(buf,"ok sysno=%d\n",sysno);
+ strcat(outbuff,buf);
+ }
+ return rc;
+}
+
+
+static int cmd_exchange_record( char *args[], char *outbuff)
+{
+ char *base=args[1];
+ char *id = args[2];
+ char *action = args[3];
+ int i=4;
+ int rc;
+ char buf[MAX_ARG_LEN];
+ if (!(base && id && action && args[4] ))
+ {
+ strcat(outbuff,"Missing arguments!\n");
+ onecommand("help exchange_record", outbuff, "");
+ return -90;
+ }
+ while (args[i])
+ {
+ strcat(buf, args[i++]);
+ strcat(buf, " ");
+ }
+ rc=zebra_admin_exchange_record(zh, base, buf, strlen(buf),
+ id, strlen(id), atoi(action));
+ return rc;
+}
+
+
+/**************************************)
* Command table, parser, and help
*/
{ "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",
{0,0,0,0} /* end marker */
};
-int onecommand( char *line, char *outbuff)
+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];
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 : "<null>");
+ }
+#endif
if (0==n)
- return -1; /* no command on line, too bad */
+ 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");
+ exit(9);
+ }
+ return 0;
+ }
for (i=0;cmds[i].cmd;i++)
if (0==strcmp(cmds[i].cmd, args[0]))
{
strcat(outbuff,args[0] );
strcat(outbuff,"'. Try help");
logf(LOG_APP,"Unknown command");
- return -2;
+ return -90;
}
static int cmd_help( char *args[], char *outbuff)
ec=zebra_errCode (zh);
if (ec)
{
- sprintf(tmp, "Zebra error %d: %s, (%s)",
+ 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);
}
}
{
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];
- char outbuff[MAX_OUT_BUFF];
#if HAVE_READLINE_READLINE_H
char* line_in;
line_in=readline(PROMPT);
if (!fgets (buf, MAX_ARG_LEN-1, stdin))
break;
#endif
+
+ strncpy(prevout, outbuff, MAX_OUT_BUFF);
outbuff[0]='\0';
- rc=onecommand(buf, outbuff);
+ rc=onecommand(buf, outbuff, prevout);
if (rc==0)
{
- strcat(outbuff, "OK\n");
+ strcat(outbuff, " OK\n");
logf(LOG_APP, "OK");
}
- else if (rc > 0)
+ else if (rc>-90)
{
- sprintf(tmp, "command returned %d\n",rc);
+ sprintf(tmp, " command returned %d\n",rc);
strcat(outbuff,tmp);
}
Zerrors(outbuff);