123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #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;
- }
- //-----------------------------------------------------------------------------
|