ruby-oci8 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +569 -0
 - data/Makefile +51 -0
 - data/NEWS +322 -0
 - data/README +415 -0
 - data/VERSION +1 -0
 - data/dist-files +70 -0
 - data/doc/api.en.html +527 -0
 - data/doc/api.en.rd +554 -0
 - data/doc/api.ja.html +525 -0
 - data/doc/api.ja.rd +557 -0
 - data/doc/manual.css +35 -0
 - data/ext/oci8/MANIFEST +22 -0
 - data/ext/oci8/attr.c +415 -0
 - data/ext/oci8/bind.c +194 -0
 - data/ext/oci8/const.c +165 -0
 - data/ext/oci8/define.c +53 -0
 - data/ext/oci8/describe.c +81 -0
 - data/ext/oci8/descriptor.c +39 -0
 - data/ext/oci8/env.c +276 -0
 - data/ext/oci8/error.c +234 -0
 - data/ext/oci8/extconf.rb +118 -0
 - data/ext/oci8/handle.c +262 -0
 - data/ext/oci8/lob.c +386 -0
 - data/ext/oci8/oci8.c +137 -0
 - data/ext/oci8/oci8.h +345 -0
 - data/ext/oci8/ocinumber.c +117 -0
 - data/ext/oci8/oraconf.rb +1026 -0
 - data/ext/oci8/oradate.c +426 -0
 - data/ext/oci8/oranumber.c +445 -0
 - data/ext/oci8/param.c +37 -0
 - data/ext/oci8/post-config.rb +5 -0
 - data/ext/oci8/server.c +182 -0
 - data/ext/oci8/session.c +99 -0
 - data/ext/oci8/stmt.c +624 -0
 - data/ext/oci8/svcctx.c +229 -0
 - data/lib/DBD/OCI8/OCI8.rb +549 -0
 - data/lib/oci8.rb.in +1605 -0
 - data/metaconfig +142 -0
 - data/pre-distclean.rb +7 -0
 - data/ruby-oci8.gemspec +54 -0
 - data/ruby-oci8.spec +62 -0
 - data/setup.rb +1331 -0
 - data/support/README +4 -0
 - data/support/runit/assert.rb +281 -0
 - data/support/runit/cui/testrunner.rb +101 -0
 - data/support/runit/error.rb +4 -0
 - data/support/runit/method_mappable.rb +20 -0
 - data/support/runit/robserver.rb +25 -0
 - data/support/runit/setuppable.rb +15 -0
 - data/support/runit/teardownable.rb +16 -0
 - data/support/runit/testcase.rb +113 -0
 - data/support/runit/testfailure.rb +25 -0
 - data/support/runit/testresult.rb +121 -0
 - data/support/runit/testsuite.rb +43 -0
 - data/support/runit/version.rb +3 -0
 - data/test/README +4 -0
 - data/test/config.rb +129 -0
 - data/test/test_all.rb +43 -0
 - data/test/test_bind_raw.rb +53 -0
 - data/test/test_bind_time.rb +191 -0
 - data/test/test_break.rb +81 -0
 - data/test/test_clob.rb +101 -0
 - data/test/test_connstr.rb +80 -0
 - data/test/test_dbi.rb +317 -0
 - data/test/test_dbi_clob.rb +56 -0
 - data/test/test_describe.rb +137 -0
 - data/test/test_metadata.rb +243 -0
 - data/test/test_oci8.rb +273 -0
 - data/test/test_oradate.rb +263 -0
 - data/test/test_oranumber.rb +149 -0
 - metadata +118 -0
 
    
        data/ext/oci8/bind.c
    ADDED
    
    | 
         @@ -0,0 +1,194 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
              define.c - part of ruby-oci8
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              Copyright (C) 2002,2006 KUBO Takehiro <kubo@jiubao.org>
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 7 
     | 
    
         
            +
            == OCIBind
         
     | 
| 
      
 8 
     | 
    
         
            +
            The bind handle, which is created by ((<OCIStmt#bindByPos>)) or ((<OCIStmt#bindByName>)).
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            super class: ((<OCIHandle>))
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            correspond native OCI datatype: ((|OCIBind|))
         
     | 
| 
      
 13 
     | 
    
         
            +
            =end
         
     | 
| 
      
 14 
     | 
    
         
            +
            */
         
     | 
| 
      
 15 
     | 
    
         
            +
            #include "oci8.h"
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            /*
         
     | 
| 
      
 18 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 19 
     | 
    
         
            +
            --- OCIBind#get()
         
     | 
| 
      
 20 
     | 
    
         
            +
                 get the bind value, which set by OCI call.
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                 :return value
         
     | 
| 
      
 23 
     | 
    
         
            +
                    the bind value. Its datatype is correspond to the 2nd argument of ((<OCIStmt#bindByPos>)) or ((<OCIStmt#bindByName>)).
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                 correspond native OCI function: nothing
         
     | 
| 
      
 26 
     | 
    
         
            +
            =end
         
     | 
| 
      
 27 
     | 
    
         
            +
            */
         
     | 
| 
      
 28 
     | 
    
         
            +
            static VALUE oci8_get_data(VALUE self)
         
     | 
| 
      
 29 
     | 
    
         
            +
            {
         
     | 
| 
      
 30 
     | 
    
         
            +
              oci8_bind_handle_t *defnhp;
         
     | 
| 
      
 31 
     | 
    
         
            +
              VALUE obj;
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              Data_Get_Struct(self, oci8_bind_handle_t, defnhp);
         
     | 
| 
      
 34 
     | 
    
         
            +
              obj = oci8_get_value(defnhp);
         
     | 
| 
      
 35 
     | 
    
         
            +
              return obj;
         
     | 
| 
      
 36 
     | 
    
         
            +
            }
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            /*
         
     | 
| 
      
 39 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 40 
     | 
    
         
            +
            --- OCIBind#set(value)
         
     | 
| 
      
 41 
     | 
    
         
            +
                 get the bind value to pass Oracle via OCI call.
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                 :value
         
     | 
| 
      
 44 
     | 
    
         
            +
                    the value to set the bind handle. Its datatype must be correspond to the 2nd argument of ((<OCIStmt#bindByPos>)) or ((<OCIStmt#bindByName>)).
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                 correspond native OCI function: nothing
         
     | 
| 
      
 47 
     | 
    
         
            +
            =end
         
     | 
| 
      
 48 
     | 
    
         
            +
            */
         
     | 
| 
      
 49 
     | 
    
         
            +
            static VALUE oci8_set_data(VALUE self, VALUE val)
         
     | 
| 
      
 50 
     | 
    
         
            +
            {
         
     | 
| 
      
 51 
     | 
    
         
            +
              oci8_bind_handle_t *hp;
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
              Data_Get_Struct(self, oci8_bind_handle_t, hp);
         
     | 
| 
      
 54 
     | 
    
         
            +
              oci8_set_value(hp, val);
         
     | 
| 
      
 55 
     | 
    
         
            +
              return self;
         
     | 
| 
      
 56 
     | 
    
         
            +
            }
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            void Init_oci8_bind(void)
         
     | 
| 
      
 59 
     | 
    
         
            +
            {
         
     | 
| 
      
 60 
     | 
    
         
            +
              rb_define_method(cOCIBind, "get", oci8_get_data, 0);
         
     | 
| 
      
 61 
     | 
    
         
            +
              rb_define_method(cOCIBind, "set", oci8_set_data, 1);
         
     | 
| 
      
 62 
     | 
    
         
            +
            }
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            VALUE oci8_get_value(oci8_bind_handle_t *hp)
         
     | 
| 
      
 65 
     | 
    
         
            +
            {
         
     | 
| 
      
 66 
     | 
    
         
            +
              ora_date_t *od;
         
     | 
| 
      
 67 
     | 
    
         
            +
              ora_vnumber_t *ovn;
         
     | 
| 
      
 68 
     | 
    
         
            +
              VALUE obj;
         
     | 
| 
      
 69 
     | 
    
         
            +
              unsigned char buf[ORA_NUMBER_BUF_SIZE];
         
     | 
| 
      
 70 
     | 
    
         
            +
              int year, month, day, hour, minute, second;
         
     | 
| 
      
 71 
     | 
    
         
            +
              static ID id_local = (ID)-1;
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
              if (hp->ind != 0)
         
     | 
| 
      
 74 
     | 
    
         
            +
                return Qnil;
         
     | 
| 
      
 75 
     | 
    
         
            +
              switch (hp->bind_type) {
         
     | 
| 
      
 76 
     | 
    
         
            +
              case BIND_STRING:
         
     | 
| 
      
 77 
     | 
    
         
            +
                return rb_str_new(hp->value.str.buf, hp->value.str.len);
         
     | 
| 
      
 78 
     | 
    
         
            +
              case BIND_FIXNUM:
         
     | 
| 
      
 79 
     | 
    
         
            +
                return LONG2NUM(hp->value.lng);
         
     | 
| 
      
 80 
     | 
    
         
            +
              case BIND_INTEGER_VIA_ORA_NUMBER:
         
     | 
| 
      
 81 
     | 
    
         
            +
                ora_number_to_str(buf, NULL, &(hp->value.on), hp->rlen);
         
     | 
| 
      
 82 
     | 
    
         
            +
                return rb_cstr2inum(TO_CHARPTR(buf), 10);
         
     | 
| 
      
 83 
     | 
    
         
            +
              case BIND_TIME_VIA_ORA_DATE:
         
     | 
| 
      
 84 
     | 
    
         
            +
                oci8_get_ora_date(&(hp->value.od), &year, &month, &day, &hour, &minute, &second);
         
     | 
| 
      
 85 
     | 
    
         
            +
                if (id_local == (ID)-1)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  id_local = rb_intern("local");
         
     | 
| 
      
 87 
     | 
    
         
            +
                return rb_funcall(rb_cTime, id_local, 6, INT2FIX(year), INT2FIX(month), INT2FIX(day), INT2FIX(hour), INT2FIX(minute), INT2FIX(second));
         
     | 
| 
      
 88 
     | 
    
         
            +
              case BIND_FLOAT:
         
     | 
| 
      
 89 
     | 
    
         
            +
              case BIND_BINARY_DOUBLE:
         
     | 
| 
      
 90 
     | 
    
         
            +
                return rb_float_new(hp->value.dbl);
         
     | 
| 
      
 91 
     | 
    
         
            +
              case BIND_ORA_DATE:
         
     | 
| 
      
 92 
     | 
    
         
            +
                obj = Data_Make_Struct(cOraDate, ora_date_t, NULL, xfree, od);
         
     | 
| 
      
 93 
     | 
    
         
            +
                memcpy(od, &(hp->value.od), sizeof(ora_date_t));
         
     | 
| 
      
 94 
     | 
    
         
            +
                return obj;
         
     | 
| 
      
 95 
     | 
    
         
            +
              case BIND_ORA_NUMBER:
         
     | 
| 
      
 96 
     | 
    
         
            +
                obj = Data_Make_Struct(cOraNumber, ora_vnumber_t, NULL, xfree, ovn);
         
     | 
| 
      
 97 
     | 
    
         
            +
                ovn->size = hp->rlen;
         
     | 
| 
      
 98 
     | 
    
         
            +
                memcpy(&(ovn->num), &(hp->value.on), sizeof(ora_number_t));
         
     | 
| 
      
 99 
     | 
    
         
            +
                return obj;
         
     | 
| 
      
 100 
     | 
    
         
            +
              case BIND_HANDLE:
         
     | 
| 
      
 101 
     | 
    
         
            +
                return hp->value.handle.v;
         
     | 
| 
      
 102 
     | 
    
         
            +
              }
         
     | 
| 
      
 103 
     | 
    
         
            +
              rb_bug("unsupported data type: %d", hp->bind_type);
         
     | 
| 
      
 104 
     | 
    
         
            +
            }
         
     | 
| 
      
 105 
     | 
    
         
            +
             
     | 
| 
      
 106 
     | 
    
         
            +
            void oci8_set_value(oci8_bind_handle_t *hp, VALUE val)
         
     | 
| 
      
 107 
     | 
    
         
            +
            {
         
     | 
| 
      
 108 
     | 
    
         
            +
              ora_date_t *od;
         
     | 
| 
      
 109 
     | 
    
         
            +
              ora_vnumber_t *ovn;
         
     | 
| 
      
 110 
     | 
    
         
            +
              int year, mon, day, hour, min, sec;
         
     | 
| 
      
 111 
     | 
    
         
            +
              static ID id_year = (ID)-1;
         
     | 
| 
      
 112 
     | 
    
         
            +
              static ID id_mon = (ID)-1;
         
     | 
| 
      
 113 
     | 
    
         
            +
              static ID id_day = (ID)-1;
         
     | 
| 
      
 114 
     | 
    
         
            +
              static ID id_hour = (ID)-1;
         
     | 
| 
      
 115 
     | 
    
         
            +
              static ID id_min = (ID)-1;
         
     | 
| 
      
 116 
     | 
    
         
            +
              static ID id_sec = (ID)-1;
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              if (NIL_P(val)) {
         
     | 
| 
      
 119 
     | 
    
         
            +
                hp->ind = -1;
         
     | 
| 
      
 120 
     | 
    
         
            +
                return;
         
     | 
| 
      
 121 
     | 
    
         
            +
              }
         
     | 
| 
      
 122 
     | 
    
         
            +
              switch (hp->bind_type) {
         
     | 
| 
      
 123 
     | 
    
         
            +
              case BIND_FIXNUM:
         
     | 
| 
      
 124 
     | 
    
         
            +
                Check_Type(val, T_FIXNUM);
         
     | 
| 
      
 125 
     | 
    
         
            +
                hp->value.lng = FIX2LONG(val);
         
     | 
| 
      
 126 
     | 
    
         
            +
                break;
         
     | 
| 
      
 127 
     | 
    
         
            +
              case BIND_STRING:
         
     | 
| 
      
 128 
     | 
    
         
            +
                Check_Type(val, T_STRING);
         
     | 
| 
      
 129 
     | 
    
         
            +
                if (hp->value_sz - 4 < RSTRING_LEN(val)) {
         
     | 
| 
      
 130 
     | 
    
         
            +
                  rb_raise(rb_eArgError, "Assigned string is too long. %ld (max %d)", RSTRING_LEN(val), hp->value_sz - 4);
         
     | 
| 
      
 131 
     | 
    
         
            +
                }
         
     | 
| 
      
 132 
     | 
    
         
            +
                memcpy(hp->value.str.buf, RSTRING_PTR(val), RSTRING_LEN(val));
         
     | 
| 
      
 133 
     | 
    
         
            +
                hp->value.str.len = RSTRING_LEN(val);
         
     | 
| 
      
 134 
     | 
    
         
            +
                break;
         
     | 
| 
      
 135 
     | 
    
         
            +
              case BIND_TIME_VIA_ORA_DATE:
         
     | 
| 
      
 136 
     | 
    
         
            +
                if (!rb_obj_is_instance_of(val, rb_cTime)) {
         
     | 
| 
      
 137 
     | 
    
         
            +
                  rb_raise(rb_eTypeError, "invalid argument (expect Time)");
         
     | 
| 
      
 138 
     | 
    
         
            +
                }
         
     | 
| 
      
 139 
     | 
    
         
            +
            #define GET_TIME_OF_XXX(name) \
         
     | 
| 
      
 140 
     | 
    
         
            +
                if (id_##name == (ID)-1) \
         
     | 
| 
      
 141 
     | 
    
         
            +
                  id_##name = rb_intern(#name); \
         
     | 
| 
      
 142 
     | 
    
         
            +
                name = FIX2INT(rb_funcall(val, id_##name, 0))
         
     | 
| 
      
 143 
     | 
    
         
            +
                GET_TIME_OF_XXX(year);
         
     | 
| 
      
 144 
     | 
    
         
            +
                GET_TIME_OF_XXX(mon);
         
     | 
| 
      
 145 
     | 
    
         
            +
                GET_TIME_OF_XXX(day);
         
     | 
| 
      
 146 
     | 
    
         
            +
                GET_TIME_OF_XXX(hour);
         
     | 
| 
      
 147 
     | 
    
         
            +
                GET_TIME_OF_XXX(min);
         
     | 
| 
      
 148 
     | 
    
         
            +
                GET_TIME_OF_XXX(sec);
         
     | 
| 
      
 149 
     | 
    
         
            +
                oci8_set_ora_date(&(hp->value.od), year, mon, day, hour, min, sec);
         
     | 
| 
      
 150 
     | 
    
         
            +
                break;
         
     | 
| 
      
 151 
     | 
    
         
            +
              case BIND_FLOAT:
         
     | 
| 
      
 152 
     | 
    
         
            +
              case BIND_BINARY_DOUBLE:
         
     | 
| 
      
 153 
     | 
    
         
            +
                Check_Type(val, T_FLOAT);
         
     | 
| 
      
 154 
     | 
    
         
            +
                hp->value.dbl = RFLOAT(val)->value;
         
     | 
| 
      
 155 
     | 
    
         
            +
                break;
         
     | 
| 
      
 156 
     | 
    
         
            +
              case BIND_ORA_DATE:
         
     | 
| 
      
 157 
     | 
    
         
            +
                if (!rb_obj_is_instance_of(val, cOraDate)) {
         
     | 
| 
      
 158 
     | 
    
         
            +
                  rb_raise(rb_eTypeError, "invalid argument (expect OraDate)");
         
     | 
| 
      
 159 
     | 
    
         
            +
                }
         
     | 
| 
      
 160 
     | 
    
         
            +
                Data_Get_Struct(val, ora_date_t, od);
         
     | 
| 
      
 161 
     | 
    
         
            +
                memcpy(&(hp->value.od), od, sizeof(ora_date_t));
         
     | 
| 
      
 162 
     | 
    
         
            +
                break;
         
     | 
| 
      
 163 
     | 
    
         
            +
              case BIND_INTEGER_VIA_ORA_NUMBER:
         
     | 
| 
      
 164 
     | 
    
         
            +
              case BIND_ORA_NUMBER:
         
     | 
| 
      
 165 
     | 
    
         
            +
                if (rb_obj_is_instance_of(val, cOraNumber)) {
         
     | 
| 
      
 166 
     | 
    
         
            +
                  Data_Get_Struct(val, ora_vnumber_t, ovn);
         
     | 
| 
      
 167 
     | 
    
         
            +
                  hp->rlen = ovn->size;
         
     | 
| 
      
 168 
     | 
    
         
            +
                  memcpy(&(hp->value.on), &(ovn->num), sizeof(ora_number_t));
         
     | 
| 
      
 169 
     | 
    
         
            +
                } else if (rb_obj_is_kind_of(val, rb_cNumeric)) {
         
     | 
| 
      
 170 
     | 
    
         
            +
                  ora_vnumber_t ovn;
         
     | 
| 
      
 171 
     | 
    
         
            +
                  if (set_oci_vnumber(&ovn, val, hp->errhp) == 0) {
         
     | 
| 
      
 172 
     | 
    
         
            +
            	rb_raise(rb_eTypeError, "could not bind value.");
         
     | 
| 
      
 173 
     | 
    
         
            +
                  }
         
     | 
| 
      
 174 
     | 
    
         
            +
                  hp->rlen = ovn.size;
         
     | 
| 
      
 175 
     | 
    
         
            +
                  memcpy(&(hp->value.on), &(ovn.num), sizeof(ora_number_t));
         
     | 
| 
      
 176 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 177 
     | 
    
         
            +
                  rb_raise(rb_eTypeError, "invalid argument (expect OraNumber)");
         
     | 
| 
      
 178 
     | 
    
         
            +
                }
         
     | 
| 
      
 179 
     | 
    
         
            +
                break;
         
     | 
| 
      
 180 
     | 
    
         
            +
              case BIND_HANDLE:
         
     | 
| 
      
 181 
     | 
    
         
            +
                if (rb_obj_is_kind_of(val, hp->value.handle.klass)) {
         
     | 
| 
      
 182 
     | 
    
         
            +
                  oci8_handle_t *h;
         
     | 
| 
      
 183 
     | 
    
         
            +
                  Get_Handle(val, h);
         
     | 
| 
      
 184 
     | 
    
         
            +
                  hp->value.handle.v = val;
         
     | 
| 
      
 185 
     | 
    
         
            +
                  hp->value.handle.hp = h->hp;
         
     | 
| 
      
 186 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 187 
     | 
    
         
            +
                  rb_raise(rb_eTypeError, "invalid argument: %s (expect %s)", rb_obj_classname(val), rb_class2name(hp->value.handle.klass));
         
     | 
| 
      
 188 
     | 
    
         
            +
                }
         
     | 
| 
      
 189 
     | 
    
         
            +
                break;
         
     | 
| 
      
 190 
     | 
    
         
            +
              default:
         
     | 
| 
      
 191 
     | 
    
         
            +
                rb_bug("unsupported data type: %d", hp->bind_type);
         
     | 
| 
      
 192 
     | 
    
         
            +
              }
         
     | 
| 
      
 193 
     | 
    
         
            +
              hp->ind = 0;
         
     | 
| 
      
 194 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/oci8/const.c
    ADDED
    
    | 
         @@ -0,0 +1,165 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
              const.c - part of ruby-oci8
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              Copyright (C) 2002-2006 KUBO Takehiro <kubo@jiubao.org>
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              define constant values.
         
     | 
| 
      
 7 
     | 
    
         
            +
            */
         
     | 
| 
      
 8 
     | 
    
         
            +
            #include "oci8.h"
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            ID oci8_id_code;
         
     | 
| 
      
 11 
     | 
    
         
            +
            ID oci8_id_define_array;
         
     | 
| 
      
 12 
     | 
    
         
            +
            ID oci8_id_bind_hash;
         
     | 
| 
      
 13 
     | 
    
         
            +
            ID oci8_id_message;
         
     | 
| 
      
 14 
     | 
    
         
            +
            ID oci8_id_new;
         
     | 
| 
      
 15 
     | 
    
         
            +
            ID oci8_id_parse_error_offset;
         
     | 
| 
      
 16 
     | 
    
         
            +
            ID oci8_id_server;
         
     | 
| 
      
 17 
     | 
    
         
            +
            ID oci8_id_session;
         
     | 
| 
      
 18 
     | 
    
         
            +
            ID oci8_id_sql;
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            struct oci8_names {
         
     | 
| 
      
 21 
     | 
    
         
            +
              const char *name;
         
     | 
| 
      
 22 
     | 
    
         
            +
              VALUE value;
         
     | 
| 
      
 23 
     | 
    
         
            +
            };
         
     | 
| 
      
 24 
     | 
    
         
            +
            typedef struct oci8_names oci8_names_t;
         
     | 
| 
      
 25 
     | 
    
         
            +
            #define ENTRY(name) {#name, INT2FIX(name)}
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            static oci8_names_t oci8_typecode[] = {
         
     | 
| 
      
 28 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_VARCHAR),          /* 1(SQLT_CHR) */
         
     | 
| 
      
 29 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_NUMBER),           /* 2(SQLT_NUM) */
         
     | 
| 
      
 30 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_DATE),             /* 12(SQLT_DAT) */
         
     | 
| 
      
 31 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_UNSIGNED8),        /* 23(SQLT_BIN) */
         
     | 
| 
      
 32 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_RAW),              /* 95(SQLT_LVB) */
         
     | 
| 
      
 33 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_CHAR),             /* 96(SQLT_AFC) */
         
     | 
| 
      
 34 
     | 
    
         
            +
            #ifdef OCI_TYPECODE_BDOUBLE
         
     | 
| 
      
 35 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_BDOUBLE),          /* 101(SQLT_IBDOUBLE) */
         
     | 
| 
      
 36 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 37 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_OBJECT),           /* 108(SQLT_NTY) */
         
     | 
| 
      
 38 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_BLOB),             /* 113(SQLT_BLOB) */
         
     | 
| 
      
 39 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_CLOB),             /* 112(SQLT_CLOB) */
         
     | 
| 
      
 40 
     | 
    
         
            +
              ENTRY(OCI_TYPECODE_NAMEDCOLLECTION),  /* 122(SQLT_NCO) */
         
     | 
| 
      
 41 
     | 
    
         
            +
              ENTRY(SQLT_RDD) /* 104 */
         
     | 
| 
      
 42 
     | 
    
         
            +
            };
         
     | 
| 
      
 43 
     | 
    
         
            +
            #define NUM_OF_OCI8_TYPECODE (sizeof(oci8_typecode) / sizeof(oci8_typecode[0]))
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            static VALUE oci8_make_names(oci8_names_t *names, size_t size)
         
     | 
| 
      
 46 
     | 
    
         
            +
            {
         
     | 
| 
      
 47 
     | 
    
         
            +
              volatile VALUE ary;
         
     | 
| 
      
 48 
     | 
    
         
            +
              int i;
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
              ary = rb_ary_new();
         
     | 
| 
      
 51 
     | 
    
         
            +
              for (i = 0;i < size;i++)
         
     | 
| 
      
 52 
     | 
    
         
            +
                rb_ary_store(ary, FIX2INT(names[i].value), rb_str_new2(names[i].name));
         
     | 
| 
      
 53 
     | 
    
         
            +
              return ary;
         
     | 
| 
      
 54 
     | 
    
         
            +
            }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            void  Init_oci8_const(void)
         
     | 
| 
      
 57 
     | 
    
         
            +
            {
         
     | 
| 
      
 58 
     | 
    
         
            +
              int i;
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              oci8_id_code = rb_intern("code");
         
     | 
| 
      
 61 
     | 
    
         
            +
              oci8_id_define_array = rb_intern("define_array");
         
     | 
| 
      
 62 
     | 
    
         
            +
              oci8_id_bind_hash = rb_intern("bind_hash");
         
     | 
| 
      
 63 
     | 
    
         
            +
              oci8_id_message = rb_intern("message");
         
     | 
| 
      
 64 
     | 
    
         
            +
              oci8_id_new = rb_intern("new");
         
     | 
| 
      
 65 
     | 
    
         
            +
              oci8_id_parse_error_offset = rb_intern("parse_error_offset");
         
     | 
| 
      
 66 
     | 
    
         
            +
              oci8_id_server = rb_intern("server");
         
     | 
| 
      
 67 
     | 
    
         
            +
              oci8_id_session = rb_intern("session");
         
     | 
| 
      
 68 
     | 
    
         
            +
              oci8_id_sql = rb_intern("sql");
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
              rb_define_global_const("OCI_DEFAULT", INT2FIX(OCI_DEFAULT));
         
     | 
| 
      
 71 
     | 
    
         
            +
              rb_define_global_const("OCI_OBJECT", INT2FIX(OCI_OBJECT));
         
     | 
| 
      
 72 
     | 
    
         
            +
              rb_define_global_const("OCI_CRED_RDBMS", INT2FIX(OCI_CRED_RDBMS));
         
     | 
| 
      
 73 
     | 
    
         
            +
              rb_define_global_const("OCI_CRED_EXT", INT2FIX(OCI_CRED_EXT));
         
     | 
| 
      
 74 
     | 
    
         
            +
              rb_define_global_const("OCI_MIGRATE", INT2FIX(OCI_MIGRATE));
         
     | 
| 
      
 75 
     | 
    
         
            +
              rb_define_global_const("OCI_SYSDBA", INT2FIX(OCI_SYSDBA));
         
     | 
| 
      
 76 
     | 
    
         
            +
              rb_define_global_const("OCI_SYSOPER", INT2FIX(OCI_SYSOPER));
         
     | 
| 
      
 77 
     | 
    
         
            +
              rb_define_global_const("OCI_PRELIM_AUTH", INT2FIX(OCI_PRELIM_AUTH));
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
              /* OCIStmt#prepare */
         
     | 
| 
      
 80 
     | 
    
         
            +
              rb_define_global_const("OCI_NTV_SYNTAX", INT2FIX(OCI_NTV_SYNTAX));
         
     | 
| 
      
 81 
     | 
    
         
            +
              rb_define_global_const("OCI_V7_SYNTAX", INT2FIX(OCI_V7_SYNTAX));
         
     | 
| 
      
 82 
     | 
    
         
            +
              rb_define_global_const("OCI_V8_SYNTAX", INT2FIX(OCI_V8_SYNTAX));
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
              /* OCIStmt#execute */
         
     | 
| 
      
 85 
     | 
    
         
            +
            #ifdef OCI_BATCH_ERRORS
         
     | 
| 
      
 86 
     | 
    
         
            +
              rb_define_global_const("OCI_BATCH_ERRORS", INT2FIX(OCI_BATCH_ERRORS));
         
     | 
| 
      
 87 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 88 
     | 
    
         
            +
              rb_define_global_const("OCI_COMMIT_ON_SUCCESS", INT2FIX(OCI_COMMIT_ON_SUCCESS));
         
     | 
| 
      
 89 
     | 
    
         
            +
              rb_define_global_const("OCI_DESCRIBE_ONLY", INT2FIX(OCI_DESCRIBE_ONLY));
         
     | 
| 
      
 90 
     | 
    
         
            +
              rb_define_global_const("OCI_EXACT_FETCH", INT2FIX(OCI_EXACT_FETCH));
         
     | 
| 
      
 91 
     | 
    
         
            +
            #ifdef OCI_PARSE_ONLY
         
     | 
| 
      
 92 
     | 
    
         
            +
              rb_define_global_const("OCI_PARSE_ONLY", INT2FIX(OCI_PARSE_ONLY));
         
     | 
| 
      
 93 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 94 
     | 
    
         
            +
            #ifdef OCI_STMT_SCROLLABLE_READONLY
         
     | 
| 
      
 95 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_SCROLLABLE_READONLY", INT2FIX(OCI_STMT_SCROLLABLE_READONLY));
         
     | 
| 
      
 96 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              rb_define_global_const("OCI_AUTH", INT2FIX(OCI_AUTH));
         
     | 
| 
      
 99 
     | 
    
         
            +
            #ifdef OCI_SHARED
         
     | 
| 
      
 100 
     | 
    
         
            +
              rb_define_global_const("OCI_SHARED", INT2FIX(OCI_SHARED));
         
     | 
| 
      
 101 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 102 
     | 
    
         
            +
            #ifdef OCI_CPOOL
         
     | 
| 
      
 103 
     | 
    
         
            +
              rb_define_global_const("OCI_CPOOL", INT2FIX(OCI_CPOOL));
         
     | 
| 
      
 104 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 105 
     | 
    
         
            +
            #ifdef OCI_NO_SHARING
         
     | 
| 
      
 106 
     | 
    
         
            +
              rb_define_global_const("OCI_NO_SHARING", INT2FIX(OCI_NO_SHARING));
         
     | 
| 
      
 107 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
              rb_define_global_const("OCI_FETCH_NEXT", INT2FIX(OCI_FETCH_NEXT));
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
              for (i = 0;i < oci8_attr_size;i++) {
         
     | 
| 
      
 112 
     | 
    
         
            +
                rb_define_global_const(oci8_attr_list[i].name, INT2FIX(i));
         
     | 
| 
      
 113 
     | 
    
         
            +
              }
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
              /* TYPE CODE */
         
     | 
| 
      
 116 
     | 
    
         
            +
              for (i = 0;i < NUM_OF_OCI8_TYPECODE;i++)
         
     | 
| 
      
 117 
     | 
    
         
            +
                rb_define_global_const(oci8_typecode[i].name, oci8_typecode[i].value);
         
     | 
| 
      
 118 
     | 
    
         
            +
              rb_define_global_const("OCI_TYPECODE_NAMES", oci8_make_names(oci8_typecode, NUM_OF_OCI8_TYPECODE));
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
      
 120 
     | 
    
         
            +
              /* OCI Parameter Types */
         
     | 
| 
      
 121 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_UNK", INT2FIX(OCI_PTYPE_UNK));
         
     | 
| 
      
 122 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TABLE", INT2FIX(OCI_PTYPE_TABLE));
         
     | 
| 
      
 123 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_VIEW", INT2FIX(OCI_PTYPE_VIEW));
         
     | 
| 
      
 124 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_PROC", INT2FIX(OCI_PTYPE_PROC));
         
     | 
| 
      
 125 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_FUNC", INT2FIX(OCI_PTYPE_FUNC));
         
     | 
| 
      
 126 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_PKG", INT2FIX(OCI_PTYPE_PKG));
         
     | 
| 
      
 127 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TYPE", INT2FIX(OCI_PTYPE_TYPE));
         
     | 
| 
      
 128 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_SYN", INT2FIX(OCI_PTYPE_SYN));
         
     | 
| 
      
 129 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_SEQ", INT2FIX(OCI_PTYPE_SEQ));
         
     | 
| 
      
 130 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_COL", INT2FIX(OCI_PTYPE_COL));
         
     | 
| 
      
 131 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_ARG", INT2FIX(OCI_PTYPE_ARG));
         
     | 
| 
      
 132 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_LIST", INT2FIX(OCI_PTYPE_LIST));
         
     | 
| 
      
 133 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TYPE_ATTR", INT2FIX(OCI_PTYPE_TYPE_ATTR));
         
     | 
| 
      
 134 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TYPE_COLL", INT2FIX(OCI_PTYPE_TYPE_COLL));
         
     | 
| 
      
 135 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TYPE_METHOD", INT2FIX(OCI_PTYPE_TYPE_METHOD));
         
     | 
| 
      
 136 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TYPE_ARG", INT2FIX(OCI_PTYPE_TYPE_ARG));
         
     | 
| 
      
 137 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_TYPE_RESULT", INT2FIX(OCI_PTYPE_TYPE_RESULT));
         
     | 
| 
      
 138 
     | 
    
         
            +
            #ifdef OCI_PTYPE_SCHEMA
         
     | 
| 
      
 139 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_SCHEMA", INT2FIX(OCI_PTYPE_SCHEMA));
         
     | 
| 
      
 140 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 141 
     | 
    
         
            +
            #ifdef OCI_PTYPE_DATABASE
         
     | 
| 
      
 142 
     | 
    
         
            +
              rb_define_global_const("OCI_PTYPE_DATABASE", INT2FIX(OCI_PTYPE_DATABASE));
         
     | 
| 
      
 143 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
              /* Bind and Define Options */
         
     | 
| 
      
 146 
     | 
    
         
            +
              rb_define_global_const("OCI_DATA_AT_EXEC", INT2FIX(OCI_DATA_AT_EXEC));
         
     | 
| 
      
 147 
     | 
    
         
            +
              rb_define_global_const("OCI_DYNAMIC_FETCH", INT2FIX(OCI_DYNAMIC_FETCH));
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
              /* OCI Statement Types */
         
     | 
| 
      
 150 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_SELECT", INT2FIX(OCI_STMT_SELECT));
         
     | 
| 
      
 151 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_UPDATE", INT2FIX(OCI_STMT_UPDATE));
         
     | 
| 
      
 152 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_DELETE", INT2FIX(OCI_STMT_DELETE));
         
     | 
| 
      
 153 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_INSERT", INT2FIX(OCI_STMT_INSERT));
         
     | 
| 
      
 154 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_CREATE", INT2FIX(OCI_STMT_CREATE));
         
     | 
| 
      
 155 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_DROP", INT2FIX(OCI_STMT_DROP));
         
     | 
| 
      
 156 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_ALTER", INT2FIX(OCI_STMT_ALTER));
         
     | 
| 
      
 157 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_BEGIN", INT2FIX(OCI_STMT_BEGIN));
         
     | 
| 
      
 158 
     | 
    
         
            +
              rb_define_global_const("OCI_STMT_DECLARE", INT2FIX(OCI_STMT_DECLARE));
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
              /* Piece Definitions */
         
     | 
| 
      
 161 
     | 
    
         
            +
              rb_define_global_const("OCI_ONE_PIECE", INT2FIX(OCI_ONE_PIECE));
         
     | 
| 
      
 162 
     | 
    
         
            +
              rb_define_global_const("OCI_FIRST_PIECE", INT2FIX(OCI_FIRST_PIECE));
         
     | 
| 
      
 163 
     | 
    
         
            +
              rb_define_global_const("OCI_NEXT_PIECE", INT2FIX(OCI_NEXT_PIECE));
         
     | 
| 
      
 164 
     | 
    
         
            +
              rb_define_global_const("OCI_LAST_PIECE", INT2FIX(OCI_LAST_PIECE));
         
     | 
| 
      
 165 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/oci8/define.c
    ADDED
    
    | 
         @@ -0,0 +1,53 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
              define.c - part of ruby-oci8
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 7 
     | 
    
         
            +
            == OCIDefine
         
     | 
| 
      
 8 
     | 
    
         
            +
            The define handle, which is created by ((<OCIStmt#defineByPos>)).
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            The fetched data of select statements is got via this handle.
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            super class: ((<OCIHandle>))
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            correspond native OCI datatype: ((|OCIDefine|))
         
     | 
| 
      
 15 
     | 
    
         
            +
            =end
         
     | 
| 
      
 16 
     | 
    
         
            +
            */
         
     | 
| 
      
 17 
     | 
    
         
            +
            #include "oci8.h"
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            /*
         
     | 
| 
      
 20 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 21 
     | 
    
         
            +
            --- OCIDefine#get()
         
     | 
| 
      
 22 
     | 
    
         
            +
                 get the selected date.
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                 :return value
         
     | 
| 
      
 25 
     | 
    
         
            +
                    fetched data. Its datatype is correspond to the 2nd argument of ((<OCIStmt#defineByPos>)).
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                 correspond native OCI function: nothing
         
     | 
| 
      
 28 
     | 
    
         
            +
            =end
         
     | 
| 
      
 29 
     | 
    
         
            +
            */
         
     | 
| 
      
 30 
     | 
    
         
            +
            static VALUE oci8_get_data(VALUE self)
         
     | 
| 
      
 31 
     | 
    
         
            +
            {
         
     | 
| 
      
 32 
     | 
    
         
            +
              oci8_bind_handle_t *defnhp;
         
     | 
| 
      
 33 
     | 
    
         
            +
              VALUE obj;
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              Data_Get_Struct(self, oci8_bind_handle_t, defnhp);
         
     | 
| 
      
 36 
     | 
    
         
            +
              obj = oci8_get_value(defnhp);
         
     | 
| 
      
 37 
     | 
    
         
            +
              return obj;
         
     | 
| 
      
 38 
     | 
    
         
            +
            }
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            static VALUE oci8_set_data(VALUE self, VALUE val)
         
     | 
| 
      
 41 
     | 
    
         
            +
            {
         
     | 
| 
      
 42 
     | 
    
         
            +
              oci8_bind_handle_t *hp;
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
              Data_Get_Struct(self, oci8_bind_handle_t, hp);
         
     | 
| 
      
 45 
     | 
    
         
            +
              oci8_set_value(hp, val);
         
     | 
| 
      
 46 
     | 
    
         
            +
              return self;
         
     | 
| 
      
 47 
     | 
    
         
            +
            }
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            void Init_oci8_define(void)
         
     | 
| 
      
 50 
     | 
    
         
            +
            {
         
     | 
| 
      
 51 
     | 
    
         
            +
              rb_define_method(cOCIDefine, "get", oci8_get_data, 0);
         
     | 
| 
      
 52 
     | 
    
         
            +
              rb_define_method(cOCIDefine, "set", oci8_set_data, 1);
         
     | 
| 
      
 53 
     | 
    
         
            +
            }
         
     | 
    
        data/ext/oci8/describe.c
    ADDED
    
    | 
         @@ -0,0 +1,81 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /*
         
     | 
| 
      
 2 
     | 
    
         
            +
              describe.c - part of ruby-oci8
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
              Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 7 
     | 
    
         
            +
            == OCIDescribe
         
     | 
| 
      
 8 
     | 
    
         
            +
            The describe handle, which is used for the explicit describe.
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            super class: ((<OCIHandle>))
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            correspond native OCI datatype: ((|OCIDescribe|))
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            For example:
         
     | 
| 
      
 15 
     | 
    
         
            +
              dsc = env.alloc(OCIDescribe)
         
     | 
| 
      
 16 
     | 
    
         
            +
              dsc.describeAny(svc, "EMP", OCI_PTYPE_TABLE)
         
     | 
| 
      
 17 
     | 
    
         
            +
              parm = dsc.attrGet(OCI_ATTR_PARAM)
         
     | 
| 
      
 18 
     | 
    
         
            +
              ...get various information from parm...
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            TODO: more explanation and examples.
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            =end
         
     | 
| 
      
 23 
     | 
    
         
            +
            */
         
     | 
| 
      
 24 
     | 
    
         
            +
            #include "oci8.h"
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            /*
         
     | 
| 
      
 27 
     | 
    
         
            +
            =begin
         
     | 
| 
      
 28 
     | 
    
         
            +
            --- OCIDescribe#describeAny(svc, name, type)
         
     | 
| 
      
 29 
     | 
    
         
            +
                 get various information of Oracle's schema objects: tables, views, synonyms, 
         
     | 
| 
      
 30 
     | 
    
         
            +
                 procedures, functions, packages, sequences, and types.
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                 :svc
         
     | 
| 
      
 33 
     | 
    
         
            +
                    ((<service context handle|OCISvcCtx>)) in which the object to describe exists.
         
     | 
| 
      
 34 
     | 
    
         
            +
                 :name
         
     | 
| 
      
 35 
     | 
    
         
            +
                    name of object to describe.
         
     | 
| 
      
 36 
     | 
    
         
            +
                 :type
         
     | 
| 
      
 37 
     | 
    
         
            +
                    type of object to describe. 
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                    * ((|OCI_PTYPE_TABLE|)), for tables
         
     | 
| 
      
 40 
     | 
    
         
            +
                    * ((|OCI_PTYPE_VIEW|)), for views
         
     | 
| 
      
 41 
     | 
    
         
            +
                    * ((|OCI_PTYPE_PROC|)), for procedures
         
     | 
| 
      
 42 
     | 
    
         
            +
                    * ((|OCI_PTYPE_FUNC|)), for functions
         
     | 
| 
      
 43 
     | 
    
         
            +
                    * ((|OCI_PTYPE_PKG|)), for packages
         
     | 
| 
      
 44 
     | 
    
         
            +
                    * ((|OCI_PTYPE_TYPE|)), for types
         
     | 
| 
      
 45 
     | 
    
         
            +
                    * ((|OCI_PTYPE_SYN|)), for synonyms
         
     | 
| 
      
 46 
     | 
    
         
            +
                    * ((|OCI_PTYPE_SEQ|)), for sequences
         
     | 
| 
      
 47 
     | 
    
         
            +
                    * ((|OCI_PTYPE_SCHEMA|)), for schemas
         
     | 
| 
      
 48 
     | 
    
         
            +
                    * ((|OCI_PTYPE_DATABASE|)), for databases
         
     | 
| 
      
 49 
     | 
    
         
            +
                    * ((|OCI_PTYPE_UNK|)), for unknown schema objects
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                 correspond native OCI function: ((|OCIDescribeAny|))
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                 ((*note*)): To use this method in Oracle 8.0.5 for Linux,
         
     | 
| 
      
 54 
     | 
    
         
            +
                 call OCIEnv.create with OCI_OBJECT or segmentation fault occurs.
         
     | 
| 
      
 55 
     | 
    
         
            +
                 This bug was fixed 8.0.6 or later.
         
     | 
| 
      
 56 
     | 
    
         
            +
            =end
         
     | 
| 
      
 57 
     | 
    
         
            +
            */
         
     | 
| 
      
 58 
     | 
    
         
            +
            static VALUE oci8_describe_any(VALUE self, VALUE vdsc, VALUE vname, VALUE vtype)
         
     | 
| 
      
 59 
     | 
    
         
            +
            {
         
     | 
| 
      
 60 
     | 
    
         
            +
              oci8_handle_t *h;
         
     | 
| 
      
 61 
     | 
    
         
            +
              oci8_handle_t *svch;
         
     | 
| 
      
 62 
     | 
    
         
            +
              oci8_string_t name;
         
     | 
| 
      
 63 
     | 
    
         
            +
              ub1 type;
         
     | 
| 
      
 64 
     | 
    
         
            +
              sword rv;
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              Get_Handle(self, h); /* 0 */
         
     | 
| 
      
 67 
     | 
    
         
            +
              Check_Handle(vdsc, OCISvcCtx, svch); /* 1 */
         
     | 
| 
      
 68 
     | 
    
         
            +
              Get_String(vname, name); /* 2 */
         
     | 
| 
      
 69 
     | 
    
         
            +
              type = FIX2INT(vtype); /* 3 */
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
              rv = OCIDescribeAny(svch->hp, h->errhp, name.ptr, name.len, OCI_OTYPE_NAME, OCI_DEFAULT, type, h->hp);
         
     | 
| 
      
 72 
     | 
    
         
            +
              if (rv != OCI_SUCCESS) {
         
     | 
| 
      
 73 
     | 
    
         
            +
                oci8_raise(h->errhp, rv, NULL);
         
     | 
| 
      
 74 
     | 
    
         
            +
              }
         
     | 
| 
      
 75 
     | 
    
         
            +
              return self;
         
     | 
| 
      
 76 
     | 
    
         
            +
            }
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            void Init_oci8_describe(void)
         
     | 
| 
      
 79 
     | 
    
         
            +
            {
         
     | 
| 
      
 80 
     | 
    
         
            +
              rb_define_method(cOCIDescribe, "describeAny", oci8_describe_any, 3);
         
     | 
| 
      
 81 
     | 
    
         
            +
            }
         
     |