orasel.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "orasel.h"
  2. #include <ctype.h>
  3. #include <unistd.h>
  4. outmode_t outmode;
  5. //-----------------------------------------------------------------------------
  6. static void prepare_uri(con_t* con, const char *uri)
  7. {
  8. const char *p = strchr(uri, '/');
  9. if(!p || p == uri) goto bad;
  10. con->username = str_alloc(uri, p - uri);
  11. uri = p+1;
  12. p = strchr(uri, '@');
  13. if(!p || p == uri) goto bad;
  14. con->password = str_alloc(uri, p - uri);
  15. if(strchr(con->password->s, '/')) goto bad;
  16. if(!*++p) goto bad;
  17. con->uri = str_alloc(p, strlen(p));
  18. return;
  19. bad:
  20. errxit("invalid db (must be as name/password@dbname)");
  21. }
  22. //-----------------------------------------------------------------------------
  23. static const Str* prepare_req(const char* req)
  24. {
  25. Str* ps;
  26. char *p;
  27. while(*req && isspace((unsigned char)*req)) ++req;
  28. if(strncasecmp(req, "select", sizeof("select")-1)) goto bad;
  29. p = (char*)req + sizeof("select")-1;
  30. if(!*p || !isspace((unsigned char)*p)) goto bad;
  31. ps = str_alloc(req, strlen(req));
  32. p = (char*) ps->s + sizeof("select")-1;
  33. do if(isspace((unsigned char)*p)) *p = ' '; while(*++p);
  34. do --p; while(isspace((unsigned char)*p));
  35. if(*p != ';') goto bad;
  36. do {
  37. do --p; while(isspace((unsigned char)*p));
  38. }while(*p == ';');
  39. *++p = '\0';
  40. ps->len = p - ps->s;
  41. if(ps->len <= sizeof("select")-1) {
  42. bad:
  43. errxit("support only 'select ...;' request");
  44. }
  45. return ps;
  46. }
  47. //-----------------------------------------------------------------------------
  48. static void get_opt(int argc, char* argv[])
  49. {
  50. int opt = 0;
  51. if(argc <= 1 || (argc == 2 && !strcmp(argv[1], "--help"))) {
  52. help:
  53. fprintf(stderr, "Kamailio for oracle 'select' request utility\n");
  54. opt = -2; /* flag for help print */
  55. } else {
  56. while((opt = getopt(argc-1, argv+1, "BLNe:")) != -1) {
  57. switch(opt) {
  58. case 'B':
  59. outmode.raw = 1;;
  60. break;
  61. case 'L':
  62. outmode.hdr = 1;
  63. break;
  64. case 'N':
  65. outmode.emp = 1;
  66. break;
  67. case 'e':
  68. if(optind == argc-1) return;
  69. // pass thru
  70. default:
  71. goto help;
  72. }
  73. }
  74. }
  75. fprintf(stderr, "use: %s user/password@db [-BLN] -e \"select ...;\"\n",
  76. argv[0]);
  77. if(opt == -2) {
  78. fprintf(stderr, " where -B - print using tab separator\n");
  79. fprintf(stderr, " -L - skip column headers\n");
  80. fprintf(stderr, " -N - skip notify of empty result\n");
  81. }
  82. exit(1);
  83. }
  84. //-----------------------------------------------------------------------------
  85. int main(int argc, char* argv[])
  86. {
  87. con_t con;
  88. res_t res;
  89. const Str* req;
  90. get_opt(argc, argv);
  91. memset(&con, 0, sizeof(con));
  92. memset(&res, 0, sizeof(res));
  93. prepare_uri(&con, argv[1]);
  94. req = prepare_req(optarg);
  95. open_sess(&con);
  96. send_req(&con, req);
  97. get_res(&con, &res);
  98. OCITerminate(OCI_DEFAULT);
  99. out_res(&res);
  100. return 0;
  101. }
  102. //-----------------------------------------------------------------------------