ruby-mysql 2.9.14 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mysql.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  # coding: ascii-8bit
2
- # Copyright (C) 2008-2012 TOMITA Masahiro
2
+ # Copyright (C) 2008 TOMITA Masahiro
3
3
  # mailto:tommy@tmtm.org
4
4
 
5
+ require 'uri'
6
+
5
7
  # MySQL connection class.
6
8
  # @example
7
9
  # my = Mysql.connect('hostname', 'user', 'password', 'dbname')
@@ -11,48 +13,76 @@
11
13
  # end
12
14
  class Mysql
13
15
 
14
- require "mysql/constants"
15
- require "mysql/error"
16
- require "mysql/charset"
17
- require "mysql/protocol"
18
- require "mysql/packet.rb"
19
- begin
20
- require "mysql/ext.so"
21
- rescue LoadError
22
- end
16
+ require_relative "mysql/constants"
17
+ require_relative "mysql/error"
18
+ require_relative "mysql/charset"
19
+ require_relative "mysql/protocol"
20
+ require_relative "mysql/packet.rb"
23
21
 
24
- VERSION = 20913 # Version number of this library
22
+ VERSION = '3.0.0' # Version number of this library
25
23
  MYSQL_UNIX_PORT = "/tmp/mysql.sock" # UNIX domain socket filename
26
24
  MYSQL_TCP_PORT = 3306 # TCP socket port number
27
25
 
28
- # @return [Mysql::Charset] character set of MySQL connection
29
- attr_reader :charset
26
+ # @!attribute [rw] host
27
+ # @return [String, nil]
28
+ # @!attribute [rw] username
29
+ # @return [String, nil]
30
+ # @!attribute [rw] password
31
+ # @return [String, nil]
32
+ # @!attribute [rw] database
33
+ # @return [String, nil]
34
+ # @!attribute [rw] port
35
+ # @return [Integer, String, nil]
36
+ # @!attribute [rw] socket
37
+ # @return [String, nil] socket filename
38
+ # @!attribute [rw] flags
39
+ # @return [Integer, nil]
40
+ # @!attribute [rw] connect_timeout
41
+ # @return [Numeric, nil]
42
+ # @!attribute [rw] read_timeout
43
+ # @return [Numeric, nil]
44
+ # @!attribute [rw] write_timeout
45
+ # @return [Numeric, nil]
46
+ # @!attribute [rw] init_command
47
+ # @return [String, nil]
48
+ # @!attribute [rw] local_infile
49
+ # @return [Boolean]
50
+ # @!attribute [rw] load_data_local_dir
51
+ # @return [String, nil]
52
+ # @!attribute [rw] ssl_mode
53
+ # @return [String, Integer] 1 or "disabled" / 2 or "preferred" / 3 or "required"
54
+ # @!attribute [rw] get_server_public_key
55
+ # @return [Boolean]
56
+ DEFAULT_OPTS = {
57
+ host: nil,
58
+ username: nil,
59
+ password: nil,
60
+ database: nil,
61
+ port: nil,
62
+ socket: nil,
63
+ flags: 0,
64
+ charset: nil,
65
+ connect_timeout: nil,
66
+ read_timeout: nil,
67
+ write_timeout: nil,
68
+ init_command: nil,
69
+ local_infile: nil,
70
+ load_data_local_dir: nil,
71
+ ssl_mode: SSL_MODE_PREFERRED,
72
+ get_server_public_key: false,
73
+ }.freeze
74
+
30
75
  # @private
31
76
  attr_reader :protocol
32
77
 
33
- # @return [Boolean] if true, {#query} return {Mysql::Result}.
34
- attr_accessor :query_with_result
35
-
36
78
  class << self
37
- # Make Mysql object without connecting.
38
- # @return [Mysql]
39
- def init
40
- my = self.allocate
41
- my.instance_eval{initialize}
42
- my
43
- end
44
-
45
79
  # Make Mysql object and connect to mysqld.
46
- # @param args same as arguments for {#connect}.
80
+ # parameter is same as arguments for {#initialize}.
47
81
  # @return [Mysql]
48
- def new(*args)
49
- my = self.init
50
- my.connect(*args)
82
+ def connect(*args, **opts)
83
+ self.new(*args, **opts).connect
51
84
  end
52
85
 
53
- alias real_connect new
54
- alias connect new
55
-
56
86
  # Escape special character in string.
57
87
  # @param [String] str
58
88
  # @return [String]
@@ -68,58 +98,116 @@ class Mysql
68
98
  end
69
99
  end
70
100
  alias quote escape_string
71
-
72
- # @return [String] client version. This value is dummy for MySQL/Ruby compatibility.
73
- def client_info
74
- "5.0.0"
75
- end
76
- alias get_client_info client_info
77
-
78
- # @return [Integer] client version. This value is dummy for MySQL/Ruby compatibility.
79
- def client_version
80
- 50000
81
- end
82
- alias get_client_version client_version
83
101
  end
84
102
 
85
- def initialize
103
+ # @overload initialize(uri, **opts)
104
+ # @param uri [String, URI] "mysql://username:password@host:port/database?param=value&..." / "mysql://username:password@%2Ftmp%2Fmysql.sock/database" / "mysql://username:password@/database?socket=/tmp/mysql.sock"
105
+ # @param opts [Hash] options
106
+ # @overload initialize(host, username, password, database, port, socket, flags, **opts)
107
+ # @param host [String] hostname mysqld running
108
+ # @param username [String] username to connect to mysqld
109
+ # @param password [String] password to connect to mysqld
110
+ # @param database [String] initial database name
111
+ # @param port [String] port number (used if host is not 'localhost' or nil)
112
+ # @param socket [String] socket filename (used if host is 'localhost' or nil)
113
+ # @param flags [Integer] connection flag. Mysql::CLIENT_* ORed
114
+ # @param opts [Hash] options
115
+ # @overload initialize(host: nil, username: nil, password: nil, database: nil, port: nil, socket: nil, flags: nil, **opts)
116
+ # @param host [String] hostname mysqld running
117
+ # @param username [String] username to connect to mysqld
118
+ # @param password [String] password to connect to mysqld
119
+ # @param database [String] initial database name
120
+ # @param port [String] port number (used if host is not 'localhost' or nil)
121
+ # @param socket [String] socket filename (used if host is 'localhost' or nil)
122
+ # @param flags [Integer] connection flag. Mysql::CLIENT_* ORed
123
+ # @param opts [Hash] options
124
+ # @option opts :host [String] hostname mysqld running
125
+ # @option opts :username [String] username to connect to mysqld
126
+ # @option opts :password [String] password to connect to mysqld
127
+ # @option opts :database [String] initial database name
128
+ # @option opts :port [String] port number (used if host is not 'localhost' or nil)
129
+ # @option opts :socket [String] socket filename (used if host is 'localhost' or nil)
130
+ # @option opts :flags [Integer] connection flag. Mysql::CLIENT_* ORed
131
+ # @option opts :charset [Mysql::Charset, String] character set
132
+ # @option opts :connect_timeout [Numeric, nil]
133
+ # @option opts :read_timeout [Numeric, nil]
134
+ # @option opts :write_timeout [Numeric, nil]
135
+ # @option opts :local_infile [Boolean]
136
+ # @option opts :load_data_local_dir [String]
137
+ # @option opts :ssl_mode [Integer]
138
+ # @option opts :get_server_public_key [Boolean]
139
+ def initialize(*args, **opts)
86
140
  @fields = nil
87
141
  @protocol = nil
88
- @charset = nil
89
- @connect_timeout = nil
90
- @read_timeout = nil
91
- @write_timeout = nil
92
- @init_command = nil
93
142
  @sqlstate = "00000"
94
- @query_with_result = true
95
143
  @host_info = nil
96
144
  @last_error = nil
97
145
  @result_exist = false
98
- @local_infile = nil
146
+ @opts = DEFAULT_OPTS.dup
147
+ parse_args(args, opts)
99
148
  end
100
149
 
101
150
  # Connect to mysqld.
102
- # @param [String / nil] host hostname mysqld running
103
- # @param [String / nil] user username to connect to mysqld
104
- # @param [String / nil] passwd password to connect to mysqld
105
- # @param [String / nil] db initial database name
106
- # @param [Integer / nil] port port number (used if host is not 'localhost' or nil)
107
- # @param [String / nil] socket socket file name (used if host is 'localhost' or nil)
108
- # @param [Integer / nil] flag connection flag. Mysql::CLIENT_* ORed
109
- # @return self
110
- def connect(host=nil, user=nil, passwd=nil, db=nil, port=nil, socket=nil, flag=0)
111
- if flag & CLIENT_COMPRESS != 0
151
+ # parameter is same as arguments for {#initialize}.
152
+ # @return [Mysql] self
153
+ def connect(*args, **opts)
154
+ parse_args(args, opts)
155
+ if @opts[:flags] & CLIENT_COMPRESS != 0
112
156
  warn 'unsupported flag: CLIENT_COMPRESS' if $VERBOSE
113
- flag &= ~CLIENT_COMPRESS
157
+ @opts[:flags] &= ~CLIENT_COMPRESS
114
158
  end
115
- @protocol = Protocol.new host, port, socket, @connect_timeout, @read_timeout, @write_timeout
116
- @protocol.authenticate user, passwd, db, (@local_infile ? CLIENT_LOCAL_FILES : 0) | flag, @charset
117
- @charset ||= @protocol.charset
118
- @host_info = (host.nil? || host == "localhost") ? 'Localhost via UNIX socket' : "#{host} via TCP/IP"
119
- query @init_command if @init_command
159
+ @protocol = Protocol.new(@opts)
160
+ @protocol.authenticate
161
+ @host_info = (@opts[:host].nil? || @opts[:host] == "localhost") ? 'Localhost via UNIX socket' : "#{@opts[:host]} via TCP/IP"
162
+ query @opts[:init_command] if @opts[:init_command]
120
163
  return self
121
164
  end
122
- alias real_connect connect
165
+
166
+ def parse_args(args, opts)
167
+ case args[0]
168
+ when URI
169
+ uri = args[0]
170
+ when /\Amysql:\/\//
171
+ uri = URI.parse(args[0])
172
+ when String
173
+ @opts[:host], user, passwd, dbname, port, socket, flags = *args
174
+ @opts[:username] = user if user
175
+ @opts[:password] = passwd if passwd
176
+ @opts[:database] = dbname if dbname
177
+ @opts[:port] = port if port
178
+ @opts[:socket] = socket if socket
179
+ @opts[:flags] = flags if flags
180
+ when Hash
181
+ # skip
182
+ when nil
183
+ # skip
184
+ end
185
+ if uri
186
+ host = uri.hostname.to_s
187
+ host = URI.decode_www_form_component(host)
188
+ if host.start_with?('/')
189
+ @opts[:socket] = host
190
+ host = ''
191
+ end
192
+ @opts[:host] = host
193
+ @opts[:username] = URI.decode_www_form_component(uri.user.to_s)
194
+ @opts[:password] = URI.decode_www_form_component(uri.password.to_s)
195
+ @opts[:database] = uri.path.sub(/\A\/+/, '')
196
+ @opts[:port] = uri.port
197
+ opts = URI.decode_www_form(uri.query).to_h.transform_keys(&:intern).merge(opts) if uri.query
198
+ opts[:flags] = opts[:flags].to_i if opts[:flags]
199
+ end
200
+ if args.last.kind_of? Hash
201
+ opts = opts.merge(args.last)
202
+ end
203
+ @opts.update(opts)
204
+ end
205
+
206
+ DEFAULT_OPTS.each_key do |var|
207
+ next if var == :charset
208
+ define_method(var){@opts[var]}
209
+ define_method("#{var}="){|val| @opts[var] = val}
210
+ end
123
211
 
124
212
  # Disconnect from mysql.
125
213
  # @return [Mysql] self
@@ -141,90 +229,35 @@ class Mysql
141
229
  return self
142
230
  end
143
231
 
144
- # Set option for connection.
145
- #
146
- # Available options:
147
- # Mysql::INIT_COMMAND, Mysql::OPT_CONNECT_TIMEOUT, Mysql::OPT_READ_TIMEOUT,
148
- # Mysql::OPT_WRITE_TIMEOUT, Mysql::SET_CHARSET_NAME
149
- # @param [Integer] opt option
150
- # @param [Integer] value option value that is depend on opt
151
- # @return [Mysql] self
152
- def options(opt, value=nil)
153
- case opt
154
- when Mysql::INIT_COMMAND
155
- @init_command = value.to_s
156
- # when Mysql::OPT_COMPRESS
157
- when Mysql::OPT_CONNECT_TIMEOUT
158
- @connect_timeout = value
159
- # when Mysql::GUESS_CONNECTION
160
- when Mysql::OPT_LOCAL_INFILE
161
- @local_infile = value
162
- # when Mysql::OPT_NAMED_PIPE
163
- # when Mysql::OPT_PROTOCOL
164
- when Mysql::OPT_READ_TIMEOUT
165
- @read_timeout = value.to_i
166
- # when Mysql::OPT_RECONNECT
167
- # when Mysql::SET_CLIENT_IP
168
- # when Mysql::OPT_SSL_VERIFY_SERVER_CERT
169
- # when Mysql::OPT_USE_EMBEDDED_CONNECTION
170
- # when Mysql::OPT_USE_REMOTE_CONNECTION
171
- when Mysql::OPT_WRITE_TIMEOUT
172
- @write_timeout = value.to_i
173
- # when Mysql::READ_DEFAULT_FILE
174
- # when Mysql::READ_DEFAULT_GROUP
175
- # when Mysql::REPORT_DATA_TRUNCATION
176
- # when Mysql::SECURE_AUTH
177
- # when Mysql::SET_CHARSET_DIR
178
- when Mysql::SET_CHARSET_NAME
179
- @charset = Charset.by_name value.to_s
180
- # when Mysql::SHARED_MEMORY_BASE_NAME
181
- else
182
- warn "option not implemented: #{opt}" if $VERBOSE
183
- end
184
- self
185
- end
186
-
187
232
  # Escape special character in MySQL.
188
233
  #
189
- # In Ruby 1.8, this is not safe for multibyte charset such as 'SJIS'.
190
- # You should use place-holder in prepared-statement.
191
234
  # @param [String] str
192
235
  # return [String]
193
236
  def escape_string(str)
194
- if not defined? Encoding and @charset.unsafe
195
- raise ClientError, 'Mysql#escape_string is called for unsafe multibyte charset'
196
- end
197
237
  self.class.escape_string str
198
238
  end
199
239
  alias quote escape_string
200
240
 
201
- # @return [String] client version
202
- def client_info
203
- self.class.client_info
204
- end
205
- alias get_client_info client_info
206
-
207
- # @return [Integer] client version
208
- def client_version
209
- self.class.client_version
241
+ # @return [Mysql::Charset] character set of MySQL connection
242
+ def charset
243
+ @opts[:charset]
210
244
  end
211
- alias get_client_version client_version
212
245
 
213
246
  # Set charset of MySQL connection.
214
- # @param [String / Mysql::Charset] cs
247
+ # @param [String, Mysql::Charset] cs
215
248
  def charset=(cs)
216
249
  charset = cs.is_a?(Charset) ? cs : Charset.by_name(cs)
217
250
  if @protocol
218
251
  @protocol.charset = charset
219
252
  query "SET NAMES #{charset.name}"
220
253
  end
221
- @charset = charset
254
+ @opts[:charset] = charset
222
255
  cs
223
256
  end
224
257
 
225
258
  # @return [String] charset name
226
259
  def character_set_name
227
- @charset.name
260
+ @protocol.charset.name
228
261
  end
229
262
 
230
263
  # @return [Integer] last error number
@@ -251,27 +284,18 @@ class Mysql
251
284
  def host_info
252
285
  @host_info
253
286
  end
254
- alias get_host_info host_info
255
-
256
- # @return [Integer] protocol version
257
- def proto_info
258
- Mysql::Protocol::VERSION
259
- end
260
- alias get_proto_info proto_info
261
287
 
262
288
  # @return [String] server version
263
289
  def server_info
264
290
  check_connection
265
291
  @protocol.server_info
266
292
  end
267
- alias get_server_info server_info
268
293
 
269
294
  # @return [Integer] server version
270
295
  def server_version
271
296
  check_connection
272
297
  @protocol.server_version
273
298
  end
274
- alias get_server_version server_version
275
299
 
276
300
  # @return [String] information for last query
277
301
  def info
@@ -302,22 +326,18 @@ class Mysql
302
326
  self
303
327
  end
304
328
 
305
- # database list.
306
- # @param [String] db database name that may contain wild card.
307
- # @return [Array<String>] database list
308
- def list_dbs(db=nil)
309
- db &&= db.gsub(/[\\\']/){"\\#{$&}"}
310
- query(db ? "show databases like '#{db}'" : "show databases").map(&:first)
311
- end
312
-
313
329
  # Execute query string.
314
- # @param [String] str Query.
315
- # @yield [Mysql::Result] evaluated per query.
316
- # @return [Mysql::Result] If {#query_with_result} is true and result set exist.
317
- # @return [nil] If {#query_with_result} is true and the query does not return result set.
318
- # @return [Mysql] If {#query_with_result} is false or block is specified
330
+ # @overload query(str)
331
+ # @param [String] str Query.
332
+ # @return [Mysql::Result]
333
+ # @return [nil] if the query does not return result set.
334
+ # @overload query(str, &block)
335
+ # @param [String] str Query.
336
+ # @yield [Mysql::Result] evaluated per query.
337
+ # @return [self]
319
338
  # @example
320
339
  # my.query("select 1,NULL,'abc'").fetch # => [1, nil, "abc"]
340
+ # my.query("select 1,NULL,'abc'"){|res| res.fetch}
321
341
  def query(str, &block)
322
342
  check_connection
323
343
  @fields = nil
@@ -334,20 +354,15 @@ class Mysql
334
354
  end
335
355
  return self
336
356
  end
337
- if @query_with_result
338
- return @fields ? store_result : nil
339
- else
340
- return self
341
- end
357
+ return @fields ? store_result : nil
342
358
  rescue ServerError => e
343
359
  @last_error = e
344
360
  @sqlstate = e.sqlstate
345
361
  raise
346
362
  end
347
363
  end
348
- alias real_query query
349
364
 
350
- # Get all data for last query if query_with_result is false.
365
+ # Get all data for last query.
351
366
  # @return [Mysql::Result]
352
367
  def store_result
353
368
  check_connection
@@ -363,12 +378,6 @@ class Mysql
363
378
  @protocol.thread_id
364
379
  end
365
380
 
366
- # Use result of query. The result data is retrieved when you use Mysql::Result#fetch.
367
- # @return [Mysql::Result]
368
- def use_result
369
- store_result
370
- end
371
-
372
381
  # Set server option.
373
382
  # @param [Integer] opt {Mysql::OPTION_MULTI_STATEMENTS_ON} or {Mysql::OPTION_MULTI_STATEMENTS_OFF}
374
383
  # @return [Mysql] self
@@ -402,7 +411,7 @@ class Mysql
402
411
  # @param [String] str query string
403
412
  # @return [Mysql::Stmt] Prepared-statement object
404
413
  def prepare(str)
405
- st = Stmt.new @protocol, @charset
414
+ st = Stmt.new @protocol
406
415
  st.prepare str
407
416
  st
408
417
  end
@@ -410,41 +419,8 @@ class Mysql
410
419
  # @private
411
420
  # Make empty prepared-statement object.
412
421
  # @return [Mysql::Stmt] If block is not specified.
413
- def stmt_init
414
- Stmt.new @protocol, @charset
415
- end
416
-
417
- # Returns Mysql::Result object that is empty.
418
- # Use fetch_fields to get list of fields.
419
- # @param [String] table table name.
420
- # @param [String] field field name that may contain wild card.
421
- # @return [Mysql::Result]
422
- def list_fields(table, field=nil)
423
- check_connection
424
- begin
425
- fields = @protocol.field_list_command table, field
426
- return Result.new fields
427
- rescue ServerError => e
428
- @last_error = e
429
- @sqlstate = e.sqlstate
430
- raise
431
- end
432
- end
433
-
434
- # @return [Mysql::Result] containing process list
435
- def list_processes
436
- check_connection
437
- @fields = @protocol.process_info_command
438
- @result_exist = true
439
- store_result
440
- end
441
-
442
- # @note for Ruby 1.8: This is not multi-byte safe. Don't use for multi-byte charset such as cp932.
443
- # @param [String] table database name that may contain wild card.
444
- # @return [Array<String>] list of table name.
445
- def list_tables(table=nil)
446
- q = table ? "show tables like '#{quote table}'" : "show tables"
447
- query(q).map(&:first)
422
+ def stmt
423
+ Stmt.new @protocol
448
424
  end
449
425
 
450
426
  # Check whether the connection is available.
@@ -557,7 +533,7 @@ class Mysql
557
533
  end
558
534
 
559
535
  # @return [Hash] field information
560
- def hash
536
+ def to_hash
561
537
  {
562
538
  "name" => @name,
563
539
  "table" => @table,
@@ -793,10 +769,9 @@ class Mysql
793
769
  # @private
794
770
  # @param [Array<Mysql::Field>] fields
795
771
  # @param [Mysql::Protocol] protocol
796
- # @param [Mysql::Charset] charset
797
- def initialize(fields, protocol, charset)
772
+ def initialize(fields, protocol)
798
773
  super fields
799
- @records = protocol.stmt_retr_all_records @fields, charset
774
+ @records = protocol.stmt_retr_all_records @fields, protocol.charset
800
775
  end
801
776
  end
802
777
 
@@ -831,15 +806,12 @@ class Mysql
831
806
 
832
807
  # @private
833
808
  # @param [Mysql::Protocol] protocol
834
- # @param [Mysql::Charset] charset
835
- def initialize(protocol, charset)
809
+ def initialize(protocol)
836
810
  @protocol = protocol
837
- @charset = charset
838
811
  @statement_id = nil
839
812
  @affected_rows = @insert_id = @server_status = @warning_count = 0
840
813
  @sqlstate = "00000"
841
814
  @param_count = nil
842
- @bind_result = nil
843
815
  end
844
816
 
845
817
  # @private
@@ -866,13 +838,13 @@ class Mysql
866
838
  def execute(*values)
867
839
  raise ClientError, "not prepared" unless @param_count
868
840
  raise ClientError, "parameter count mismatch" if values.length != @param_count
869
- values = values.map{|v| @charset.convert v}
841
+ values = values.map{|v| @protocol.charset.convert v}
870
842
  begin
871
843
  @sqlstate = "00000"
872
844
  nfields = @protocol.stmt_execute_command @statement_id, values
873
845
  if nfields
874
846
  @fields = @protocol.retr_fields nfields
875
- @result = StatementResult.new @fields, @protocol, @charset
847
+ @result = StatementResult.new @fields, @protocol
876
848
  else
877
849
  @affected_rows, @insert_id, @server_status, @warning_count, @info =
878
850
  @protocol.affected_rows, @protocol.insert_id, @protocol.server_status, @protocol.warning_count, @protocol.message
@@ -895,46 +867,7 @@ class Mysql
895
867
 
896
868
  # @return [Array] current record data
897
869
  def fetch
898
- row = @result.fetch
899
- return row unless @bind_result
900
- row.zip(@bind_result).map do |col, type|
901
- if col.nil?
902
- nil
903
- elsif [Numeric, Integer, Fixnum].include? type
904
- col.to_i
905
- elsif type == String
906
- col.to_s
907
- elsif type == Float && !col.is_a?(Float)
908
- col.to_i.to_f
909
- elsif type == Mysql::Time && !col.is_a?(Mysql::Time)
910
- if col.to_s =~ /\A\d+\z/
911
- i = col.to_s.to_i
912
- if i < 100000000
913
- y = i/10000
914
- m = i/100%100
915
- d = i%100
916
- h, mm, s = 0
917
- else
918
- y = i/10000000000
919
- m = i/100000000%100
920
- d = i/1000000%100
921
- h = i/10000%100
922
- mm= i/100%100
923
- s = i%100
924
- end
925
- if y < 70
926
- y += 2000
927
- elsif y < 100
928
- y += 1900
929
- end
930
- Mysql::Time.new(y, m, d, h, mm, s)
931
- else
932
- Mysql::Time.new
933
- end
934
- else
935
- col
936
- end
937
- end
870
+ @result.fetch
938
871
  end
939
872
 
940
873
  # Return data of current record as Hash.
@@ -945,20 +878,6 @@ class Mysql
945
878
  @result.fetch_hash with_table
946
879
  end
947
880
 
948
- # Set retrieve type of value
949
- # @param [Numeric / Fixnum / Integer / Float / String / Mysql::Time / nil] args value type
950
- # @return [Mysql::Stmt] self
951
- def bind_result(*args)
952
- if @fields.length != args.length
953
- raise ClientError, "bind_result: result value count(#{@fields.length}) != number of argument(#{args.length})"
954
- end
955
- args.each do |a|
956
- raise TypeError unless [Numeric, Fixnum, Integer, Float, String, Mysql::Time, nil].include? a
957
- end
958
- @bind_result = args
959
- self
960
- end
961
-
962
881
  # Iterate block with record.
963
882
  # @yield [Array] record data
964
883
  # @return [Mysql::Stmt] self
@@ -1027,78 +946,4 @@ class Mysql
1027
946
  Result.new @fields
1028
947
  end
1029
948
  end
1030
-
1031
- # @!visibility public
1032
- # @!attribute [rw] year
1033
- # @return [Integer]
1034
- # @!attribute [rw] month
1035
- # @return [Integer]
1036
- # @!attribute [rw] day
1037
- # @return [Integer]
1038
- # @!attribute [rw] hour
1039
- # @return [Integer]
1040
- # @!attribute [rw] minute
1041
- # @return [Integer]
1042
- # @!attribute [rw] second
1043
- # @return [Integer]
1044
- # @!attribute [rw] neg
1045
- # @return [Boolean] negative flag
1046
- # @!attribute [rw] second_part
1047
- # @return [Integer]
1048
- class Time
1049
- # @param [Integer] year
1050
- # @param [Integer] month
1051
- # @param [Integer] day
1052
- # @param [Integer] hour
1053
- # @param [Integer] minute
1054
- # @param [Integer] second
1055
- # @param [Boolean] neg negative flag
1056
- # @param [Integer] second_part
1057
- def initialize(year=0, month=0, day=0, hour=0, minute=0, second=0, neg=false, second_part=0)
1058
- @date_flag = !(hour && minute && second)
1059
- @year, @month, @day, @hour, @minute, @second, @neg, @second_part =
1060
- year.to_i, month.to_i, day.to_i, hour.to_i, minute.to_i, second.to_i, neg, second_part.to_i
1061
- end
1062
- attr_accessor :year, :month, :day, :hour, :minute, :second, :neg, :second_part
1063
- alias mon month
1064
- alias min minute
1065
- alias sec second
1066
-
1067
- # @private
1068
- def ==(other)
1069
- other.is_a?(Mysql::Time) &&
1070
- @year == other.year && @month == other.month && @day == other.day &&
1071
- @hour == other.hour && @minute == other.minute && @second == other.second &&
1072
- @neg == neg && @second_part == other.second_part
1073
- end
1074
-
1075
- # @private
1076
- def eql?(other)
1077
- self == other
1078
- end
1079
-
1080
- # @return [String] "yyyy-mm-dd HH:MM:SS"
1081
- def to_s
1082
- if @date_flag
1083
- sprintf "%04d-%02d-%02d", year, mon, day
1084
- elsif year == 0 and mon == 0 and day == 0
1085
- h = neg ? hour * -1 : hour
1086
- sprintf "%02d:%02d:%02d", h, min, sec
1087
- else
1088
- sprintf "%04d-%02d-%02d %02d:%02d:%02d", year, mon, day, hour, min, sec
1089
- end
1090
- end
1091
-
1092
- # @return [Integer] yyyymmddHHMMSS
1093
- def to_i
1094
- sprintf("%04d%02d%02d%02d%02d%02d", year, mon, day, hour, min, sec).to_i
1095
- end
1096
-
1097
- # @private
1098
- def inspect
1099
- sprintf "#<#{self.class.name}:%04d-%02d-%02d %02d:%02d:%02d>", year, mon, day, hour, min, sec
1100
- end
1101
-
1102
- end
1103
-
1104
949
  end