solaris-mysql2 0.3.11

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.
Files changed (46) hide show
  1. data/.gitignore +12 -0
  2. data/.rspec +3 -0
  3. data/.rvmrc +1 -0
  4. data/.travis.yml +7 -0
  5. data/CHANGELOG.md +244 -0
  6. data/Gemfile +3 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +334 -0
  9. data/Rakefile +5 -0
  10. data/benchmark/active_record.rb +51 -0
  11. data/benchmark/active_record_threaded.rb +42 -0
  12. data/benchmark/allocations.rb +33 -0
  13. data/benchmark/escape.rb +36 -0
  14. data/benchmark/query_with_mysql_casting.rb +80 -0
  15. data/benchmark/query_without_mysql_casting.rb +56 -0
  16. data/benchmark/sequel.rb +37 -0
  17. data/benchmark/setup_db.rb +119 -0
  18. data/benchmark/threaded.rb +44 -0
  19. data/examples/eventmachine.rb +21 -0
  20. data/examples/threaded.rb +20 -0
  21. data/ext/mysql2/client.c +901 -0
  22. data/ext/mysql2/client.h +42 -0
  23. data/ext/mysql2/extconf.rb +74 -0
  24. data/ext/mysql2/mysql2_ext.c +12 -0
  25. data/ext/mysql2/mysql2_ext.h +42 -0
  26. data/ext/mysql2/result.c +566 -0
  27. data/ext/mysql2/result.h +20 -0
  28. data/ext/mysql2/wait_for_single_fd.h +36 -0
  29. data/lib/mysql2.rb +21 -0
  30. data/lib/mysql2/client.rb +264 -0
  31. data/lib/mysql2/em.rb +37 -0
  32. data/lib/mysql2/error.rb +15 -0
  33. data/lib/mysql2/result.rb +5 -0
  34. data/lib/mysql2/version.rb +3 -0
  35. data/solaris-mysql2.gemspec +29 -0
  36. data/spec/em/em_spec.rb +50 -0
  37. data/spec/mysql2/client_spec.rb +465 -0
  38. data/spec/mysql2/error_spec.rb +69 -0
  39. data/spec/mysql2/result_spec.rb +388 -0
  40. data/spec/rcov.opts +3 -0
  41. data/spec/spec_helper.rb +67 -0
  42. data/tasks/benchmarks.rake +20 -0
  43. data/tasks/compile.rake +71 -0
  44. data/tasks/rspec.rake +16 -0
  45. data/tasks/vendor_mysql.rake +40 -0
  46. metadata +198 -0
@@ -0,0 +1,20 @@
1
+ #ifndef MYSQL2_RESULT_H
2
+ #define MYSQL2_RESULT_H
3
+
4
+ void init_mysql2_result();
5
+ VALUE rb_mysql_result_to_obj(MYSQL_RES * r);
6
+
7
+ typedef struct {
8
+ VALUE fields;
9
+ VALUE rows;
10
+ VALUE encoding;
11
+ unsigned int numberOfFields;
12
+ unsigned long numberOfRows;
13
+ unsigned long lastRowProcessed;
14
+ char resultFreed;
15
+ MYSQL_RES *result;
16
+ } mysql2_result_wrapper;
17
+
18
+ #define GetMysql2Result(obj, sval) (sval = (mysql2_result_wrapper*)DATA_PTR(obj));
19
+
20
+ #endif
@@ -0,0 +1,36 @@
1
+ /*
2
+ * backwards compatibility for pre-1.9.3 C API
3
+ *
4
+ * Ruby 1.9.3 provides this API which allows the use of ppoll() on Linux
5
+ * to minimize select() and malloc() overhead on high-numbered FDs.
6
+ */
7
+ #ifdef HAVE_RB_WAIT_FOR_SINGLE_FD
8
+ # include <ruby/io.h>
9
+ #else
10
+ # define RB_WAITFD_IN 0x001
11
+ # define RB_WAITFD_PRI 0x002
12
+ # define RB_WAITFD_OUT 0x004
13
+
14
+ static int my_wait_for_single_fd(int fd, int events, struct timeval *tvp)
15
+ {
16
+ fd_set fdset;
17
+ fd_set *rfds = NULL;
18
+ fd_set *wfds = NULL;
19
+ fd_set *efds = NULL;
20
+
21
+ FD_ZERO(&fdset);
22
+ FD_SET(fd, &fdset);
23
+
24
+ if (events & RB_WAITFD_IN)
25
+ rfds = &fdset;
26
+ if (events & RB_WAITFD_OUT)
27
+ wfds = &fdset;
28
+ if (events & RB_WAITFD_PRI)
29
+ efds = &fdset;
30
+
31
+ return rb_thread_select(fd + 1, rfds, wfds, efds, tvp);
32
+ }
33
+
34
+ #define rb_wait_for_single_fd(fd,events,tvp) \
35
+ my_wait_for_single_fd((fd),(events),(tvp))
36
+ #endif
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+ require 'date'
3
+ require 'bigdecimal'
4
+ require 'rational' unless RUBY_VERSION >= '1.9.2'
5
+
6
+ require 'mysql2/version' unless defined? Mysql2::VERSION
7
+ require 'mysql2/error'
8
+ require 'mysql2/result'
9
+ require 'mysql2/mysql2'
10
+ require 'mysql2/client'
11
+
12
+ # = Mysql2
13
+ #
14
+ # A modern, simple and very fast Mysql library for Ruby - binding to libmysql
15
+ module Mysql2
16
+ end
17
+
18
+ if defined?(ActiveRecord::VERSION::STRING) && ActiveRecord::VERSION::STRING < "3.1"
19
+ puts "WARNING: This version of mysql2 (#{Mysql2::VERSION}) doesn't ship with the ActiveRecord adapter bundled anymore as it's now part of Rails 3.1"
20
+ puts "WARNING: Please use the 0.2.x releases if you plan on using it in Rails <= 3.0.x"
21
+ end
@@ -0,0 +1,264 @@
1
+ module Mysql2
2
+ class Client
3
+ attr_reader :query_options
4
+ @@default_query_options = {
5
+ :as => :hash, # the type of object you want each row back as; also supports :array (an array of values)
6
+ :async => false, # don't wait for a result after sending the query, you'll have to monitor the socket yourself then eventually call Mysql2::Client#async_result
7
+ :cast_booleans => false, # cast tinyint(1) fields as true/false in ruby
8
+ :symbolize_keys => false, # return field names as symbols instead of strings
9
+ :database_timezone => :local, # timezone Mysql2 will assume datetime objects are stored in
10
+ :application_timezone => nil, # timezone Mysql2 will convert to before handing the object back to the caller
11
+ :cache_rows => true, # tells Mysql2 to use it's internal row cache for results
12
+ :connect_flags => REMEMBER_OPTIONS | LONG_PASSWORD | LONG_FLAG | TRANSACTIONS | PROTOCOL_41 | SECURE_CONNECTION,
13
+ :cast => true
14
+ }
15
+
16
+ def initialize(opts = {})
17
+ @query_options = @@default_query_options.dup
18
+ @query_options.merge! opts
19
+
20
+ init_connection
21
+
22
+ [:reconnect, :connect_timeout].each do |key|
23
+ next unless opts.key?(key)
24
+ send(:"#{key}=", opts[key])
25
+ end
26
+ # force the encoding to utf8
27
+ self.charset_name = opts[:encoding] || 'utf8'
28
+
29
+ @read_timeout = opts[:read_timeout]
30
+ if @read_timeout and @read_timeout < 0
31
+ raise Mysql2::Error, "read_timeout must be a positive integer, you passed #{@read_timeout}"
32
+ end
33
+
34
+ ssl_set(*opts.values_at(:sslkey, :sslcert, :sslca, :sslcapath, :sslcipher))
35
+
36
+ user = opts[:username]
37
+ pass = opts[:password]
38
+ host = opts[:host] || 'localhost'
39
+ port = opts[:port] || 3306
40
+ database = opts[:database]
41
+ socket = opts[:socket]
42
+ flags = opts[:flags] ? opts[:flags] | @query_options[:connect_flags] : @query_options[:connect_flags]
43
+
44
+ connect user, pass, host, port, database, socket, flags
45
+ end
46
+
47
+ def self.default_query_options
48
+ @@default_query_options
49
+ end
50
+
51
+ # NOTE: from ruby-mysql
52
+ if defined? Encoding
53
+ CHARSET_MAP = {
54
+ "armscii8" => nil,
55
+ "ascii" => Encoding::US_ASCII,
56
+ "big5" => Encoding::Big5,
57
+ "binary" => Encoding::ASCII_8BIT,
58
+ "cp1250" => Encoding::Windows_1250,
59
+ "cp1251" => Encoding::Windows_1251,
60
+ "cp1256" => Encoding::Windows_1256,
61
+ "cp1257" => Encoding::Windows_1257,
62
+ "cp850" => Encoding::CP850,
63
+ "cp852" => Encoding::CP852,
64
+ "cp866" => Encoding::IBM866,
65
+ "cp932" => Encoding::Windows_31J,
66
+ "dec8" => nil,
67
+ "eucjpms" => Encoding::EucJP_ms,
68
+ "euckr" => Encoding::EUC_KR,
69
+ "gb2312" => Encoding::EUC_CN,
70
+ "gbk" => Encoding::GBK,
71
+ "geostd8" => nil,
72
+ "greek" => Encoding::ISO_8859_7,
73
+ "hebrew" => Encoding::ISO_8859_8,
74
+ "hp8" => nil,
75
+ "keybcs2" => nil,
76
+ "koi8r" => Encoding::KOI8_R,
77
+ "koi8u" => Encoding::KOI8_U,
78
+ "latin1" => Encoding::ISO_8859_1,
79
+ "latin2" => Encoding::ISO_8859_2,
80
+ "latin5" => Encoding::ISO_8859_9,
81
+ "latin7" => Encoding::ISO_8859_13,
82
+ "macce" => Encoding::MacCentEuro,
83
+ "macroman" => Encoding::MacRoman,
84
+ "sjis" => Encoding::SHIFT_JIS,
85
+ "swe7" => nil,
86
+ "tis620" => Encoding::TIS_620,
87
+ "ucs2" => Encoding::UTF_16BE,
88
+ "ujis" => Encoding::EucJP_ms,
89
+ "utf8" => Encoding::UTF_8,
90
+ "utf8mb4" => Encoding::UTF_8,
91
+ }
92
+
93
+ MYSQL_CHARSET_MAP = {
94
+ 1 => {:name => "big5", :collation => "big5_chinese_ci"},
95
+ 2 => {:name => "latin2", :collation => "latin2_czech_cs"},
96
+ 3 => {:name => "dec8", :collation => "dec8_swedish_ci"},
97
+ 4 => {:name => "cp850", :collation => "cp850_general_ci"},
98
+ 5 => {:name => "latin1", :collation => "latin1_german1_ci"},
99
+ 6 => {:name => "hp8", :collation => "hp8_english_ci"},
100
+ 7 => {:name => "koi8r", :collation => "koi8r_general_ci"},
101
+ 8 => {:name => "latin1", :collation => "latin1_swedish_ci"},
102
+ 9 => {:name => "latin2", :collation => "latin2_general_ci"},
103
+ 10 => {:name => "swe7", :collation => "swe7_swedish_ci"},
104
+ 11 => {:name => "ascii", :collation => "ascii_general_ci"},
105
+ 12 => {:name => "ujis", :collation => "ujis_japanese_ci"},
106
+ 13 => {:name => "sjis", :collation => "sjis_japanese_ci"},
107
+ 14 => {:name => "cp1251", :collation => "cp1251_bulgarian_ci"},
108
+ 15 => {:name => "latin1", :collation => "latin1_danish_ci"},
109
+ 16 => {:name => "hebrew", :collation => "hebrew_general_ci"},
110
+ 17 => {:name => "filename", :collation => "filename"},
111
+ 18 => {:name => "tis620", :collation => "tis620_thai_ci"},
112
+ 19 => {:name => "euckr", :collation => "euckr_korean_ci"},
113
+ 20 => {:name => "latin7", :collation => "latin7_estonian_cs"},
114
+ 21 => {:name => "latin2", :collation => "latin2_hungarian_ci"},
115
+ 22 => {:name => "koi8u", :collation => "koi8u_general_ci"},
116
+ 23 => {:name => "cp1251", :collation => "cp1251_ukrainian_ci"},
117
+ 24 => {:name => "gb2312", :collation => "gb2312_chinese_ci"},
118
+ 25 => {:name => "greek", :collation => "greek_general_ci"},
119
+ 26 => {:name => "cp1250", :collation => "cp1250_general_ci"},
120
+ 27 => {:name => "latin2", :collation => "latin2_croatian_ci"},
121
+ 28 => {:name => "gbk", :collation => "gbk_chinese_ci"},
122
+ 29 => {:name => "cp1257", :collation => "cp1257_lithuanian_ci"},
123
+ 30 => {:name => "latin5", :collation => "latin5_turkish_ci"},
124
+ 31 => {:name => "latin1", :collation => "latin1_german2_ci"},
125
+ 32 => {:name => "armscii8", :collation => "armscii8_general_ci"},
126
+ 33 => {:name => "utf8", :collation => "utf8_general_ci"},
127
+ 34 => {:name => "cp1250", :collation => "cp1250_czech_cs"},
128
+ 35 => {:name => "ucs2", :collation => "ucs2_general_ci"},
129
+ 36 => {:name => "cp866", :collation => "cp866_general_ci"},
130
+ 37 => {:name => "keybcs2", :collation => "keybcs2_general_ci"},
131
+ 38 => {:name => "macce", :collation => "macce_general_ci"},
132
+ 39 => {:name => "macroman", :collation => "macroman_general_ci"},
133
+ 40 => {:name => "cp852", :collation => "cp852_general_ci"},
134
+ 41 => {:name => "latin7", :collation => "latin7_general_ci"},
135
+ 42 => {:name => "latin7", :collation => "latin7_general_cs"},
136
+ 43 => {:name => "macce", :collation => "macce_bin"},
137
+ 44 => {:name => "cp1250", :collation => "cp1250_croatian_ci"},
138
+ 45 => {:name => "utf8mb4", :collation => "utf8mb4_general_ci"},
139
+ 46 => {:name => "utf8mb4", :collation => "utf8mb4_bin"},
140
+ 47 => {:name => "latin1", :collation => "latin1_bin"},
141
+ 48 => {:name => "latin1", :collation => "latin1_general_ci"},
142
+ 49 => {:name => "latin1", :collation => "latin1_general_cs"},
143
+ 50 => {:name => "cp1251", :collation => "cp1251_bin"},
144
+ 51 => {:name => "cp1251", :collation => "cp1251_general_ci"},
145
+ 52 => {:name => "cp1251", :collation => "cp1251_general_cs"},
146
+ 53 => {:name => "macroman", :collation => "macroman_bin"},
147
+ 57 => {:name => "cp1256", :collation => "cp1256_general_ci"},
148
+ 58 => {:name => "cp1257", :collation => "cp1257_bin"},
149
+ 59 => {:name => "cp1257", :collation => "cp1257_general_ci"},
150
+ 63 => {:name => "binary", :collation => "binary"},
151
+ 64 => {:name => "armscii8", :collation => "armscii8_bin"},
152
+ 65 => {:name => "ascii", :collation => "ascii_bin"},
153
+ 66 => {:name => "cp1250", :collation => "cp1250_bin"},
154
+ 67 => {:name => "cp1256", :collation => "cp1256_bin"},
155
+ 68 => {:name => "cp866", :collation => "cp866_bin"},
156
+ 69 => {:name => "dec8", :collation => "dec8_bin"},
157
+ 70 => {:name => "greek", :collation => "greek_bin"},
158
+ 71 => {:name => "hebrew", :collation => "hebrew_bin"},
159
+ 72 => {:name => "hp8", :collation => "hp8_bin"},
160
+ 73 => {:name => "keybcs2", :collation => "keybcs2_bin"},
161
+ 74 => {:name => "koi8r", :collation => "koi8r_bin"},
162
+ 75 => {:name => "koi8u", :collation => "koi8u_bin"},
163
+ 77 => {:name => "latin2", :collation => "latin2_bin"},
164
+ 78 => {:name => "latin5", :collation => "latin5_bin"},
165
+ 79 => {:name => "latin7", :collation => "latin7_bin"},
166
+ 80 => {:name => "cp850", :collation => "cp850_bin"},
167
+ 81 => {:name => "cp852", :collation => "cp852_bin"},
168
+ 82 => {:name => "swe7", :collation => "swe7_bin"},
169
+ 83 => {:name => "utf8", :collation => "utf8_bin"},
170
+ 84 => {:name => "big5", :collation => "big5_bin"},
171
+ 85 => {:name => "euckr", :collation => "euckr_bin"},
172
+ 86 => {:name => "gb2312", :collation => "gb2312_bin"},
173
+ 87 => {:name => "gbk", :collation => "gbk_bin"},
174
+ 88 => {:name => "sjis", :collation => "sjis_bin"},
175
+ 89 => {:name => "tis620", :collation => "tis620_bin"},
176
+ 90 => {:name => "ucs2", :collation => "ucs2_bin"},
177
+ 91 => {:name => "ujis", :collation => "ujis_bin"},
178
+ 92 => {:name => "geostd8", :collation => "geostd8_general_ci"},
179
+ 93 => {:name => "geostd8", :collation => "geostd8_bin"},
180
+ 94 => {:name => "latin1", :collation => "latin1_spanish_ci"},
181
+ 95 => {:name => "cp932", :collation => "cp932_japanese_ci"},
182
+ 96 => {:name => "cp932", :collation => "cp932_bin"},
183
+ 97 => {:name => "eucjpms", :collation => "eucjpms_japanese_ci"},
184
+ 98 => {:name => "eucjpms", :collation => "eucjpms_bin"},
185
+ 99 => {:name => "cp1250", :collation => "cp1250_polish_ci"},
186
+ 128 => {:name => "ucs2", :collation => "ucs2_unicode_ci"},
187
+ 129 => {:name => "ucs2", :collation => "ucs2_icelandic_ci"},
188
+ 130 => {:name => "ucs2", :collation => "ucs2_latvian_ci"},
189
+ 131 => {:name => "ucs2", :collation => "ucs2_romanian_ci"},
190
+ 132 => {:name => "ucs2", :collation => "ucs2_slovenian_ci"},
191
+ 133 => {:name => "ucs2", :collation => "ucs2_polish_ci"},
192
+ 134 => {:name => "ucs2", :collation => "ucs2_estonian_ci"},
193
+ 135 => {:name => "ucs2", :collation => "ucs2_spanish_ci"},
194
+ 136 => {:name => "ucs2", :collation => "ucs2_swedish_ci"},
195
+ 137 => {:name => "ucs2", :collation => "ucs2_turkish_ci"},
196
+ 138 => {:name => "ucs2", :collation => "ucs2_czech_ci"},
197
+ 139 => {:name => "ucs2", :collation => "ucs2_danish_ci"},
198
+ 140 => {:name => "ucs2", :collation => "ucs2_lithuanian_ci"},
199
+ 141 => {:name => "ucs2", :collation => "ucs2_slovak_ci"},
200
+ 142 => {:name => "ucs2", :collation => "ucs2_spanish2_ci"},
201
+ 143 => {:name => "ucs2", :collation => "ucs2_roman_ci"},
202
+ 144 => {:name => "ucs2", :collation => "ucs2_persian_ci"},
203
+ 145 => {:name => "ucs2", :collation => "ucs2_esperanto_ci"},
204
+ 146 => {:name => "ucs2", :collation => "ucs2_hungarian_ci"},
205
+ 192 => {:name => "utf8", :collation => "utf8_unicode_ci"},
206
+ 193 => {:name => "utf8", :collation => "utf8_icelandic_ci"},
207
+ 194 => {:name => "utf8", :collation => "utf8_latvian_ci"},
208
+ 195 => {:name => "utf8", :collation => "utf8_romanian_ci"},
209
+ 196 => {:name => "utf8", :collation => "utf8_slovenian_ci"},
210
+ 197 => {:name => "utf8", :collation => "utf8_polish_ci"},
211
+ 198 => {:name => "utf8", :collation => "utf8_estonian_ci"},
212
+ 199 => {:name => "utf8", :collation => "utf8_spanish_ci"},
213
+ 200 => {:name => "utf8", :collation => "utf8_swedish_ci"},
214
+ 201 => {:name => "utf8", :collation => "utf8_turkish_ci"},
215
+ 202 => {:name => "utf8", :collation => "utf8_czech_ci"},
216
+ 203 => {:name => "utf8", :collation => "utf8_danish_ci"},
217
+ 204 => {:name => "utf8", :collation => "utf8_lithuanian_ci"},
218
+ 205 => {:name => "utf8", :collation => "utf8_slovak_ci"},
219
+ 206 => {:name => "utf8", :collation => "utf8_spanish2_ci"},
220
+ 207 => {:name => "utf8", :collation => "utf8_roman_ci"},
221
+ 208 => {:name => "utf8", :collation => "utf8_persian_ci"},
222
+ 209 => {:name => "utf8", :collation => "utf8_esperanto_ci"},
223
+ 210 => {:name => "utf8", :collation => "utf8_hungarian_ci"},
224
+ 224 => {:name => "utf8mb4", :collation => "utf8mb4_unicode_ci"},
225
+ 225 => {:name => "utf8mb4", :collation => "utf8mb4_icelandic_ci"},
226
+ 226 => {:name => "utf8mb4", :collation => "utf8mb4_latvian_ci"},
227
+ 227 => {:name => "utf8mb4", :collation => "utf8mb4_romanian_ci"},
228
+ 228 => {:name => "utf8mb4", :collation => "utf8mb4_slovenian_ci"},
229
+ 229 => {:name => "utf8mb4", :collation => "utf8mb4_polish_ci"},
230
+ 230 => {:name => "utf8mb4", :collation => "utf8mb4_estonian_ci"},
231
+ 231 => {:name => "utf8mb4", :collation => "utf8mb4_spanish_ci"},
232
+ 232 => {:name => "utf8mb4", :collation => "utf8mb4_swedish_ci"},
233
+ 233 => {:name => "utf8mb4", :collation => "utf8mb4_turkish_ci"},
234
+ 234 => {:name => "utf8mb4", :collation => "utf8mb4_czech_ci"},
235
+ 235 => {:name => "utf8mb4", :collation => "utf8mb4_danish_ci"},
236
+ 236 => {:name => "utf8mb4", :collation => "utf8mb4_lithuanian_ci"},
237
+ 237 => {:name => "utf8mb4", :collation => "utf8mb4_slovak_ci"},
238
+ 238 => {:name => "utf8mb4", :collation => "utf8mb4_spanish2_ci"},
239
+ 239 => {:name => "utf8mb4", :collation => "utf8mb4_roman_ci"},
240
+ 240 => {:name => "utf8mb4", :collation => "utf8mb4_persian_ci"},
241
+ 241 => {:name => "utf8mb4", :collation => "utf8mb4_esperanto_ci"},
242
+ 242 => {:name => "utf8mb4", :collation => "utf8mb4_hungarian_ci"},
243
+ 254 => {:name => "utf8", :collation => "utf8_general_cs"}
244
+ }
245
+
246
+ def self.encoding_from_charset(charset)
247
+ CHARSET_MAP[charset.to_s.downcase]
248
+ end
249
+
250
+ def self.encoding_from_charset_code(code)
251
+ if mapping = MYSQL_CHARSET_MAP[code]
252
+ encoding_from_charset(mapping[:name])
253
+ else
254
+ nil
255
+ end
256
+ end
257
+ end
258
+
259
+ private
260
+ def self.local_offset
261
+ ::Time.local(2010).utc_offset.to_r / 86400
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: utf-8
2
+
3
+ require 'eventmachine'
4
+ require 'mysql2'
5
+
6
+ module Mysql2
7
+ module EM
8
+ class Client < ::Mysql2::Client
9
+ module Watcher
10
+ def initialize(client, deferable)
11
+ @client = client
12
+ @deferable = deferable
13
+ end
14
+
15
+ def notify_readable
16
+ detach
17
+ begin
18
+ @deferable.succeed(@client.async_result)
19
+ rescue Exception => e
20
+ @deferable.fail(e)
21
+ end
22
+ end
23
+ end
24
+
25
+ def query(sql, opts={})
26
+ if ::EM.reactor_running?
27
+ super(sql, opts.merge(:async => true))
28
+ deferable = ::EM::DefaultDeferrable.new
29
+ ::EM.watch(self.socket, Watcher, self, deferable).notify_readable = true
30
+ deferable
31
+ else
32
+ super(sql, opts)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,15 @@
1
+ module Mysql2
2
+ class Error < StandardError
3
+ attr_accessor :error_number, :sql_state
4
+
5
+ def initialize msg
6
+ super
7
+ @error_number = nil
8
+ @sql_state = nil
9
+ end
10
+
11
+ # Mysql gem compatibility
12
+ alias_method :errno, :error_number
13
+ alias_method :error, :message
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module Mysql2
2
+ class Result
3
+ include Enumerable
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module Mysql2
2
+ VERSION = "0.3.11"
3
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../lib/mysql2/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{solaris-mysql2}
5
+ s.version = Mysql2::VERSION
6
+ s.authors = ["Brian Lopez"]
7
+ s.date = Time.now.utc.strftime("%Y-%m-%d")
8
+ s.email = %q{seniorlopez@gmail.com}
9
+ s.extensions = ["ext/mysql2/extconf.rb"]
10
+ s.files = `git ls-files`.split("\n")
11
+ s.homepage = %q{http://github.com/brianmario/mysql2}
12
+ s.rdoc_options = ["--charset=UTF-8"]
13
+ s.require_paths = ["lib"]
14
+ s.rubygems_version = %q{1.4.2}
15
+ s.summary = %q{A simple, fast Mysql library for Ruby, binding to libmysql}
16
+ s.test_files = `git ls-files spec examples`.split("\n")
17
+
18
+ # tests
19
+ s.add_development_dependency 'eventmachine'
20
+ s.add_development_dependency 'rake-compiler', "~> 0.7.7"
21
+ s.add_development_dependency 'rake', '0.8.7' # NB: 0.8.7 required by rake-compiler 0.7.9
22
+ s.add_development_dependency 'rspec'
23
+ # benchmarks
24
+ s.add_development_dependency 'activerecord'
25
+ s.add_development_dependency 'mysql'
26
+ s.add_development_dependency 'do_mysql'
27
+ s.add_development_dependency 'sequel'
28
+ s.add_development_dependency 'faker'
29
+ end
@@ -0,0 +1,50 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+ begin
4
+ require 'eventmachine'
5
+ require 'mysql2/em'
6
+
7
+ describe Mysql2::EM::Client do
8
+ it "should support async queries" do
9
+ results = []
10
+ EM.run do
11
+ client1 = Mysql2::EM::Client.new
12
+ defer1 = client1.query "SELECT sleep(0.1) as first_query"
13
+ defer1.callback do |result|
14
+ results << result.first
15
+ EM.stop_event_loop
16
+ end
17
+
18
+ client2 = Mysql2::EM::Client.new
19
+ defer2 = client2.query "SELECT sleep(0.025) second_query"
20
+ defer2.callback do |result|
21
+ results << result.first
22
+ end
23
+ end
24
+
25
+ results[0].keys.should include("second_query")
26
+ results[1].keys.should include("first_query")
27
+ end
28
+
29
+ it "should support queries in callbacks" do
30
+ results = []
31
+ EM.run do
32
+ client = Mysql2::EM::Client.new
33
+ defer1 = client.query "SELECT sleep(0.025) as first_query"
34
+ defer1.callback do |result|
35
+ results << result.first
36
+ defer2 = client.query "SELECT sleep(0.025) as second_query"
37
+ defer2.callback do |result|
38
+ results << result.first
39
+ EM.stop_event_loop
40
+ end
41
+ end
42
+ end
43
+
44
+ results[0].keys.should include("first_query")
45
+ results[1].keys.should include("second_query")
46
+ end
47
+ end
48
+ rescue LoadError
49
+ puts "EventMachine not installed, skipping the specs that use it"
50
+ end