You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/utils/db_oracle/orasel.c

117 lines
2.8 KiB

#include "orasel.h"
#include <ctype.h>
#include <unistd.h>
outmode_t outmode;
//-----------------------------------------------------------------------------
static void prepare_uri(con_t* con, const char *uri)
{
const char *p = strchr(uri, '/');
if(!p || p == uri) goto bad;
con->username = str_alloc(uri, p - uri);
uri = p+1;
p = strchr(uri, '@');
if(!p || p == uri) goto bad;
con->password = str_alloc(uri, p - uri);
if(strchr(con->password->s, '/')) goto bad;
if(!*++p) goto bad;
con->uri = str_alloc(p, strlen(p));
return;
bad:
errxit("invalid db (must be as name/password@dbname)");
}
//-----------------------------------------------------------------------------
static const Str* prepare_req(const char* req)
{
Str* ps;
char *p;
while(*req && isspace((unsigned char)*req)) ++req;
if(strncasecmp(req, "select", sizeof("select")-1)) goto bad;
p = (char*)req + sizeof("select")-1;
if(!*p || !isspace((unsigned char)*p)) goto bad;
ps = str_alloc(req, strlen(req));
p = (char*) ps->s + sizeof("select")-1;
do if(isspace((unsigned char)*p)) *p = ' '; while(*++p);
do --p; while(isspace((unsigned char)*p));
if(*p != ';') goto bad;
do {
do --p; while(isspace((unsigned char)*p));
}while(*p == ';');
*++p = '\0';
ps->len = p - ps->s;
if(ps->len <= sizeof("select")-1) {
bad:
errxit("support only 'select ...;' request");
}
return ps;
}
//-----------------------------------------------------------------------------
static void get_opt(int argc, char* argv[])
{
int opt = 0;
if(argc <= 1 || (argc == 2 && !strcmp(argv[1], "--help"))) {
help:
fprintf(stderr, "Kamailio for oracle 'select' request utility\n");
opt = -2; /* flag for help print */
} else {
while((opt = getopt(argc-1, argv+1, "BLNe:")) != -1) {
switch(opt) {
case 'B':
outmode.raw = 1;;
break;
case 'L':
outmode.hdr = 1;
break;
case 'N':
outmode.emp = 1;
break;
case 'e':
if(optind == argc-1) return;
// pass thru
default:
goto help;
}
}
}
fprintf(stderr, "use: %s user/password@db [-BLN] -e \"select ...;\"\n",
argv[0]);
if(opt == -2) {
fprintf(stderr, " where -B - print using tab separator\n");
fprintf(stderr, " -L - skip column headers\n");
fprintf(stderr, " -N - skip notify of empty result\n");
}
exit(1);
}
//-----------------------------------------------------------------------------
int main(int argc, char* argv[])
{
con_t con;
res_t res;
const Str* req;
get_opt(argc, argv);
memset(&con, 0, sizeof(con));
memset(&res, 0, sizeof(res));
prepare_uri(&con, argv[1]);
req = prepare_req(optarg);
open_sess(&con);
send_req(&con, req);
get_res(&con, &res);
OCITerminate(OCI_DEFAULT);
out_res(&res);
return 0;
}
//-----------------------------------------------------------------------------