Add support for multiple queries as arguments

This commit is contained in:
Pierre Pronchery 2020-02-23 20:32:54 +01:00
parent 9263abc33a
commit 53dcf53189

View File

@ -44,7 +44,7 @@ static Database * _database_load(char const * engine, char const * cfile,
static int _database_print(void * data, int argc, char ** argv, static int _database_print(void * data, int argc, char ** argv,
char ** columns); char ** columns);
static int _database_query(char const * engine, char const * cfile, static int _database_query(char const * engine, char const * cfile,
char const * section, char const * query); char const * section, int queryc, char * const queryv[]);
static int _usage(void); static int _usage(void);
@ -126,11 +126,12 @@ static int _database_print(void * data, int argc, char ** argv, char ** columns)
/* database_query */ /* database_query */
static int _database_query(char const * engine, char const * cfile, static int _database_query(char const * engine, char const * cfile,
char const * section, char const * query) char const * section, int queryc, char * const queryv[])
{ {
int ret; int ret = 0;
DatabaseFile database; DatabaseFile database;
Database * db; Database * db;
int i;
if((db = _database_load(engine, cfile, section)) == NULL) if((db = _database_load(engine, cfile, section)) == NULL)
{ {
@ -138,14 +139,18 @@ static int _database_query(char const * engine, char const * cfile,
return 2; return 2;
} }
database.fp = stdout; database.fp = stdout;
database.first = 1; for(i = 0; i < queryc; i++)
database.rows = 0;
if((ret = database_query(db, query, _database_print, &database)) != 0)
{ {
error_print(PROGNAME_DATABASE); database.first = 1;
return ret; database.rows = 0;
if((ret = database_query(db, queryv[i], _database_print,
&database)) != 0)
{
error_print(PROGNAME_DATABASE);
break;
}
printf("(%u rows)\n", database.rows);
} }
printf("(%u rows)\n", database.rows);
database_delete(db); database_delete(db);
return ret; return ret;
} }
@ -155,7 +160,7 @@ static int _database_query(char const * engine, char const * cfile,
static int _usage(void) static int _usage(void)
{ {
fputs("Usage: " PROGNAME_DATABASE fputs("Usage: " PROGNAME_DATABASE
" -d engine [-C configuration [-S section]][query]\n" " -d engine [-C configuration [-S section]][query...]\n"
" -d Database engine to load\n" " -d Database engine to load\n"
" -C Connection file to load\n" " -C Connection file to load\n"
" -S Section of the connection file to use\n", " -S Section of the connection file to use\n",
@ -191,9 +196,8 @@ int main(int argc, char * argv[])
} }
if(engine == NULL) if(engine == NULL)
return _usage(); return _usage();
else if(optind + 1 < argc) else if(optind < argc)
return _usage(); return _database_query(engine, cfile, section,
else if(optind + 1 == argc) argc - optind, &argv[optind]);
return _database_query(engine, cfile, section, argv[optind]);
return (_database(engine, cfile, section) == 0) ? 0 : 2; return (_database(engine, cfile, section) == 0) ? 0 : 2;
} }