mirror of https://github.com/sipwise/kamailio.git
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.
117 lines
2.8 KiB
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;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|