do_mysql 0.10.1-x86-mswin32-60 → 0.10.2-x86-mswin32-60
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.markdown +9 -2
- data/Rakefile +1 -1
- data/ext/do_mysql/do_mysql.c +104 -81
- data/ext/do_mysql/extconf.rb +12 -5
- data/lib/do_mysql/1.8/do_mysql.so +0 -0
- data/lib/do_mysql/1.9/do_mysql.so +0 -0
- data/lib/do_mysql/version.rb +1 -1
- data/spec/encoding_spec.rb +2 -1
- data/spec/result_spec.rb +2 -1
- data/spec/spec_helper.rb +1 -2
- data/tasks/compile.rake +1 -1
- metadata +37 -20
data/ChangeLog.markdown
CHANGED
@@ -1,10 +1,17 @@
|
|
1
|
-
## 0.10.
|
1
|
+
## 0.10.2 2010-05-19
|
2
|
+
* Make sure Text is returned in the proper encoding
|
3
|
+
* Make Encoding.default_internal aware
|
4
|
+
* Fix insert_id if no incrementing key is used
|
5
|
+
* Rework logging for making callbacks possible
|
6
|
+
* Remove handling Object types directly
|
7
|
+
|
8
|
+
## 0.10.1 2010-01-08
|
2
9
|
|
3
10
|
* Support for Ruby 1.8 and 1.9 on Windows.
|
4
11
|
* Switch to Jeweler for Gem building tasks (this change may be temporary).
|
5
12
|
* Switch to using Bacon for running specs: This should make specs friendlier to
|
6
13
|
new Ruby implementations that are not yet 100% MRI-compatible, and in turn,
|
7
|
-
|
14
|
+
pave the road for our own IronRuby and MacRuby support.
|
8
15
|
* Switch to the newly added rake-compiler `JavaExtensionTask` for compiling
|
9
16
|
JRuby extensions, instead of our (broken) home-grown solution.
|
10
17
|
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ JRUBY = RUBY_PLATFORM =~ /java/
|
|
11
11
|
IRONRUBY = defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ironruby'
|
12
12
|
WINDOWS = Gem.win_platform? || (JRUBY && ENV_JAVA['os.name'] =~ /windows/i)
|
13
13
|
SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
|
14
|
-
BINARY_VERSION = '5.
|
14
|
+
BINARY_VERSION = '5.1.46'
|
15
15
|
|
16
16
|
CLEAN.include(%w[ {tmp,pkg}/ **/*.{o,so,bundle,jar,log,a,gem,dSYM,obj,pdb,exp,DS_Store,rbc,db} ext/do_mysql/Makefile ext-java/target ])
|
17
17
|
|
data/ext/do_mysql/do_mysql.c
CHANGED
@@ -10,9 +10,9 @@
|
|
10
10
|
|
11
11
|
#include "compat.h"
|
12
12
|
#include "error.h"
|
13
|
-
|
14
|
-
#define DRIVER_CLASS(klass, parent) (rb_define_class_under(mDOMysql, klass, parent))
|
13
|
+
|
15
14
|
#define CONST_GET(scope, constant) (rb_funcall(scope, ID_CONST_GET, 1, rb_str_new2(constant)))
|
15
|
+
#define DRIVER_CLASS(klass, parent) (rb_define_class_under(mMysql, klass, parent))
|
16
16
|
#define CHECK_AND_RAISE(mysql_result_value, query) if (0 != mysql_result_value) { raise_error(self, db, query); }
|
17
17
|
|
18
18
|
#ifdef _WIN32
|
@@ -26,49 +26,48 @@
|
|
26
26
|
#ifdef HAVE_RUBY_ENCODING_H
|
27
27
|
#include <ruby/encoding.h>
|
28
28
|
|
29
|
-
#define DO_STR_NEW2(str, encoding) \
|
29
|
+
#define DO_STR_NEW2(str, encoding, internal_encoding) \
|
30
30
|
({ \
|
31
31
|
VALUE _string = rb_str_new2((const char *)str); \
|
32
32
|
if(encoding != -1) { \
|
33
33
|
rb_enc_associate_index(_string, encoding); \
|
34
34
|
} \
|
35
|
+
if(internal_encoding) { \
|
36
|
+
_string = rb_str_export_to_enc(_string, internal_encoding); \
|
37
|
+
} \
|
35
38
|
_string; \
|
36
39
|
})
|
37
40
|
|
38
|
-
#define DO_STR_NEW(str, len, encoding) \
|
41
|
+
#define DO_STR_NEW(str, len, encoding, internal_encoding) \
|
39
42
|
({ \
|
40
43
|
VALUE _string = rb_str_new((const char *)str, (long)len); \
|
41
44
|
if(encoding != -1) { \
|
42
45
|
rb_enc_associate_index(_string, encoding); \
|
43
46
|
} \
|
47
|
+
if(internal_encoding) { \
|
48
|
+
_string = rb_str_export_to_enc(_string, internal_encoding); \
|
49
|
+
} \
|
44
50
|
_string; \
|
45
51
|
})
|
46
52
|
|
47
53
|
#else
|
48
54
|
|
49
|
-
#define DO_STR_NEW2(str, encoding) \
|
55
|
+
#define DO_STR_NEW2(str, encoding, internal_encoding) \
|
50
56
|
rb_str_new2((const char *)str)
|
51
57
|
|
52
|
-
#define DO_STR_NEW(str, len, encoding) \
|
58
|
+
#define DO_STR_NEW(str, len, encoding, internal_encoding) \
|
53
59
|
rb_str_new((const char *)str, (long)len)
|
54
60
|
#endif
|
55
61
|
|
56
62
|
|
57
63
|
// To store rb_intern values
|
58
|
-
static ID ID_TO_I;
|
59
|
-
static ID ID_TO_F;
|
60
|
-
static ID ID_TO_S;
|
61
|
-
static ID ID_TO_TIME;
|
62
64
|
static ID ID_NEW;
|
63
65
|
static ID ID_NEW_DATE;
|
64
66
|
static ID ID_CONST_GET;
|
65
67
|
static ID ID_RATIONAL;
|
66
|
-
static ID
|
67
|
-
static ID ID_ESCAPE_SQL;
|
68
|
+
static ID ID_ESCAPE;
|
68
69
|
static ID ID_STRFTIME;
|
69
|
-
static ID
|
70
|
-
static ID ID_DEBUG;
|
71
|
-
static ID ID_LEVEL;
|
70
|
+
static ID ID_LOG;
|
72
71
|
|
73
72
|
// Reference to Extlib module
|
74
73
|
static VALUE mExtlib;
|
@@ -81,6 +80,8 @@ static VALUE cDO_Connection;
|
|
81
80
|
static VALUE cDO_Command;
|
82
81
|
static VALUE cDO_Result;
|
83
82
|
static VALUE cDO_Reader;
|
83
|
+
static VALUE cDO_Logger;
|
84
|
+
static VALUE cDO_Logger_Message;
|
84
85
|
|
85
86
|
// References to Ruby classes that we'll need
|
86
87
|
static VALUE rb_cDate;
|
@@ -89,12 +90,11 @@ static VALUE rb_cBigDecimal;
|
|
89
90
|
static VALUE rb_cByteArray;
|
90
91
|
|
91
92
|
// Classes that we'll build in Init
|
92
|
-
static VALUE
|
93
|
+
static VALUE mMysql;
|
93
94
|
static VALUE cConnection;
|
94
95
|
static VALUE cCommand;
|
95
96
|
static VALUE cResult;
|
96
97
|
static VALUE cReader;
|
97
|
-
static VALUE eArgumentError;
|
98
98
|
static VALUE eConnectionError;
|
99
99
|
static VALUE eDataError;
|
100
100
|
|
@@ -124,11 +124,17 @@ static VALUE infer_ruby_type(MYSQL_FIELD *field) {
|
|
124
124
|
case MYSQL_TYPE_DATE:
|
125
125
|
case MYSQL_TYPE_NEWDATE:
|
126
126
|
return rb_cDate;
|
127
|
+
case MYSQL_TYPE_STRING:
|
128
|
+
case MYSQL_TYPE_VAR_STRING:
|
127
129
|
case MYSQL_TYPE_TINY_BLOB:
|
128
130
|
case MYSQL_TYPE_MEDIUM_BLOB:
|
129
131
|
case MYSQL_TYPE_LONG_BLOB:
|
130
132
|
case MYSQL_TYPE_BLOB:
|
131
|
-
|
133
|
+
if(field->charsetnr == 63) {
|
134
|
+
return rb_cByteArray;
|
135
|
+
} else {
|
136
|
+
return rb_cString;
|
137
|
+
}
|
132
138
|
default:
|
133
139
|
return rb_cString;
|
134
140
|
}
|
@@ -320,10 +326,16 @@ static VALUE typecast(const char *value, long length, const VALUE type, int enco
|
|
320
326
|
return Qnil;
|
321
327
|
}
|
322
328
|
|
329
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
330
|
+
rb_encoding * internal_encoding = rb_default_internal_encoding();
|
331
|
+
#else
|
332
|
+
void * internal_encoding = NULL;
|
333
|
+
#endif
|
334
|
+
|
323
335
|
if (type == rb_cInteger) {
|
324
336
|
return rb_cstr2inum(value, 10);
|
325
337
|
} else if (type == rb_cString) {
|
326
|
-
return DO_STR_NEW(value, length, encoding);
|
338
|
+
return DO_STR_NEW(value, length, encoding, internal_encoding);
|
327
339
|
} else if (type == rb_cFloat) {
|
328
340
|
return rb_float_new(rb_cstr_to_dbl(value, Qfalse));
|
329
341
|
} else if (type == rb_cBigDecimal) {
|
@@ -340,38 +352,24 @@ static VALUE typecast(const char *value, long length, const VALUE type, int enco
|
|
340
352
|
return rb_funcall(rb_cByteArray, ID_NEW, 1, rb_str_new(value, length));
|
341
353
|
} else if (type == rb_cClass) {
|
342
354
|
return rb_funcall(mDO, rb_intern("full_const_get"), 1, rb_str_new(value, length));
|
343
|
-
} else if (type == rb_cObject) {
|
344
|
-
return rb_marshal_load(rb_str_new(value, length));
|
345
355
|
} else if (type == rb_cNilClass) {
|
346
356
|
return Qnil;
|
347
357
|
} else {
|
348
|
-
return DO_STR_NEW(value, length, encoding);
|
358
|
+
return DO_STR_NEW(value, length, encoding, internal_encoding);
|
349
359
|
}
|
350
360
|
|
351
361
|
}
|
352
362
|
|
353
|
-
static void data_objects_debug(VALUE string, struct timeval* start) {
|
363
|
+
static void data_objects_debug(VALUE connection, VALUE string, struct timeval* start) {
|
354
364
|
struct timeval stop;
|
355
|
-
|
356
|
-
|
357
|
-
const char *query = rb_str_ptr_readonly(string);
|
358
|
-
size_t length = rb_str_len(string);
|
359
|
-
char total_time[32];
|
360
|
-
do_int64 duration = 0;
|
365
|
+
VALUE message;
|
361
366
|
|
362
|
-
|
363
|
-
|
367
|
+
gettimeofday(&stop, NULL);
|
368
|
+
do_int64 duration = (stop.tv_sec - start->tv_sec) * 1000000 + stop.tv_usec - start->tv_usec;
|
364
369
|
|
365
|
-
|
366
|
-
gettimeofday(&stop, NULL);
|
370
|
+
message = rb_funcall(cDO_Logger_Message, ID_NEW, 3, string, rb_time_new(start->tv_sec, start->tv_usec), INT2NUM(duration));
|
367
371
|
|
368
|
-
|
369
|
-
|
370
|
-
snprintf(total_time, 32, "%.6f", duration / 1000000.0);
|
371
|
-
message = (char *)calloc(length + strlen(total_time) + 4, sizeof(char));
|
372
|
-
snprintf(message, length + strlen(total_time) + 4, "(%s) %s", total_time, query);
|
373
|
-
rb_funcall(logger, ID_DEBUG, 1, rb_str_new(message, length + strlen(total_time) + 3));
|
374
|
-
}
|
372
|
+
rb_funcall(connection, ID_LOG, 1, message);
|
375
373
|
}
|
376
374
|
|
377
375
|
static void raise_error(VALUE self, MYSQL *db, VALUE query) {
|
@@ -418,14 +416,14 @@ static char * get_uri_option(VALUE query_hash, const char * key) {
|
|
418
416
|
static void assert_file_exists(char * file, const char * message) {
|
419
417
|
if (file == NULL) { return; }
|
420
418
|
if (rb_funcall(rb_cFile, rb_intern("exist?"), 1, rb_str_new2(file)) == Qfalse) {
|
421
|
-
rb_raise(
|
419
|
+
rb_raise(rb_eArgError, "%s", message);
|
422
420
|
}
|
423
421
|
}
|
424
422
|
|
425
423
|
static void full_connect(VALUE self, MYSQL *db);
|
426
424
|
|
427
425
|
#ifdef _WIN32
|
428
|
-
static MYSQL_RES* cCommand_execute_sync(VALUE self, MYSQL* db, VALUE query) {
|
426
|
+
static MYSQL_RES* cCommand_execute_sync(VALUE self, VALUE connection, MYSQL* db, VALUE query) {
|
429
427
|
int retval;
|
430
428
|
struct timeval start;
|
431
429
|
const char* str = rb_str_ptr_readonly(query);
|
@@ -438,14 +436,14 @@ static MYSQL_RES* cCommand_execute_sync(VALUE self, MYSQL* db, VALUE query) {
|
|
438
436
|
}
|
439
437
|
gettimeofday(&start, NULL);
|
440
438
|
retval = mysql_real_query(db, str, len);
|
441
|
-
data_objects_debug(query, &start);
|
439
|
+
data_objects_debug(connection, query, &start);
|
442
440
|
|
443
441
|
CHECK_AND_RAISE(retval, query);
|
444
442
|
|
445
443
|
return mysql_store_result(db);
|
446
444
|
}
|
447
445
|
#else
|
448
|
-
static MYSQL_RES* cCommand_execute_async(VALUE self, MYSQL* db, VALUE query) {
|
446
|
+
static MYSQL_RES* cCommand_execute_async(VALUE self, VALUE connection, MYSQL* db, VALUE query) {
|
449
447
|
int socket_fd;
|
450
448
|
int retval;
|
451
449
|
fd_set rset;
|
@@ -454,18 +452,16 @@ static MYSQL_RES* cCommand_execute_async(VALUE self, MYSQL* db, VALUE query) {
|
|
454
452
|
size_t len = rb_str_len(query);
|
455
453
|
|
456
454
|
if((retval = mysql_ping(db)) && mysql_errno(db) == CR_SERVER_GONE_ERROR) {
|
457
|
-
VALUE connection = rb_iv_get(self, "@connection");
|
458
455
|
full_connect(connection, db);
|
459
456
|
}
|
457
|
+
gettimeofday(&start, NULL);
|
458
|
+
|
460
459
|
retval = mysql_send_query(db, str, len);
|
461
460
|
|
462
461
|
CHECK_AND_RAISE(retval, query);
|
463
|
-
gettimeofday(&start, NULL);
|
464
462
|
|
465
463
|
socket_fd = db->net.fd;
|
466
464
|
|
467
|
-
data_objects_debug(query, &start);
|
468
|
-
|
469
465
|
for(;;) {
|
470
466
|
FD_ZERO(&rset);
|
471
467
|
FD_SET(socket_fd, &rset);
|
@@ -487,6 +483,7 @@ static MYSQL_RES* cCommand_execute_async(VALUE self, MYSQL* db, VALUE query) {
|
|
487
483
|
|
488
484
|
retval = mysql_read_query_result(db);
|
489
485
|
CHECK_AND_RAISE(retval, query);
|
486
|
+
data_objects_debug(connection, query, &start);
|
490
487
|
|
491
488
|
return mysql_store_result(db);
|
492
489
|
}
|
@@ -561,7 +558,7 @@ static void full_connect(VALUE self, MYSQL* db) {
|
|
561
558
|
|
562
559
|
mysql_ssl_set(db, ssl_client_key, ssl_client_cert, ssl_ca_cert, ssl_ca_path, ssl_cipher);
|
563
560
|
} else if(r_ssl != Qnil) {
|
564
|
-
rb_raise(
|
561
|
+
rb_raise(rb_eArgError, "ssl must be passed a hash");
|
565
562
|
}
|
566
563
|
}
|
567
564
|
#endif
|
@@ -618,11 +615,17 @@ static void full_connect(VALUE self, MYSQL* db) {
|
|
618
615
|
}
|
619
616
|
|
620
617
|
// Disable sql_auto_is_null
|
621
|
-
cCommand_execute(self, db, rb_str_new2("SET sql_auto_is_null = 0"));
|
618
|
+
cCommand_execute(Qnil, self, db, rb_str_new2("SET sql_auto_is_null = 0"));
|
622
619
|
// removed NO_AUTO_VALUE_ON_ZERO because of MySQL bug http://bugs.mysql.com/bug.php?id=42270
|
623
620
|
// added NO_BACKSLASH_ESCAPES so that backslashes should not be escaped as in other databases
|
624
|
-
|
625
|
-
|
621
|
+
|
622
|
+
//4.x versions do not support certain session parameters
|
623
|
+
if(mysql_get_server_version(db) < 50000 ){
|
624
|
+
cCommand_execute(Qnil, self, db, rb_str_new2("SET SESSION sql_mode = 'ANSI,NO_DIR_IN_CREATE,NO_UNSIGNED_SUBTRACTION'"));
|
625
|
+
}else{
|
626
|
+
cCommand_execute(Qnil, self, db, rb_str_new2("SET SESSION sql_mode = 'ANSI,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION,NO_UNSIGNED_SUBTRACTION,TRADITIONAL'"));
|
627
|
+
}
|
628
|
+
|
626
629
|
rb_iv_set(self, "@connection", Data_Wrap_Struct(rb_cObject, 0, 0, db));
|
627
630
|
}
|
628
631
|
|
@@ -732,11 +735,11 @@ static VALUE cCommand_set_types(int argc, VALUE *argv, VALUE self) {
|
|
732
735
|
if(TYPE(sub_entry) == T_CLASS) {
|
733
736
|
rb_ary_push(type_strings, sub_entry);
|
734
737
|
} else {
|
735
|
-
rb_raise(
|
738
|
+
rb_raise(rb_eArgError, "Invalid type given");
|
736
739
|
}
|
737
740
|
}
|
738
741
|
} else {
|
739
|
-
rb_raise(
|
742
|
+
rb_raise(rb_eArgError, "Invalid type given");
|
740
743
|
}
|
741
744
|
}
|
742
745
|
|
@@ -779,7 +782,9 @@ static VALUE cConnection_quote_string(VALUE self, VALUE string) {
|
|
779
782
|
|
780
783
|
// Wrap the escaped string in single-quotes, this is DO's convention
|
781
784
|
escaped[0] = escaped[quoted_length + 1] = '\'';
|
782
|
-
|
785
|
+
// We don't want to use the internal encoding, because this needs
|
786
|
+
// to go into the database in the connection encoding
|
787
|
+
result = DO_STR_NEW(escaped, quoted_length + 2, FIX2INT(rb_iv_get(self, "@encoding_id")), NULL);
|
783
788
|
|
784
789
|
free(escaped);
|
785
790
|
return result;
|
@@ -793,7 +798,7 @@ static VALUE build_query_from_args(VALUE klass, int count, VALUE *args) {
|
|
793
798
|
for ( i = 0; i < count; i++) {
|
794
799
|
rb_ary_push(array, (VALUE)args[i]);
|
795
800
|
}
|
796
|
-
query = rb_funcall(klass,
|
801
|
+
query = rb_funcall(klass, ID_ESCAPE, 1, array);
|
797
802
|
|
798
803
|
return query;
|
799
804
|
}
|
@@ -804,6 +809,7 @@ static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
|
804
809
|
MYSQL_RES *response = 0;
|
805
810
|
|
806
811
|
my_ulonglong affected_rows;
|
812
|
+
my_ulonglong insert_id;
|
807
813
|
VALUE connection = rb_iv_get(self, "@connection");
|
808
814
|
VALUE mysql_connection = rb_iv_get(connection, "@connection");
|
809
815
|
if (Qnil == mysql_connection) {
|
@@ -813,15 +819,17 @@ static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
|
813
819
|
MYSQL *db = DATA_PTR(mysql_connection);
|
814
820
|
query = build_query_from_args(self, argc, argv);
|
815
821
|
|
816
|
-
response = cCommand_execute(self, db, query);
|
822
|
+
response = cCommand_execute(self, connection, db, query);
|
817
823
|
|
818
824
|
affected_rows = mysql_affected_rows(db);
|
825
|
+
insert_id = mysql_insert_id(db);
|
819
826
|
mysql_free_result(response);
|
820
827
|
|
821
|
-
if ((my_ulonglong)-1 == affected_rows)
|
828
|
+
if ((my_ulonglong)-1 == affected_rows) {
|
822
829
|
return Qnil;
|
830
|
+
}
|
823
831
|
|
824
|
-
return rb_funcall(cResult, ID_NEW, 3, self, INT2NUM(affected_rows), INT2NUM(
|
832
|
+
return rb_funcall(cResult, ID_NEW, 3, self, INT2NUM(affected_rows), insert_id == 0 ? Qnil : INT2NUM(insert_id));
|
825
833
|
}
|
826
834
|
|
827
835
|
static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
@@ -845,7 +853,7 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
845
853
|
|
846
854
|
query = build_query_from_args(self, argc, argv);
|
847
855
|
|
848
|
-
response = cCommand_execute(self, db, query);
|
856
|
+
response = cCommand_execute(self, connection, db, query);
|
849
857
|
|
850
858
|
if (!response) {
|
851
859
|
return Qnil;
|
@@ -869,7 +877,7 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
869
877
|
// Whoops... wrong number of types passed to set_types. Close the reader and raise
|
870
878
|
// and error
|
871
879
|
rb_funcall(reader, rb_intern("close"), 0);
|
872
|
-
rb_raise(
|
880
|
+
rb_raise(rb_eArgError, "Field-count mismatch. Expected %ld fields, but the query yielded %d", RARRAY_LEN(field_types), field_count);
|
873
881
|
}
|
874
882
|
|
875
883
|
for(i = 0; i < field_count; i++) {
|
@@ -983,13 +991,15 @@ static VALUE cReader_field_count(VALUE self) {
|
|
983
991
|
void Init_do_mysql() {
|
984
992
|
rb_require("bigdecimal");
|
985
993
|
rb_require("date");
|
994
|
+
rb_require("data_objects");
|
995
|
+
|
996
|
+
ID_CONST_GET = rb_intern("const_get");
|
986
997
|
|
987
|
-
|
998
|
+
// Get references classes needed for Date/Time parsing
|
999
|
+
rb_cDate = CONST_GET(rb_mKernel, "Date");
|
1000
|
+
rb_cDateTime = CONST_GET(rb_mKernel, "DateTime");
|
1001
|
+
rb_cBigDecimal = CONST_GET(rb_mKernel, "BigDecimal");
|
988
1002
|
|
989
|
-
ID_TO_I = rb_intern("to_i");
|
990
|
-
ID_TO_F = rb_intern("to_f");
|
991
|
-
ID_TO_S = rb_intern("to_s");
|
992
|
-
ID_TO_TIME = rb_intern("to_time");
|
993
1003
|
ID_NEW = rb_intern("new");
|
994
1004
|
#ifdef RUBY_LESS_THAN_186
|
995
1005
|
ID_NEW_DATE = rb_intern("new0");
|
@@ -998,17 +1008,9 @@ void Init_do_mysql() {
|
|
998
1008
|
#endif
|
999
1009
|
ID_CONST_GET = rb_intern("const_get");
|
1000
1010
|
ID_RATIONAL = rb_intern("Rational");
|
1001
|
-
|
1002
|
-
ID_ESCAPE_SQL = rb_intern("escape_sql");
|
1011
|
+
ID_ESCAPE = rb_intern("escape_sql");
|
1003
1012
|
ID_STRFTIME = rb_intern("strftime");
|
1004
|
-
|
1005
|
-
ID_DEBUG = rb_intern("debug");
|
1006
|
-
ID_LEVEL = rb_intern("level");
|
1007
|
-
|
1008
|
-
// Store references to a few helpful clases that aren't in Ruby Core
|
1009
|
-
rb_cDate = RUBY_CLASS("Date");
|
1010
|
-
rb_cDateTime = RUBY_CLASS("DateTime");
|
1011
|
-
rb_cBigDecimal = RUBY_CLASS("BigDecimal");
|
1013
|
+
ID_LOG = rb_intern("log");
|
1012
1014
|
|
1013
1015
|
// Get references to the Extlib module
|
1014
1016
|
mExtlib = CONST_GET(rb_mKernel, "Extlib");
|
@@ -1021,14 +1023,14 @@ void Init_do_mysql() {
|
|
1021
1023
|
cDO_Command = CONST_GET(mDO, "Command");
|
1022
1024
|
cDO_Result = CONST_GET(mDO, "Result");
|
1023
1025
|
cDO_Reader = CONST_GET(mDO, "Reader");
|
1026
|
+
cDO_Logger = CONST_GET(mDO, "Logger");
|
1027
|
+
cDO_Logger_Message = CONST_GET(cDO_Logger, "Message");
|
1024
1028
|
|
1025
1029
|
// Top Level Module that all the classes live under
|
1026
|
-
|
1027
|
-
|
1028
|
-
eArgumentError = CONST_GET(rb_mKernel, "ArgumentError");
|
1030
|
+
mMysql = rb_define_module_under(mDO, "Mysql");
|
1029
1031
|
eConnectionError = CONST_GET(mDO, "ConnectionError");
|
1030
1032
|
eDataError = CONST_GET(mDO, "DataError");
|
1031
|
-
mEncoding = rb_define_module_under(
|
1033
|
+
mEncoding = rb_define_module_under(mMysql, "Encoding");
|
1032
1034
|
|
1033
1035
|
cConnection = DRIVER_CLASS("Connection", cDO_Connection);
|
1034
1036
|
rb_define_method(cConnection, "initialize", cConnection_initialize, 1);
|
@@ -1057,9 +1059,30 @@ void Init_do_mysql() {
|
|
1057
1059
|
rb_define_method(cReader, "fields", cReader_fields, 0);
|
1058
1060
|
rb_define_method(cReader, "field_count", cReader_field_count, 0);
|
1059
1061
|
|
1062
|
+
rb_global_variable(&ID_NEW_DATE);
|
1063
|
+
rb_global_variable(&ID_RATIONAL);
|
1064
|
+
rb_global_variable(&ID_CONST_GET);
|
1065
|
+
rb_global_variable(&ID_ESCAPE);
|
1066
|
+
rb_global_variable(&ID_LOG);
|
1067
|
+
rb_global_variable(&ID_NEW);
|
1068
|
+
|
1069
|
+
rb_global_variable(&rb_cDate);
|
1070
|
+
rb_global_variable(&rb_cDateTime);
|
1071
|
+
rb_global_variable(&rb_cBigDecimal);
|
1072
|
+
rb_global_variable(&rb_cByteArray);
|
1073
|
+
|
1074
|
+
rb_global_variable(&mDO);
|
1075
|
+
rb_global_variable(&cDO_Logger_Message);
|
1076
|
+
|
1077
|
+
rb_global_variable(&cResult);
|
1078
|
+
rb_global_variable(&cReader);
|
1079
|
+
|
1080
|
+
rb_global_variable(&eConnectionError);
|
1081
|
+
rb_global_variable(&eDataError);
|
1082
|
+
|
1060
1083
|
struct errcodes *errs;
|
1061
1084
|
|
1062
1085
|
for (errs = errors; errs->error_name; errs++) {
|
1063
|
-
rb_const_set(
|
1086
|
+
rb_const_set(mMysql, rb_intern(errs->error_name), INT2NUM(errs->error_no));
|
1064
1087
|
}
|
1065
1088
|
}
|
data/ext/do_mysql/extconf.rb
CHANGED
@@ -35,9 +35,9 @@ end
|
|
35
35
|
if RUBY_PLATFORM =~ /mswin|mingw/
|
36
36
|
dir_config('mysql')
|
37
37
|
have_header 'my_global.h'
|
38
|
-
have_header 'mysql.h'
|
39
|
-
have_library 'libmysql'
|
40
|
-
have_func('mysql_query', 'mysql.h')
|
38
|
+
have_header 'mysql.h'
|
39
|
+
have_library 'libmysql'
|
40
|
+
have_func('mysql_query', 'mysql.h')
|
41
41
|
have_func('mysql_ssl_set', 'mysql.h')
|
42
42
|
elsif mc = with_config('mysql-config', default_mysql_config_path)
|
43
43
|
includes = mysql_config('include').split(/\s+/).map do |dir|
|
@@ -46,7 +46,15 @@ elsif mc = with_config('mysql-config', default_mysql_config_path)
|
|
46
46
|
libs = mysql_config('libs').split(/\s+/).select {|lib| lib =~ /^-L/}.map do |dir|
|
47
47
|
dir.gsub(/^-L/, "")
|
48
48
|
end.uniq
|
49
|
+
|
50
|
+
linked = mysql_config('libs').split(/\s+/).select {|lib| lib =~ /^-l/}.map do |dir|
|
51
|
+
dir.gsub(/^-l/, "")
|
52
|
+
end.uniq
|
53
|
+
|
49
54
|
dir_config('mysql', includes, libs)
|
55
|
+
linked.each do |link|
|
56
|
+
have_library link
|
57
|
+
end
|
50
58
|
else
|
51
59
|
inc, lib = dir_config('mysql', default_prefix)
|
52
60
|
libs = ['m', 'z', 'socket', 'nsl']
|
@@ -60,8 +68,7 @@ end
|
|
60
68
|
|
61
69
|
unless RUBY_PLATFORM =~ /mswin|mingw/
|
62
70
|
have_header 'mysql.h'
|
63
|
-
|
64
|
-
have_func 'mysql_query' || exit(1)
|
71
|
+
have_func 'mysql_query'
|
65
72
|
have_func 'mysql_ssl_set'
|
66
73
|
end
|
67
74
|
|
Binary file
|
Binary file
|
data/lib/do_mysql/version.rb
CHANGED
data/spec/encoding_spec.rb
CHANGED
@@ -5,5 +5,6 @@ require 'data_objects/spec/encoding_spec'
|
|
5
5
|
|
6
6
|
describe DataObjects::Mysql::Connection do
|
7
7
|
behaves_like 'a driver supporting different encodings'
|
8
|
-
behaves_like 'returning correctly encoded strings for the default encoding'
|
8
|
+
behaves_like 'returning correctly encoded strings for the default database encoding'
|
9
|
+
behaves_like 'returning correctly encoded strings for the default internal encoding'
|
9
10
|
end
|
data/spec/result_spec.rb
CHANGED
@@ -12,5 +12,6 @@ describe DataObjects::Mysql::Result do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
describe DataObjects::Mysql::Result do
|
15
|
-
behaves_like 'a Result which returns inserted
|
15
|
+
behaves_like 'a Result which returns inserted key with sequences'
|
16
|
+
behaves_like 'a Result which returns nil without sequences'
|
16
17
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -71,9 +71,8 @@ module DataObjectsSpecHelpers
|
|
71
71
|
|
72
72
|
conn.create_command(<<-EOF).execute_non_query
|
73
73
|
CREATE TABLE `invoices` (
|
74
|
-
`id` int(11) NOT NULL auto_increment,
|
75
74
|
`invoice_number` varchar(50) NOT NULL,
|
76
|
-
PRIMARY KEY (`
|
75
|
+
PRIMARY KEY (`invoice_number`)
|
77
76
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
78
77
|
EOF
|
79
78
|
|
data/tasks/compile.rake
CHANGED
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: do_mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 10
|
8
|
+
- 2
|
9
|
+
version: 0.10.2
|
5
10
|
platform: x86-mswin32-60
|
6
11
|
authors:
|
7
12
|
- Dirkjan Bussink
|
@@ -9,39 +14,49 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date: 2010-
|
17
|
+
date: 2010-05-19 00:00:00 +02:00
|
13
18
|
default_executable:
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: data_objects
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - "="
|
22
26
|
- !ruby/object:Gem::Version
|
23
|
-
|
24
|
-
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 10
|
30
|
+
- 2
|
31
|
+
version: 0.10.2
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: bacon
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ~>
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 1
|
33
44
|
version: "1.1"
|
34
|
-
|
45
|
+
type: :development
|
46
|
+
version_requirements: *id002
|
35
47
|
- !ruby/object:Gem::Dependency
|
36
48
|
name: rake-compiler
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
prerelease: false
|
50
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
51
|
requirements:
|
41
52
|
- - ~>
|
42
53
|
- !ruby/object:Gem::Version
|
54
|
+
segments:
|
55
|
+
- 0
|
56
|
+
- 7
|
43
57
|
version: "0.7"
|
44
|
-
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id003
|
45
60
|
description: Implements the DataObjects API for MySQL
|
46
61
|
email: d.bussink@gmail.com
|
47
62
|
executables: []
|
@@ -101,13 +116,13 @@ post_install_message: |+
|
|
101
116
|
======================================================================================================
|
102
117
|
|
103
118
|
You've installed the binary version of do_mysql.
|
104
|
-
It was built using MySQL version 5.
|
119
|
+
It was built using MySQL version 5.1.46.
|
105
120
|
It's recommended to use the exact same version to avoid potential issues.
|
106
121
|
|
107
122
|
At the time of building this gem, the necessary DLL files where available
|
108
123
|
in the following download:
|
109
124
|
|
110
|
-
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-noinstall-5.
|
125
|
+
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-noinstall-5.1.46-win32.zip/from/pick
|
111
126
|
|
112
127
|
You can put the lib\opt\libmysql.dll available in this package in your Ruby bin
|
113
128
|
directory, for example C:\Ruby\bin
|
@@ -122,18 +137,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
137
|
requirements:
|
123
138
|
- - ">="
|
124
139
|
- !ruby/object:Gem::Version
|
140
|
+
segments:
|
141
|
+
- 0
|
125
142
|
version: "0"
|
126
|
-
version:
|
127
143
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
144
|
requirements:
|
129
145
|
- - ">="
|
130
146
|
- !ruby/object:Gem::Version
|
147
|
+
segments:
|
148
|
+
- 0
|
131
149
|
version: "0"
|
132
|
-
version:
|
133
150
|
requirements: []
|
134
151
|
|
135
152
|
rubyforge_project: dorb
|
136
|
-
rubygems_version: 1.3.
|
153
|
+
rubygems_version: 1.3.6
|
137
154
|
signing_key:
|
138
155
|
specification_version: 3
|
139
156
|
summary: DataObjects MySQL Driver
|