#include "orasel.h" #include #include 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; } //-----------------------------------------------------------------------------