active_sql 1.0.1 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/activesql.c +354 -0
- data/ext/activesql.o +0 -0
- data/ext/activesql.so +0 -0
- data/lib/active_sql.rb +45 -0
- data/lib/activesql.so +0 -0
- data/readme.txt +50 -7
- metadata +8 -5
data/ext/activesql.c
ADDED
@@ -0,0 +1,354 @@
|
|
1
|
+
/*
|
2
|
+
Sasie
|
3
|
+
sasieindrajit@gmail.com
|
4
|
+
*/
|
5
|
+
|
6
|
+
#define IfNILorSTRING(obj) (NIL_P(obj)? NULL: StringValuePtr(obj))
|
7
|
+
#define IfNILorINT(obj) (NIL_P(obj)? 0: NUM2INT(obj))
|
8
|
+
|
9
|
+
struct config {
|
10
|
+
char *ser, *user, *pass, *db, *sock;
|
11
|
+
unsigned int pp, flg;
|
12
|
+
};
|
13
|
+
|
14
|
+
struct mysql {
|
15
|
+
MYSQL *conn;
|
16
|
+
unsigned int reconnect;
|
17
|
+
unsigned int adds;
|
18
|
+
};
|
19
|
+
|
20
|
+
struct config myConfig;
|
21
|
+
struct mysql mysObj;
|
22
|
+
|
23
|
+
static VALUE activeSQL;
|
24
|
+
static VALUE rb_cBase;
|
25
|
+
static VALUE rb_eSqlError;
|
26
|
+
static VALUE rb_cCols;
|
27
|
+
|
28
|
+
void Init_activesql();
|
29
|
+
|
30
|
+
// Definition section.
|
31
|
+
static void init_active_sqls();
|
32
|
+
static VALUE activeSQL_load_config(int argc, VALUE *argv, VALUE self);
|
33
|
+
static VALUE activeSQL_version(VALUE self);
|
34
|
+
static VALUE activeSQL_connect(VALUE self);
|
35
|
+
static VALUE activeSQL_reconnect(VALUE self);
|
36
|
+
static VALUE activeSQL_disconnect(VALUE self);
|
37
|
+
static VALUE activeSQL_connected(VALUE self);
|
38
|
+
static VALUE activeSQL_exec(VALUE self, VALUE arg, VALUE ret_vl);
|
39
|
+
static VALUE activeSQL_set_chars_set(int argc, VALUE *argv, VALUE self);
|
40
|
+
static VALUE activeSQL_exec_sql(VALUE self, VALUE arg);
|
41
|
+
static int castPreWrk(enum enum_field_types typ);
|
42
|
+
static VALUE castFrFetch(unsigned int typ, VALUE row, unsigned int itr);
|
43
|
+
static VALUE activeSQL_dyamic_meth(VALUE self);
|
44
|
+
static VALUE activeSQL_add_methods(int argc, VALUE *argv, VALUE self);
|
45
|
+
static VALUE activeSQL_added_methods(VALUE self);
|
46
|
+
static VALUE activeSQL_my_database(int argc, VALUE *argv, VALUE self);
|
47
|
+
static VALUE activeSQL_my_select(VALUE self);
|
48
|
+
static VALUE activeSQL_auto_commit(VALUE self, VALUE arg);
|
49
|
+
|
50
|
+
// Def.
|
51
|
+
static VALUE activeSQL_auto_commit(VALUE self, VALUE arg) {
|
52
|
+
//if (mysql_autocommit(mysObj.conn, 1) == 0)
|
53
|
+
// return Qtrue; Do it from query.
|
54
|
+
}
|
55
|
+
|
56
|
+
static VALUE activeSQL_my_select(VALUE self) {
|
57
|
+
return rb_reg_new("\\A\\s*(SELECT|SHOW|DESCRIBE|EXPLAIN|CHECK TABLE|DESC|CALL)", 57, 1);
|
58
|
+
}
|
59
|
+
|
60
|
+
static VALUE activeSQL_my_database(int argc, VALUE *argv, VALUE self) {
|
61
|
+
VALUE cdb;
|
62
|
+
if (!mysObj.reconnect) {
|
63
|
+
rb_scan_args(argc, argv, "01", &cdb);
|
64
|
+
if (TYPE(cdb) == T_STRING)
|
65
|
+
if (mysql_select_db(mysObj.conn, RSTRING_PTR(cdb)) == 0)
|
66
|
+
return Qtrue;
|
67
|
+
else
|
68
|
+
return Qfalse;
|
69
|
+
else
|
70
|
+
return Qfalse;
|
71
|
+
}
|
72
|
+
else
|
73
|
+
rb_raise(rb_eSqlError, "Connection not established.");
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE activeSQL_added_methods(VALUE self) {
|
77
|
+
if (mysObj.adds == 0)
|
78
|
+
return Qtrue;
|
79
|
+
else
|
80
|
+
return Qfalse;
|
81
|
+
}
|
82
|
+
|
83
|
+
static VALUE activeSQL_add_methods(int argc, VALUE *argv, VALUE self) {
|
84
|
+
VALUE needed;
|
85
|
+
rb_scan_args(argc, argv, "01", &needed);
|
86
|
+
if (TYPE(needed) == T_TRUE) {
|
87
|
+
mysObj.adds = 0;
|
88
|
+
return Qtrue;
|
89
|
+
}
|
90
|
+
else if (TYPE(needed) == T_FALSE) {
|
91
|
+
mysObj.adds = 1;
|
92
|
+
return Qtrue;
|
93
|
+
}
|
94
|
+
else
|
95
|
+
return Qfalse;
|
96
|
+
}
|
97
|
+
|
98
|
+
static VALUE activeSQL_dyamic_meth(VALUE self) {
|
99
|
+
//unsigned int ind = findIndex();
|
100
|
+
//return RARRAY(self)->ptr[ind];
|
101
|
+
}
|
102
|
+
|
103
|
+
static VALUE activeSQL_exec_sql(VALUE self, VALUE arg) {
|
104
|
+
VALUE f;
|
105
|
+
if (mysObj.reconnect == 1)
|
106
|
+
f = rb_funcall(rb_cBase, rb_intern("connect!"), 0);
|
107
|
+
else
|
108
|
+
f = Qtrue;
|
109
|
+
if (TYPE(f) == T_TRUE) {
|
110
|
+
if (TYPE(arg) != T_STRING)
|
111
|
+
rb_raise(rb_eTypeError, "invalid type for input");
|
112
|
+
if (mysql_real_query(mysObj.conn, RSTRING_PTR(arg), (unsigned int) strlen(RSTRING_PTR(arg))))
|
113
|
+
rb_raise(rb_eSqlError, mysql_error(mysObj.conn));
|
114
|
+
else
|
115
|
+
return Qtrue;
|
116
|
+
}
|
117
|
+
else
|
118
|
+
rb_raise(rb_eSqlError, "Connection not established.");
|
119
|
+
}
|
120
|
+
|
121
|
+
static VALUE activeSQL_set_chars_set(int argc, VALUE *argv, VALUE self) {
|
122
|
+
VALUE cset;
|
123
|
+
if (!mysObj.reconnect) {
|
124
|
+
rb_scan_args(argc, argv, "01", &cset);
|
125
|
+
if (TYPE(cset) == T_STRING)
|
126
|
+
if (!mysql_set_character_set(mysObj.conn, RSTRING_PTR(cset)))
|
127
|
+
return rb_str_new2(mysql_character_set_name(mysObj.conn));
|
128
|
+
else
|
129
|
+
return Qfalse;
|
130
|
+
else
|
131
|
+
return rb_str_new2(mysql_character_set_name(mysObj.conn));
|
132
|
+
}
|
133
|
+
else
|
134
|
+
rb_raise(rb_eSqlError, "Connection not established.");
|
135
|
+
}
|
136
|
+
|
137
|
+
static VALUE activeSQL_exec(VALUE self, VALUE arg, VALUE ret_vl) {
|
138
|
+
unsigned int * castAs;
|
139
|
+
unsigned int i, n, fld_cnt, j;
|
140
|
+
unsigned long * lengths;
|
141
|
+
char **getters;
|
142
|
+
char *tbl_name;
|
143
|
+
char *dyn_method;
|
144
|
+
MYSQL_RES *res;
|
145
|
+
MYSQL_ROW row;
|
146
|
+
MYSQL_FIELD *fields;
|
147
|
+
VALUE ary, f, cmd;
|
148
|
+
VALUE res_set; //Colllect result to send it back.
|
149
|
+
if (mysObj.reconnect == 1)
|
150
|
+
f = rb_funcall(rb_cBase, rb_intern("connect!"), 0);
|
151
|
+
else
|
152
|
+
f = Qtrue;
|
153
|
+
if (TYPE(f) == T_TRUE) {
|
154
|
+
if (TYPE(arg) != T_STRING)
|
155
|
+
rb_raise(rb_eTypeError, "invalid type for input");
|
156
|
+
if (mysql_real_query(mysObj.conn, RSTRING_PTR(arg), (unsigned int) strlen(RSTRING_PTR(arg)))) {
|
157
|
+
rb_raise(rb_eSqlError, mysql_error(mysObj.conn));
|
158
|
+
}
|
159
|
+
if (TYPE(ret_vl) == T_TRUE) {
|
160
|
+
res = mysql_use_result(mysObj.conn);
|
161
|
+
res_set = rb_ary_new();
|
162
|
+
fld_cnt = mysql_num_fields(res);
|
163
|
+
fields = mysql_fetch_fields(res);
|
164
|
+
ary = rb_ary_new2(fld_cnt);
|
165
|
+
|
166
|
+
/* ALLOCATE ROOM : DYN METHODS FOR GETTERS */
|
167
|
+
getters = (char **) malloc(fld_cnt * sizeof (char *));
|
168
|
+
castAs = (unsigned int*) malloc(fld_cnt * sizeof (int));
|
169
|
+
|
170
|
+
for (i = 0; i < fld_cnt; i++) {
|
171
|
+
getters[i] = fields[i].name;
|
172
|
+
tbl_name = fields[i].org_name ? fields[i].org_name : fields[i].name;
|
173
|
+
strcat(tbl_name, "@");
|
174
|
+
strcat(tbl_name, fields[i].org_table ? fields[i].org_table : fields[i].table);
|
175
|
+
rb_ary_store(ary, i, rb_tainted_str_new2(tbl_name));
|
176
|
+
tbl_name = "";
|
177
|
+
castAs[i] = castPreWrk(fields[i].type);
|
178
|
+
}
|
179
|
+
rb_ary_push(res_set, ary);
|
180
|
+
while ((row = mysql_fetch_row(res)) != NULL) {
|
181
|
+
n = mysql_num_fields(res);
|
182
|
+
lengths = mysql_fetch_lengths(res);
|
183
|
+
ary = rb_ary_new2(n);
|
184
|
+
for (i = 0; i < n; i++) {
|
185
|
+
rb_ary_store(ary, i, row[i] ? castFrFetch(castAs[i], rb_tainted_str_new(row[i], lengths[i]), i) : Qnil);
|
186
|
+
//rb_define_singleton_method(ary, "{dynamic getters}", activeSQL_dyamic_meth, 0); WE CN ADD IF HV NEW WAY.
|
187
|
+
if (mysObj.adds == 0)
|
188
|
+
if (getters[i] != "") {
|
189
|
+
dyn_method = (char *) malloc(((unsigned int) strlen(getters[i]) + 21)); // **
|
190
|
+
sprintf(dyn_method, "def %s; self[%u]; end", getters[i], i);
|
191
|
+
cmd = rb_str_new2(dyn_method);
|
192
|
+
rb_obj_instance_eval(1, &cmd, ary);
|
193
|
+
free(dyn_method);
|
194
|
+
}
|
195
|
+
}
|
196
|
+
rb_ary_push(res_set, ary);
|
197
|
+
}
|
198
|
+
|
199
|
+
// FREE all.
|
200
|
+
free(getters);
|
201
|
+
free(castAs);
|
202
|
+
mysql_free_result(res);
|
203
|
+
return res_set;
|
204
|
+
}
|
205
|
+
else {
|
206
|
+
res = mysql_use_result(mysObj.conn); // To avoid out of sync error from api.
|
207
|
+
mysql_free_result(res);
|
208
|
+
return Qtrue; /* Add affacted rows instead of status if needed */
|
209
|
+
}
|
210
|
+
}
|
211
|
+
else
|
212
|
+
rb_raise(rb_eSqlError, "Connection not established.");
|
213
|
+
}
|
214
|
+
|
215
|
+
static VALUE activeSQL_connected(VALUE self) {
|
216
|
+
if (mysObj.reconnect == 0)
|
217
|
+
return Qtrue;
|
218
|
+
else
|
219
|
+
return Qfalse;
|
220
|
+
}
|
221
|
+
|
222
|
+
static VALUE activeSQL_disconnect(VALUE self) {
|
223
|
+
if (mysObj.reconnect == 0) {
|
224
|
+
mysObj.reconnect = 1;
|
225
|
+
mysql_close(mysObj.conn);
|
226
|
+
return Qtrue;
|
227
|
+
}
|
228
|
+
else
|
229
|
+
return Qfalse;
|
230
|
+
}
|
231
|
+
|
232
|
+
static VALUE activeSQL_reconnect(VALUE self) {
|
233
|
+
rb_funcall(rb_cBase, rb_intern("disconnect!"), 0);
|
234
|
+
return rb_funcall(rb_cBase, rb_intern("connect!"), 0);
|
235
|
+
}
|
236
|
+
|
237
|
+
static VALUE activeSQL_connect(VALUE self) {
|
238
|
+
if (mysObj.reconnect == 1) {
|
239
|
+
mysObj.conn = mysql_init(NULL);
|
240
|
+
if (!mysql_real_connect(mysObj.conn, myConfig.ser, myConfig.user, myConfig.pass, myConfig.db, myConfig.pp, myConfig.sock, myConfig.flg)) {
|
241
|
+
fprintf(stderr, "%s\n", mysql_error(mysObj.conn));
|
242
|
+
return Qfalse;
|
243
|
+
}
|
244
|
+
else {
|
245
|
+
mysObj.reconnect = 0;
|
246
|
+
return Qtrue;
|
247
|
+
}
|
248
|
+
}
|
249
|
+
else
|
250
|
+
return Qfalse;
|
251
|
+
}
|
252
|
+
|
253
|
+
static VALUE activeSQL_version(VALUE self) {
|
254
|
+
return rb_str_new("2.0.1", 5);
|
255
|
+
}
|
256
|
+
|
257
|
+
static VALUE activeSQL_load_config(int argc, VALUE *argv, VALUE self) {
|
258
|
+
VALUE host, user, passwd, db, port, sock, flag;
|
259
|
+
rb_scan_args(argc, argv, "07", &host, &user, &passwd, &db, &port, &sock, &flag);
|
260
|
+
myConfig.db = IfNILorSTRING(db);
|
261
|
+
myConfig.flg = IfNILorINT(flag);
|
262
|
+
myConfig.ser = IfNILorSTRING(host);
|
263
|
+
myConfig.user = IfNILorSTRING(user);
|
264
|
+
myConfig.pass = IfNILorSTRING(passwd);
|
265
|
+
myConfig.pp = IfNILorINT(port);
|
266
|
+
myConfig.sock = IfNILorSTRING(sock);
|
267
|
+
mysObj.reconnect = 1;
|
268
|
+
return Qnil;
|
269
|
+
}
|
270
|
+
|
271
|
+
|
272
|
+
// activeSQL
|
273
|
+
void Init_activesql() {
|
274
|
+
activeSQL = rb_define_module("ActiveSQL");
|
275
|
+
rb_cBase = rb_define_class_under(activeSQL, "Base", rb_cObject);
|
276
|
+
rb_eSqlError = rb_define_class("ActiveSQLError", rb_eStandardError);
|
277
|
+
rb_cCols = rb_define_class_under(activeSQL, "Cols", rb_cArray);
|
278
|
+
// methods visible.
|
279
|
+
rb_define_singleton_method(rb_cBase, "load_config", activeSQL_load_config, -1);
|
280
|
+
rb_define_singleton_method(rb_cBase, "version", activeSQL_version, 0);
|
281
|
+
rb_define_singleton_method(rb_cBase, "connect!", activeSQL_connect, 0);
|
282
|
+
rb_define_singleton_method(rb_cBase, "reconnect!", activeSQL_reconnect, 0);
|
283
|
+
rb_define_singleton_method(rb_cBase, "disconnect!", activeSQL_disconnect, 0);
|
284
|
+
rb_define_singleton_method(rb_cBase, "connected?", activeSQL_connected, 0);
|
285
|
+
rb_define_singleton_method(rb_cBase, "exec", activeSQL_exec, 2);
|
286
|
+
rb_define_singleton_method(rb_cBase, "my_char_set", activeSQL_set_chars_set, -1);
|
287
|
+
rb_define_singleton_method(rb_cBase, "exec_sql", activeSQL_exec_sql, 1);
|
288
|
+
rb_define_singleton_method(rb_cBase, "add_methods", activeSQL_add_methods, -1);
|
289
|
+
rb_define_singleton_method(rb_cBase, "add_methods?", activeSQL_added_methods, 0);
|
290
|
+
rb_define_singleton_method(rb_cBase, "my_database", activeSQL_my_database, -1);
|
291
|
+
rb_define_singleton_method(rb_cBase, "my_select?", activeSQL_my_select, 0);
|
292
|
+
//rb_define_singleton_method(rb_cBase, "auto_commit", activeSQL_auto_commit, 1);
|
293
|
+
init_active_sqls();
|
294
|
+
}
|
295
|
+
|
296
|
+
// Will work behind.
|
297
|
+
// static VALUE castFrFetch(unsigned int typ, char ** row, unsigned long len, unsigned int itr){
|
298
|
+
|
299
|
+
static VALUE castFrFetch(unsigned int typ, VALUE row, unsigned int itr) {
|
300
|
+
VALUE cst;
|
301
|
+
switch (typ){
|
302
|
+
case 1:
|
303
|
+
cst = rb_funcall2(row, rb_intern("to_i"), 0, NULL);
|
304
|
+
break;
|
305
|
+
case 2:
|
306
|
+
cst = rb_funcall2(row, rb_intern("to_f"), 0, NULL);
|
307
|
+
break;
|
308
|
+
case 3:
|
309
|
+
default:
|
310
|
+
return row;
|
311
|
+
}
|
312
|
+
return cst;
|
313
|
+
}
|
314
|
+
|
315
|
+
static int castPreWrk(enum enum_field_types typ) {
|
316
|
+
unsigned int ret;
|
317
|
+
switch (typ) {
|
318
|
+
case MYSQL_TYPE_SHORT:
|
319
|
+
case MYSQL_TYPE_INT24:
|
320
|
+
case MYSQL_TYPE_LONGLONG:
|
321
|
+
case MYSQL_TYPE_TINY:
|
322
|
+
case MYSQL_TYPE_LONG:
|
323
|
+
ret = 1;
|
324
|
+
break;
|
325
|
+
case MYSQL_TYPE_DECIMAL:
|
326
|
+
case MYSQL_TYPE_FLOAT:
|
327
|
+
case MYSQL_TYPE_DOUBLE:
|
328
|
+
ret = 2;
|
329
|
+
break;
|
330
|
+
case MYSQL_TYPE_TIMESTAMP:
|
331
|
+
case MYSQL_TYPE_DATE:
|
332
|
+
case MYSQL_TYPE_TIME:
|
333
|
+
case MYSQL_TYPE_DATETIME:
|
334
|
+
case MYSQL_TYPE_YEAR:
|
335
|
+
case MYSQL_TYPE_STRING:
|
336
|
+
case MYSQL_TYPE_VAR_STRING:
|
337
|
+
case MYSQL_TYPE_BLOB:
|
338
|
+
case MYSQL_TYPE_SET:
|
339
|
+
case MYSQL_TYPE_ENUM:
|
340
|
+
case MYSQL_TYPE_GEOMETRY:
|
341
|
+
case MYSQL_TYPE_NULL:
|
342
|
+
ret = 3;
|
343
|
+
break;
|
344
|
+
default:
|
345
|
+
ret = 3;
|
346
|
+
}
|
347
|
+
return ret;
|
348
|
+
}
|
349
|
+
|
350
|
+
static void init_active_sqls() {
|
351
|
+
mysObj.reconnect = 1;
|
352
|
+
// Append methods as getters.
|
353
|
+
mysObj.adds = 0;
|
354
|
+
}
|
data/ext/activesql.o
ADDED
Binary file
|
data/ext/activesql.so
ADDED
Binary file
|
data/lib/active_sql.rb
CHANGED
@@ -7,3 +7,48 @@ rescue LoadError
|
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
|
+
module ActiveSQL
|
11
|
+
class Base
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# Execute the sql queries.
|
15
|
+
def select_sql(qry)
|
16
|
+
if qry =~ my_select?
|
17
|
+
result = exec(qry, true)
|
18
|
+
cols = result.shift
|
19
|
+
result.instance_eval "def columns; #{cols.inspect}; end"
|
20
|
+
result
|
21
|
+
else
|
22
|
+
exec_sql(qry) # status.
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Result set not returned for execute_sql
|
27
|
+
def execute_sql(qry)
|
28
|
+
unless qry =~ my_select?
|
29
|
+
exec_sql(qry)
|
30
|
+
else
|
31
|
+
raise ActiveSQLError, "no return of result set"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
alias :insert_sql :execute_sql
|
35
|
+
|
36
|
+
def establish_connection(config)
|
37
|
+
host = (config[:host] ||= 'localhost')
|
38
|
+
username = config[:username] ? config[:username].to_s : 'root'
|
39
|
+
password = config[:password] ? config[:password].to_s : ''
|
40
|
+
database = config[:database]
|
41
|
+
port = config[:port]
|
42
|
+
socket = config[:socket]
|
43
|
+
default_flags = 0
|
44
|
+
# No multi-results as of now.
|
45
|
+
options = [host, username, password, database, port, socket, default_flags]
|
46
|
+
load_config(*options)
|
47
|
+
|
48
|
+
# make connection across the parameters.
|
49
|
+
connect!
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/activesql.so
CHANGED
Binary file
|
data/readme.txt
CHANGED
@@ -1,12 +1,55 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
ActiveSQL
|
2
|
+
===========
|
3
|
+
|
4
|
+
Get the super fast mysql query results from Ruby and Rails applications.
|
5
|
+
|
6
|
+
Love to write queries.
|
5
7
|
|
6
|
-
|
8
|
+
Build queries on your own.
|
9
|
+
|
10
|
+
Get super fast results.
|
11
|
+
|
12
|
+
Keep everything in mysql.
|
13
|
+
|
7
14
|
|
8
|
-
|
9
|
-
|
15
|
+
USAGE:
|
16
|
+
======
|
17
|
+
|
18
|
+
require 'active_sql'
|
19
|
+
|
20
|
+
ActiveSQL::Base.establish_connection(:host=> 'localhost', :username=>'root', :password=> 'peep', :socket=> '') => true
|
21
|
+
|
22
|
+
ActiveSQL::Base.connected? => true
|
10
23
|
|
24
|
+
ActiveSQL::Base.insert_sql("insert into users values(1, user1@example.com, 12, 12.3)") => true
|
25
|
+
|
26
|
+
ActiveSQL::Base.execute_sql("delete from roles") => true
|
27
|
+
|
28
|
+
ActiveSQL::Base.select_sql("select * from users") => [[1, 'user1@example.com', 12, 12.3]]
|
29
|
+
|
30
|
+
ActiveSQL::Base.select_sql("select * from users").columns => ["id@users", "email@users", "rate@users", "points@users"]
|
11
31
|
|
32
|
+
user = ActiveSQL::Base.select_sql("select id, rate as rank from users limit 1").first
|
33
|
+
# Methods will be added by default.
|
34
|
+
# Disabling methods possible.
|
35
|
+
user.id => 1
|
36
|
+
user.rank => 12
|
37
|
+
|
38
|
+
ActiveSQL::Base.my_char_set => "latin1"
|
12
39
|
|
40
|
+
ActiveSQL::Base.my_char_set("utf8") => "utf8"
|
41
|
+
|
42
|
+
ActiveSQL::Base.my_database("another_database") => true
|
43
|
+
|
44
|
+
# Append get methods to every row.
|
45
|
+
ActiveSQL::Base.add_methods(true) => true
|
46
|
+
|
47
|
+
# Do not append methods:
|
48
|
+
ActiveSQL::Base.add_methods(false) => true
|
49
|
+
|
50
|
+
# Status of adding methods to the rows.
|
51
|
+
ActiveSQL::Base.add_methods? => true
|
52
|
+
|
53
|
+
|
54
|
+
Note:
|
55
|
+
Tentative build compiled by ruby 1.8 - linux.
|
metadata
CHANGED
@@ -3,10 +3,10 @@ name: active_sql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
|
-
-
|
6
|
+
- 2
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
version:
|
9
|
+
version: 2.0.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- sasie
|
@@ -14,12 +14,12 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-
|
17
|
+
date: 2012-04-12 00:00:00 +05:30
|
18
18
|
default_executable:
|
19
19
|
dependencies: []
|
20
20
|
|
21
21
|
description: Easy to work with mysql from ruby and rails
|
22
|
-
email:
|
22
|
+
email: sasieindrajit@gmail.com
|
23
23
|
executables: []
|
24
24
|
|
25
25
|
extensions: []
|
@@ -29,9 +29,12 @@ extra_rdoc_files: []
|
|
29
29
|
files:
|
30
30
|
- lib/activesql.so
|
31
31
|
- lib/active_sql.rb
|
32
|
+
- ext/activesql.c
|
33
|
+
- ext/activesql.o
|
34
|
+
- ext/activesql.so
|
32
35
|
- readme.txt
|
33
36
|
has_rdoc: true
|
34
|
-
homepage:
|
37
|
+
homepage: https://github.com/sasie-sourcebits/active_sql
|
35
38
|
licenses: []
|
36
39
|
|
37
40
|
post_install_message:
|