cubrid 0.65 → 9.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (11) hide show
  1. data/README.rdoc +1 -1
  2. data/ext/build_cci.sh +19 -0
  3. data/ext/cci.bz2 +0 -0
  4. data/ext/conn.c +57 -39
  5. data/ext/cubrid.c +194 -197
  6. data/ext/cubrid.h +122 -98
  7. data/ext/error.c +151 -144
  8. data/ext/extconf.rb +52 -19
  9. data/ext/stmt.c +1012 -1019
  10. metadata +28 -31
  11. checksums.yaml +0 -7
@@ -36,7 +36,7 @@ Use Case:
36
36
 
37
37
  #1: @con = Cubrid.connect('dbname')
38
38
  #2: @con = Cubrid.connect('dbname', 'host', 'port', 'username', 'password')
39
- @con = Cubrid.connect('demodb', 'localhost', '30000', 'public', '')
39
+ @con = Cubrid.connect('demodb', 'localhost', 30000, 'public', '')
40
40
 
41
41
  puts @con.server_version
42
42
 
@@ -0,0 +1,19 @@
1
+ #!/bin/bash
2
+
3
+ #echo "build_cci sh."
4
+ if [ -f cci-src/cci/.libs/libcascci.a ];then
5
+ # echo "libcascci.a exist."
6
+ exit 0
7
+ fi
8
+
9
+ tar xvjf cci.bz2
10
+ cd cci-src
11
+ chmod +x configure
12
+ chmod +x external/libregex38a/configure
13
+ if [ "$1" = 'x86' ];then
14
+ ./configure
15
+ else
16
+ ./configure --enable-64bit
17
+ fi
18
+
19
+ make
Binary file
data/ext/conn.c CHANGED
@@ -57,10 +57,11 @@ cubrid_conn_new(char *host, int port, char *db, char *user, char *passwd)
57
57
  VALUE conn;
58
58
  Connection *c;
59
59
  int handle;
60
+ T_CCI_ERROR error;
60
61
 
61
- handle = cci_connect(host, port, db, user, passwd);
62
+ handle = cci_connect_ex(host, port, db, user, passwd,&error);
62
63
  if (handle < 0) {
63
- cubrid_handle_error(handle, NULL);
64
+ cubrid_handle_error(handle, &error);
64
65
  return Qnil;
65
66
  }
66
67
 
@@ -79,7 +80,6 @@ cubrid_conn_new(char *host, int port, char *db, char *user, char *passwd)
79
80
  /* call-seq:
80
81
  * close() -> nil
81
82
  *
82
- * 데이터베이스와의 연결을 헤제합니다. 이 연결로부터 생성된 Statement도 모두 close됩니다.
83
83
  */
84
84
  VALUE
85
85
  cubrid_conn_close(VALUE self)
@@ -123,15 +123,6 @@ cubrid_conn_prepare_internal(int argc, VALUE* argv, VALUE self)
123
123
  * prepare(sql <, option>) -> Statement
124
124
  * prepare(sql <, option>) { |stmt| block } -> nil
125
125
  *
126
- * 주어진 SQL을 실행할 준비를 하고 Statement 객체를 반환합니다.
127
- * SQL은 데이터베이스 서버로 보내져 파싱되어 실행할 수 있도록 준비됩니다.
128
- *
129
- * option으로 Cubrid::INCLUDE_OID를 줄 수 있는데, 이것은 SQL 실행 결과에 OID를 포함하도록 합니다.
130
- * 실행 결과에 포함된 OID는 Statement.get_oid 메쏘드로 얻을 수 있습니다.
131
- *
132
- * block 주어지면 생성된 Statement 객체를 인수로 전달하여 block을 실행시킵니다.
133
- * block의 수행이 끝나면 Statement 객체는 더이상 유효하지 않습니다.
134
- *
135
126
  * con = Cubrid.connect('demodb')
136
127
  * stmt = con.prepare('SELECT * FROM db_user')
137
128
  * stmt.execute
@@ -169,15 +160,6 @@ cubrid_conn_prepare(int argc, VALUE* argv, VALUE self)
169
160
  * query(sql <, option>) -> Statement
170
161
  * query(sql <, option>) { |row| block } -> nil
171
162
  *
172
- * 주어진 SQL을 실행할 준비를 하고 실행까지 시킨 후 Statement 객체를 반환합니다.
173
- * 따라서 Statement.execute를 수행할 필요없이 바로 결과를 받아올 수 있습니다.
174
- *
175
- * option으로 Cubrid::INCLUDE_OID를 줄 수 있는데, 이것은 prepare 메쏘드의 그것과 동일합니다.
176
- *
177
- * block 주어지면 Statement.fetch를 호출하여 얻어온 결과를 인수로 전달하여 block을 실행시킵니다.
178
- * block은 SQL 실행 결과로 넘어온 모든 row 대해서 한번씩 호출됩니다.
179
- * block이 끝나면 Statement 객체는 더 이상 유효하지 않습니다.
180
- *
181
163
  * con = Cubrid.connect('demodb')
182
164
  * stmt = con.query('SELECT * FROM db_user')
183
165
  * while row = stmt.fetch
@@ -238,10 +220,6 @@ cubrid_conn_end_tran(Connection *con, int type)
238
220
 
239
221
  /* call-seq:
240
222
  * commit() -> nil
241
- *
242
- * 트랜잭션을 commit으로 종료합니다.
243
- * 트랜잭션이 종료되면 이 연결로 부터 생성된 모든 Statement 객체도 모두 close 됩니다.
244
- *
245
223
  */
246
224
  VALUE
247
225
  cubrid_conn_commit(VALUE self)
@@ -256,9 +234,6 @@ cubrid_conn_commit(VALUE self)
256
234
 
257
235
  /* call-seq:
258
236
  * rollback() -> nil
259
- *
260
- * 트랜잭션을 rollback으로 종료합니다.
261
- * 트랜잭션이 종료되면 이 연결로 부터 생성된 모든 Statement 객체도 모두 close 됩니다.
262
237
  *
263
238
  */
264
239
  VALUE
@@ -271,13 +246,48 @@ cubrid_conn_rollback(VALUE self)
271
246
 
272
247
  return Qnil;
273
248
  }
249
+ /* call-seq:
250
+ * last_insert_id? -> last_insert_id
251
+ *
252
+ */
253
+
254
+ VALUE
255
+ cubrid_conn_get_last_insert_id(VALUE self)
256
+ {
257
+ Connection *con;
258
+ char *name = NULL;
259
+ char ret[1024] = { '\0' };
260
+ int res;
261
+ T_CCI_ERROR error;
262
+
263
+ GET_CONN_STRUCT(self, con);
264
+ CHECK_CONNECTION(con, Qnil);
265
+
266
+ /* cci_last_id set last_id as allocated string */
267
+ res = cci_get_last_insert_id (con->handle, &name, &error);
268
+
269
+ if (res < 0)
270
+ {
271
+ cubrid_handle_error (res, &error);
272
+ return Qnil;
273
+ }
274
+
275
+ if (!name)
276
+ {
277
+ return Qnil;
278
+ }
279
+ else
280
+ {
281
+ strncpy (ret, name, sizeof (ret) - 1);
282
+ }
283
+
284
+ return rb_str_new2(ret);
285
+
286
+ }
287
+
274
288
 
275
289
  /* call-seq:
276
290
  * auto_commit? -> true or false
277
- *
278
- * Connection이 auto commit 모드인지 아닌지를 반환합니다.
279
- * Connection은 기본적으로 auto commit 모드가 아니며, auto_commit= 메쏘드로 auto commit 여부를 설정할 수 있습니다.
280
- *
281
291
  */
282
292
  VALUE
283
293
  cubrid_conn_get_auto_commit(VALUE self)
@@ -292,19 +302,30 @@ cubrid_conn_get_auto_commit(VALUE self)
292
302
 
293
303
  /* call-seq:
294
304
  * auto_commit= true or false -> nil
295
- *
296
- * Connection의 auto commit 모드를 설정합니다.
297
- * auto commit이 true로 설정되면 Statement.execute의 실행이 끝난 후 바로 commit이 실행됩니다.
298
- *
299
305
  */
300
306
  VALUE
301
307
  cubrid_conn_set_auto_commit(VALUE self, VALUE auto_commit)
302
308
  {
303
309
  Connection *con;
310
+ int res=0;
304
311
 
305
312
  GET_CONN_STRUCT(self, con);
306
313
  CHECK_CONNECTION(con, self);
307
314
 
315
+ if(auto_commit == Qtrue)
316
+ {
317
+ res = cci_set_autocommit(con->handle,CCI_AUTOCOMMIT_TRUE);
318
+ }
319
+ else
320
+ {
321
+ res = cci_set_autocommit(con->handle,CCI_AUTOCOMMIT_FALSE);
322
+ }
323
+
324
+ if (res < 0)
325
+ {
326
+ cubrid_handle_error (res, NULL);
327
+ return Qnil;
328
+ }
308
329
  con->auto_commit = auto_commit;
309
330
  return Qnil;
310
331
  }
@@ -312,7 +333,6 @@ cubrid_conn_set_auto_commit(VALUE self, VALUE auto_commit)
312
333
  /* call-seq:
313
334
  * to_s() -> string
314
335
  *
315
- * Connection의 현재 연결 정보를 문자열로 반환합니다.
316
336
  */
317
337
  VALUE
318
338
  cubrid_conn_to_s(VALUE self)
@@ -328,8 +348,6 @@ cubrid_conn_to_s(VALUE self)
328
348
 
329
349
  /* call-seq:
330
350
  * server_version() -> string
331
- *
332
- * 연결된 서버의 버전을 문자열로 반환합니다.
333
351
  */
334
352
  VALUE
335
353
  cubrid_conn_server_version(VALUE self)
@@ -1,197 +1,194 @@
1
- /*
2
- * Copyright (C) 2008 Search Solution Corporation. All rights reserved by Search Solution.
3
- *
4
- * Redistribution and use in source and binary forms, with or without modification,
5
- * are permitted provided that the following conditions are met:
6
- *
7
- * - Redistributions of source code must retain the above copyright notice,
8
- * this list of conditions and the following disclaimer.
9
- *
10
- * - Redistributions in binary form must reproduce the above copyright notice,
11
- * this list of conditions and the following disclaimer in the documentation
12
- * and/or other materials provided with the distribution.
13
- *
14
- * - Neither the name of the <ORGANIZATION> nor the names of its contributors
15
- * may be used to endorse or promote products derived from this software without
16
- * specific prior written permission.
17
- *
18
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
- * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24
- * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
27
- * OF SUCH DAMAGE.
28
- *
29
- */
30
-
31
- #include "cubrid.h"
32
-
33
- char *cci_client_name = "CCI"; /* for lower than 7.0 */
34
- VALUE cCubrid, cConnection, cStatement, cOid;
35
- extern VALUE cubrid_conn_new(char *host, int port, char *db, char *user, char *passwd);
36
-
37
- /* call-seq:
38
- * connect(db, host, port, user, password) -> Connection
39
- *
40
- * 데이터베이스 서버에 연결하고 Connection 객체를 반환합니다.
41
- * db는 반드시 주어져야 하고, host, port, user, password는 옵션입니다.
42
- * 이들의 디폴트 값은 각각 'localhost', 30000, 'PUBLIC', '' 입니다.
43
- *
44
- * con = Cubrid.connect('demodb', '192.168.1.1', '33000', 'foo','bar')
45
- * con.to_s #=> host: 192.168.1.1, port: 33000, db: demodb, user: foo
46
- *
47
- * con = Cubrid.connect('subway')
48
- * con.to_s #=> host: localhost, port: 30000, db: subway, user: PUBLIC
49
- *
50
- * con = Cubrid.connect('subway', '192.168.1.2')
51
- * con.to_s #=> host: 192.168.1.2, port: 33000, db: subway, user: PUBLIC
52
- */
53
- VALUE cubrid_connect(int argc, VALUE* argv, VALUE self)
54
- {
55
- VALUE host, port, db, user, passwd;
56
-
57
- rb_scan_args(argc, argv, "14", &db, &host, &port, &user, &passwd);
58
-
59
- if (NIL_P(db))
60
- rb_raise(rb_eStandardError, "DB name is required.");
61
-
62
- if (NIL_P(host))
63
- host = rb_str_new2("localhost");
64
-
65
- if (NIL_P(port))
66
- port = INT2NUM(30000);
67
-
68
- if (NIL_P(user))
69
- user = rb_str_new2("PUBLIC");
70
-
71
- if (NIL_P(passwd))
72
- passwd = rb_str_new2("");
73
-
74
- return cubrid_conn_new(StringValueCStr(host), NUM2INT(port),
75
- StringValueCStr(db), StringValueCStr(user), StringValueCStr(passwd));
76
- }
77
-
78
- /* from conn.c */
79
- extern VALUE cubrid_conn_close(VALUE self);
80
- extern VALUE cubrid_conn_prepare(int argc, VALUE* argv, VALUE self);
81
- extern VALUE cubrid_conn_query(int argc, VALUE* argv, VALUE self);
82
- extern VALUE cubrid_conn_commit(VALUE self);
83
- extern VALUE cubrid_conn_rollback(VALUE self);
84
- extern VALUE cubrid_conn_get_auto_commit(VALUE self);
85
- extern VALUE cubrid_conn_set_auto_commit(VALUE self, VALUE auto_commit);
86
- extern VALUE cubrid_conn_to_s(VALUE self);
87
- extern VALUE cubrid_conn_server_version(VALUE self);
88
-
89
- /* from stmt.c */
90
- extern VALUE cubrid_stmt_close(VALUE self);
91
- extern VALUE cubrid_stmt_bind(int argc, VALUE* argv, VALUE self);
92
- extern VALUE cubrid_stmt_execute(int argc, VALUE* argv, VALUE self);
93
- extern VALUE cubrid_stmt_affected_rows(VALUE self);
94
- extern VALUE cubrid_stmt_fetch(VALUE self);
95
- extern VALUE cubrid_stmt_fetch_hash(VALUE self);
96
- extern VALUE cubrid_stmt_each(VALUE self);
97
- extern VALUE cubrid_stmt_each_hash(VALUE self);
98
- extern VALUE cubrid_stmt_column_info(VALUE self);
99
-
100
-
101
- /* CUBRID[http://www.cubrid.com] ruby driver
102
- *
103
- * CUBRID ruby driver는 ruby에서 CUBRID 데이터베이스 서버에 접속하여 질의를 할 수 있도록 해주는 모듈입니다.
104
- *
105
- * * Connection
106
- * * Statement
107
- * * Oid
108
- *
109
- * con = Cubrid.connect('demodb', '192.168.1.1', '33000', 'foo','bar')
110
- * stmt = con.prepare('SELECT * FROM db_user')
111
- * stmt.execute
112
- * stmt.each { |row|
113
- * print row
114
- * }
115
- * stmt.close
116
- * con.close
117
- *
118
- */
119
- void Init_cubrid()
120
- {
121
- cCubrid = rb_define_module("Cubrid");
122
- rb_define_module_function(cCubrid, "connect", cubrid_connect, -1);
123
-
124
- rb_define_const(cCubrid, "CHAR", INT2NUM(CCI_U_TYPE_CHAR));
125
- rb_define_const(cCubrid, "VARCHAR", INT2NUM(CCI_U_TYPE_STRING));
126
- rb_define_const(cCubrid, "STRING", INT2NUM(CCI_U_TYPE_STRING));
127
- rb_define_const(cCubrid, "NCHAR", INT2NUM(CCI_U_TYPE_NCHAR));
128
- rb_define_const(cCubrid, "VARNCHAR", INT2NUM(CCI_U_TYPE_VARNCHAR));
129
- rb_define_const(cCubrid, "BIT", INT2NUM(CCI_U_TYPE_BIT));
130
- rb_define_const(cCubrid, "VARBIT", INT2NUM(CCI_U_TYPE_VARBIT));
131
- rb_define_const(cCubrid, "NUMERIC", INT2NUM(CCI_U_TYPE_NUMERIC));
132
- rb_define_const(cCubrid, "INT", INT2NUM(CCI_U_TYPE_INT));
133
- rb_define_const(cCubrid, "SHORT", INT2NUM(CCI_U_TYPE_SHORT));
134
- rb_define_const(cCubrid, "MONETARY", INT2NUM(CCI_U_TYPE_MONETARY));
135
- rb_define_const(cCubrid, "FLOAT", INT2NUM(CCI_U_TYPE_FLOAT));
136
- rb_define_const(cCubrid, "DOUBLE", INT2NUM(CCI_U_TYPE_DOUBLE));
137
- rb_define_const(cCubrid, "DATE", INT2NUM(CCI_U_TYPE_DATE));
138
- rb_define_const(cCubrid, "TIME", INT2NUM(CCI_U_TYPE_TIME));
139
- rb_define_const(cCubrid, "TIMESTAMP", INT2NUM(CCI_U_TYPE_TIMESTAMP));
140
- rb_define_const(cCubrid, "SET", INT2NUM(CCI_U_TYPE_SET));
141
- rb_define_const(cCubrid, "MULTISET", INT2NUM(CCI_U_TYPE_MULTISET));
142
- rb_define_const(cCubrid, "SEQUENCE", INT2NUM(CCI_U_TYPE_SEQUENCE));
143
- rb_define_const(cCubrid, "OBJECT", INT2NUM(CCI_U_TYPE_OBJECT));
144
-
145
- rb_define_const(cCubrid, "INCLUDE_OID", INT2NUM(CCI_PREPARE_INCLUDE_OID));
146
- rb_define_const(cCubrid, "READ_LOCK", INT2NUM(CCI_OID_LOCK_READ));
147
- rb_define_const(cCubrid, "WRITE_LOCK", INT2NUM(CCI_OID_LOCK_WRITE));
148
-
149
- /* connection */
150
- cConnection = rb_define_class_under(cCubrid, "Connection", rb_cObject);
151
- rb_define_method(cConnection, "close", cubrid_conn_close, 0); /* in conn.c */
152
- rb_define_method(cConnection, "commit", cubrid_conn_commit, 0); /* in conn.c */
153
- rb_define_method(cConnection, "rollback", cubrid_conn_rollback, 0); /* in conn.c */
154
- rb_define_method(cConnection, "prepare", cubrid_conn_prepare, -1); /* in conn.c */
155
- rb_define_method(cConnection, "query", cubrid_conn_query, -1); /* in conn.c */
156
- rb_define_method(cConnection, "auto_commit?", cubrid_conn_get_auto_commit, 0); /* in conn.c */
157
- rb_define_method(cConnection, "auto_commit=", cubrid_conn_set_auto_commit, 1); /* in conn.c */
158
- rb_define_method(cConnection, "to_s", cubrid_conn_to_s, 0); /* in conn.c */
159
- rb_define_method(cConnection, "server_version", cubrid_conn_server_version, 0); /* in conn.c */
160
-
161
- /* statement */
162
- cStatement = rb_define_class_under(cCubrid, "Statement", rb_cObject);
163
- rb_define_method(cStatement, "bind", cubrid_stmt_bind, -1); /* in stmt.c */
164
- rb_define_method(cStatement, "execute", cubrid_stmt_execute, -1); /* in stmt.c */
165
- rb_define_method(cStatement, "affected_rows", cubrid_stmt_affected_rows, 0); /* in stmt.c */
166
- rb_define_method(cStatement, "column_info", cubrid_stmt_column_info, 0); /* in stmt.c */
167
- rb_define_method(cStatement, "fetch", cubrid_stmt_fetch, 0); /* in stmt.c */
168
- rb_define_method(cStatement, "fetch_hash", cubrid_stmt_fetch_hash, 0); /* in stmt.c */
169
- rb_define_method(cStatement, "each", cubrid_stmt_each, 0); /* in stmt.c */
170
- rb_define_method(cStatement, "each_hash", cubrid_stmt_each_hash, 0); /* in stmt.c */
171
- rb_define_method(cStatement, "close", cubrid_stmt_close, 0); /* in stmt.c */
172
-
173
- }
174
-
175
- /* Document-class: Cubrid::Connection
176
- * Connection 클래스는 데이터베이스 서버에 대한 연결을 유지하고 트랜잭션을 연산을 수행합니다.
177
- */
178
-
179
- /* Document-class: Cubrid::Statement
180
- * Statement 클래스는 질의문을 수행하고 그 결과를 반환합니다.
181
- */
182
-
183
- /* Document-class: Cubrid::Oid
184
- * Oid 클래스는 CUBRID instance에 대하여 직접 연산을 수행할 수 있도록 합니다.
185
- * CUBRID는 저장되어 있는 instance들의 고유한 식별자를 OID라는 이름으로 제공합니다.
186
- * OID를 통해서 직접 해당하는 instance에 접근하여 read/write/update/delete 연산을 할 수 있습니다.
187
- *
188
- */
189
-
190
- /* TODO:
191
- bind method & stored procedure
192
- save point
193
- db parameter : isolation level, max result count, lock time out, ..
194
- glo : load to buffer, save from buffer, performance task
195
- schema infomation
196
- */
197
-
1
+ /*
2
+ * Copyright (C) 2008 Search Solution Corporation. All rights reserved by Search Solution.
3
+ *
4
+ * Redistribution and use in source and binary forms, with or without modification,
5
+ * are permitted provided that the following conditions are met:
6
+ *
7
+ * - Redistributions of source code must retain the above copyright notice,
8
+ * this list of conditions and the following disclaimer.
9
+ *
10
+ * - Redistributions in binary form must reproduce the above copyright notice,
11
+ * this list of conditions and the following disclaimer in the documentation
12
+ * and/or other materials provided with the distribution.
13
+ *
14
+ * - Neither the name of the <ORGANIZATION> nor the names of its contributors
15
+ * may be used to endorse or promote products derived from this software without
16
+ * specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
+ * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
27
+ * OF SUCH DAMAGE.
28
+ *
29
+ */
30
+
31
+ #include "cubrid.h"
32
+
33
+ char *cci_client_name = "CCI"; /* for lower than 7.0 */
34
+ VALUE cCubrid, cConnection, cStatement, cOid,eCubrid,cCubrid;
35
+ extern VALUE cubrid_conn_new(char *host, int port, char *db, char *user, char *passwd);
36
+
37
+ VALUE GeteCubrid()
38
+ {
39
+ return eCubrid;
40
+ }
41
+
42
+ /* call-seq:
43
+ * connect(db, host, port, user, password) -> Connection
44
+ *
45
+ *
46
+ * con = Cubrid.connect('demodb', '192.168.1.1', '33000', 'foo','bar')
47
+ * con.to_s #=> host: 192.168.1.1, port: 33000, db: demodb, user: foo
48
+ *
49
+ * con = Cubrid.connect('subway')
50
+ * con.to_s #=> host: localhost, port: 30000, db: subway, user: PUBLIC
51
+ *
52
+ * con = Cubrid.connect('subway', '192.168.1.2')
53
+ * con.to_s #=> host: 192.168.1.2, port: 33000, db: subway, user: PUBLIC
54
+ */
55
+ VALUE cubrid_connect(int argc, VALUE* argv, VALUE self)
56
+ {
57
+ VALUE host, port, db, user, passwd;
58
+
59
+ rb_scan_args(argc, argv, "14", &db, &host, &port, &user, &passwd);
60
+
61
+ if (NIL_P(db))
62
+ rb_raise(rb_eStandardError, "DB name is required.");
63
+
64
+ if (NIL_P(host))
65
+ host = rb_str_new2("localhost");
66
+
67
+ if (NIL_P(port))
68
+ port = INT2NUM(30000);
69
+
70
+ if (NIL_P(user))
71
+ user = rb_str_new2("PUBLIC");
72
+
73
+ if (NIL_P(passwd))
74
+ passwd = rb_str_new2("");
75
+
76
+ return cubrid_conn_new(StringValueCStr(host), NUM2INT(port),
77
+ StringValueCStr(db), StringValueCStr(user), StringValueCStr(passwd));
78
+ }
79
+
80
+ /* from conn.c */
81
+ extern VALUE cubrid_conn_close(VALUE self);
82
+ extern VALUE cubrid_conn_prepare(int argc, VALUE* argv, VALUE self);
83
+ extern VALUE cubrid_conn_query(int argc, VALUE* argv, VALUE self);
84
+ extern VALUE cubrid_conn_commit(VALUE self);
85
+ extern VALUE cubrid_conn_rollback(VALUE self);
86
+ extern VALUE cubrid_conn_get_auto_commit(VALUE self);
87
+ extern VALUE cubrid_conn_get_last_insert_id(VALUE self);
88
+ extern VALUE cubrid_conn_set_auto_commit(VALUE self, VALUE auto_commit);
89
+ extern VALUE cubrid_conn_to_s(VALUE self);
90
+ extern VALUE cubrid_conn_server_version(VALUE self);
91
+
92
+ /* from stmt.c */
93
+ extern VALUE cubrid_stmt_close(VALUE self);
94
+ extern VALUE cubrid_stmt_bind(int argc, VALUE* argv, VALUE self);
95
+ extern VALUE cubrid_stmt_execute(int argc, VALUE* argv, VALUE self);
96
+ extern VALUE cubrid_stmt_affected_rows(VALUE self);
97
+ extern VALUE cubrid_stmt_fetch(VALUE self);
98
+ extern VALUE cubrid_stmt_fetch_hash(VALUE self);
99
+ extern VALUE cubrid_stmt_each(VALUE self);
100
+ extern VALUE cubrid_stmt_each_hash(VALUE self);
101
+ extern VALUE cubrid_stmt_column_info(VALUE self);
102
+
103
+
104
+ /* CUBRID[http://www.cubrid.com] ruby driver
105
+ *
106
+ *
107
+ * * Connection
108
+ * * Statement
109
+ * * Oid
110
+ *
111
+ * con = Cubrid.connect('demodb', '192.168.1.1', '33000', 'foo','bar')
112
+ * stmt = con.prepare('SELECT * FROM db_user')
113
+ * stmt.execute
114
+ * stmt.each { |row|
115
+ * print row
116
+ * }
117
+ * stmt.close
118
+ * con.close
119
+ *
120
+ */
121
+ void Init_cubrid()
122
+ {
123
+ cCubrid = rb_define_module("Cubrid");
124
+ rb_define_module_function(cCubrid, "connect", cubrid_connect, -1);
125
+
126
+ rb_define_const(cCubrid, "CHAR", INT2NUM(CCI_U_TYPE_CHAR));
127
+ rb_define_const(cCubrid, "VARCHAR", INT2NUM(CCI_U_TYPE_STRING));
128
+ rb_define_const(cCubrid, "STRING", INT2NUM(CCI_U_TYPE_STRING));
129
+ rb_define_const(cCubrid, "NCHAR", INT2NUM(CCI_U_TYPE_NCHAR));
130
+ rb_define_const(cCubrid, "VARNCHAR", INT2NUM(CCI_U_TYPE_VARNCHAR));
131
+ rb_define_const(cCubrid, "BIT", INT2NUM(CCI_U_TYPE_BIT));
132
+ rb_define_const(cCubrid, "VARBIT", INT2NUM(CCI_U_TYPE_VARBIT));
133
+ rb_define_const(cCubrid, "NUMERIC", INT2NUM(CCI_U_TYPE_NUMERIC));
134
+ rb_define_const(cCubrid, "INT", INT2NUM(CCI_U_TYPE_INT));
135
+ rb_define_const(cCubrid, "BIGINT", INT2NUM(CCI_U_TYPE_BIGINT));
136
+ rb_define_const(cCubrid, "SHORT", INT2NUM(CCI_U_TYPE_SHORT));
137
+ rb_define_const(cCubrid, "MONETARY", INT2NUM(CCI_U_TYPE_MONETARY));
138
+ rb_define_const(cCubrid, "FLOAT", INT2NUM(CCI_U_TYPE_FLOAT));
139
+ rb_define_const(cCubrid, "DOUBLE", INT2NUM(CCI_U_TYPE_DOUBLE));
140
+ rb_define_const(cCubrid, "DATE", INT2NUM(CCI_U_TYPE_DATE));
141
+ rb_define_const(cCubrid, "TIME", INT2NUM(CCI_U_TYPE_TIME));
142
+ rb_define_const(cCubrid, "TIMESTAMP", INT2NUM(CCI_U_TYPE_TIMESTAMP));
143
+ rb_define_const(cCubrid, "SET", INT2NUM(CCI_U_TYPE_SET));
144
+ rb_define_const(cCubrid, "MULTISET", INT2NUM(CCI_U_TYPE_MULTISET));
145
+ rb_define_const(cCubrid, "SEQUENCE", INT2NUM(CCI_U_TYPE_SEQUENCE));
146
+ rb_define_const(cCubrid, "OBJECT", INT2NUM(CCI_U_TYPE_OBJECT));
147
+
148
+ rb_define_const(cCubrid, "INCLUDE_OID", INT2NUM(CCI_PREPARE_INCLUDE_OID));
149
+ rb_define_const(cCubrid, "READ_LOCK", INT2NUM(CCI_OID_LOCK_READ));
150
+ rb_define_const(cCubrid, "WRITE_LOCK", INT2NUM(CCI_OID_LOCK_WRITE));
151
+
152
+ /* connection */
153
+ cConnection = rb_define_class_under(cCubrid, "Connection", rb_cObject);
154
+ rb_define_method(cConnection, "close", cubrid_conn_close, 0); /* in conn.c */
155
+ rb_define_method(cConnection, "commit", cubrid_conn_commit, 0); /* in conn.c */
156
+ rb_define_method(cConnection, "rollback", cubrid_conn_rollback, 0); /* in conn.c */
157
+ rb_define_method(cConnection, "prepare", cubrid_conn_prepare, -1); /* in conn.c */
158
+ rb_define_method(cConnection, "query", cubrid_conn_query, -1); /* in conn.c */
159
+ rb_define_method(cConnection, "auto_commit?", cubrid_conn_get_auto_commit, 0); /* in conn.c */
160
+ rb_define_method(cConnection, "last_insert_id", cubrid_conn_get_last_insert_id, 0); /* in conn.c */
161
+ rb_define_method(cConnection, "auto_commit=", cubrid_conn_set_auto_commit, 1); /* in conn.c */
162
+ rb_define_method(cConnection, "to_s", cubrid_conn_to_s, 0); /* in conn.c */
163
+ rb_define_method(cConnection, "server_version", cubrid_conn_server_version, 0); /* in conn.c */
164
+
165
+ /* statement */
166
+ cStatement = rb_define_class_under(cCubrid, "Statement", rb_cObject);
167
+ rb_define_method(cStatement, "bind", cubrid_stmt_bind, -1); /* in stmt.c */
168
+ rb_define_method(cStatement, "execute", cubrid_stmt_execute, -1); /* in stmt.c */
169
+ rb_define_method(cStatement, "affected_rows", cubrid_stmt_affected_rows, 0); /* in stmt.c */
170
+ rb_define_method(cStatement, "column_info", cubrid_stmt_column_info, 0); /* in stmt.c */
171
+ rb_define_method(cStatement, "fetch", cubrid_stmt_fetch, 0); /* in stmt.c */
172
+ rb_define_method(cStatement, "fetch_hash", cubrid_stmt_fetch_hash, 0); /* in stmt.c */
173
+ rb_define_method(cStatement, "each", cubrid_stmt_each, 0); /* in stmt.c */
174
+ rb_define_method(cStatement, "each_hash", cubrid_stmt_each_hash, 0); /* in stmt.c */
175
+ rb_define_method(cStatement, "close", cubrid_stmt_close, 0); /* in stmt.c */
176
+
177
+ //error
178
+ cCubrid = rb_define_class("CUBRID", rb_cObject);
179
+ eCubrid = rb_define_class_under(cCubrid, "Error", rb_eStandardError);
180
+
181
+ }
182
+
183
+ /* Document-class: Cubrid::Oid
184
+ *
185
+ */
186
+
187
+ /* TODO:
188
+ bind method & stored procedure
189
+ save point
190
+ db parameter : isolation level, max result count, lock time out, ..
191
+ glo : load to buffer, save from buffer, performance task
192
+ schema infomation
193
+ */
194
+