ruby-mysql 3.0.1 → 4.0.0

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.
data/lib/mysql.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # coding: ascii-8bit
2
+
2
3
  # Copyright (C) 2008 TOMITA Masahiro
3
4
  # mailto:tommy@tmtm.org
4
5
 
@@ -12,15 +13,17 @@ require 'uri'
12
13
  # p c1, c2
13
14
  # end
14
15
  class Mysql
15
-
16
+ require_relative "mysql/field"
17
+ require_relative "mysql/result"
18
+ require_relative "mysql/stmt"
16
19
  require_relative "mysql/constants"
17
20
  require_relative "mysql/error"
18
21
  require_relative "mysql/charset"
19
22
  require_relative "mysql/protocol"
20
- require_relative "mysql/packet.rb"
23
+ require_relative "mysql/packet"
21
24
 
22
- VERSION = '3.0.1' # Version number of this library
23
- MYSQL_UNIX_PORT = "/tmp/mysql.sock" # UNIX domain socket filename
25
+ VERSION = -'4.0.0' # Version number of this library
26
+ MYSQL_UNIX_PORT = -"/tmp/mysql.sock" # UNIX domain socket filename
24
27
  MYSQL_TCP_PORT = 3306 # TCP socket port number
25
28
 
26
29
  # @!attribute [rw] host
@@ -51,8 +54,22 @@ class Mysql
51
54
  # @return [String, nil]
52
55
  # @!attribute [rw] ssl_mode
53
56
  # @return [String, Integer] 1 or "disabled" / 2 or "preferred" / 3 or "required"
57
+ # @!attribute [rw] ssl_context_params
58
+ # @return [Hash] See OpenSSL::SSL::Context#set_params
54
59
  # @!attribute [rw] get_server_public_key
55
60
  # @return [Boolean]
61
+ # @!attribute [rw] connect_attrs
62
+ # @return [Hash]
63
+ # @!attribute [rw] yield_null_result
64
+ # @return [Boolean]
65
+ # @!attribute [rw] return_result
66
+ # @return [Boolean]
67
+ # @!attribute [rw] with_table
68
+ # @return [Boolean]
69
+ # @!attribute [rw] auto_store_result
70
+ # @return [Boolean]
71
+ # @!attribute [rw] cast
72
+ # @return [Boolean]
56
73
  DEFAULT_OPTS = {
57
74
  host: nil,
58
75
  username: nil,
@@ -69,12 +86,25 @@ class Mysql
69
86
  local_infile: nil,
70
87
  load_data_local_dir: nil,
71
88
  ssl_mode: SSL_MODE_PREFERRED,
89
+ ssl_context_params: {},
72
90
  get_server_public_key: false,
91
+ connect_attrs: {},
92
+ yield_null_result: true,
93
+ return_result: true,
94
+ with_table: false,
95
+ auto_store_result: true,
96
+ cast: true,
73
97
  }.freeze
74
98
 
75
99
  # @private
76
100
  attr_reader :protocol
77
101
 
102
+ # @return [Array<Mysql::Field>] fields of result set
103
+ attr_reader :fields
104
+
105
+ # @return [Mysql::Result]
106
+ attr_reader :result
107
+
78
108
  class << self
79
109
  # Make Mysql object and connect to mysqld.
80
110
  # parameter is same as arguments for {#initialize}.
@@ -87,7 +117,7 @@ class Mysql
87
117
  # @param [String] str
88
118
  # @return [String]
89
119
  def escape_string(str)
90
- str.gsub(/[\0\n\r\\\'\"\x1a]/) do |s|
120
+ str.gsub(/[\0\n\r\\'"\x1a]/) do |s|
91
121
  case s
92
122
  when "\0" then "\\0"
93
123
  when "\n" then "\\n"
@@ -98,6 +128,10 @@ class Mysql
98
128
  end
99
129
  end
100
130
  alias quote escape_string
131
+
132
+ def default_options
133
+ @default_options ||= DEFAULT_OPTS.dup
134
+ end
101
135
  end
102
136
 
103
137
  # @overload initialize(uri, **opts)
@@ -135,15 +169,17 @@ class Mysql
135
169
  # @option opts :local_infile [Boolean]
136
170
  # @option opts :load_data_local_dir [String]
137
171
  # @option opts :ssl_mode [Integer]
172
+ # @option opts :ssl_context_params [Hash<Symbol, String>]
138
173
  # @option opts :get_server_public_key [Boolean]
174
+ # @option opts :connect_attrs [Hash]
139
175
  def initialize(*args, **opts)
140
176
  @fields = nil
177
+ @result = nil
141
178
  @protocol = nil
142
179
  @sqlstate = "00000"
143
180
  @host_info = nil
144
181
  @last_error = nil
145
- @result_exist = false
146
- @opts = DEFAULT_OPTS.dup
182
+ @opts = Mysql.default_options.dup
147
183
  parse_args(args, opts)
148
184
  end
149
185
 
@@ -164,23 +200,23 @@ class Mysql
164
200
  end
165
201
 
166
202
  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
203
+ unless args.empty?
204
+ case args[0]
205
+ when URI
206
+ uri = args[0]
207
+ when /\Amysql:\/\//
208
+ uri = URI.parse(args[0])
209
+ when String, nil
210
+ @opts[:host], user, passwd, dbname, port, socket, flags = *args
211
+ @opts[:username] = user if user
212
+ @opts[:password] = passwd if passwd
213
+ @opts[:database] = dbname if dbname
214
+ @opts[:port] = port if port
215
+ @opts[:socket] = socket if socket
216
+ @opts[:flags] = flags if flags
217
+ when Hash
218
+ # skip
219
+ end
184
220
  end
185
221
  if uri
186
222
  host = uri.hostname.to_s
@@ -252,7 +288,6 @@ class Mysql
252
288
  query "SET NAMES #{charset.name}"
253
289
  end
254
290
  @opts[:charset] = charset
255
- cs
256
291
  end
257
292
 
258
293
  # @return [String] charset name
@@ -267,7 +302,7 @@ class Mysql
267
302
 
268
303
  # @return [String] last error message
269
304
  def error
270
- @last_error && @last_error.error
305
+ @last_error&.error
271
306
  end
272
307
 
273
308
  # @return [String] sqlstate for last error
@@ -293,13 +328,12 @@ class Mysql
293
328
 
294
329
  # @return [Integer] server version
295
330
  def server_version
296
- check_connection
297
- @protocol.server_version
331
+ @protocol&.server_version
298
332
  end
299
333
 
300
334
  # @return [String] information for last query
301
335
  def info
302
- @protocol && @protocol.message
336
+ @protocol&.message
303
337
  end
304
338
 
305
339
  # @return [Integer] number of affected records by insert/update/delete.
@@ -327,34 +361,33 @@ class Mysql
327
361
  end
328
362
 
329
363
  # Execute query string.
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]
364
+ # @param str [String] Query.
365
+ # @param return_result [Boolean]
366
+ # @param yield_null_result [Boolean]
367
+ # @return [Mysql::Result] if return_result is true and the query returns result set.
368
+ # @return [nil] if return_result is true and the query does not return result set.
369
+ # @return [self] if return_result is false or block is specified.
338
370
  # @example
339
371
  # my.query("select 1,NULL,'abc'").fetch # => [1, nil, "abc"]
340
372
  # my.query("select 1,NULL,'abc'"){|res| res.fetch}
341
- def query(str, &block)
373
+ def query(str, **opts, &block)
374
+ opts = @opts.merge(opts)
342
375
  check_connection
343
376
  @fields = nil
344
377
  begin
345
- nfields = @protocol.query_command str
346
- if nfields
347
- @fields = @protocol.retr_fields nfields
348
- @result_exist = true
349
- end
378
+ @protocol.query_command str
350
379
  if block
351
380
  while true
352
- block.call store_result if @fields
353
- break unless next_result
381
+ @protocol.get_result
382
+ res = store_result(**opts)
383
+ block.call res if res || opts[:yield_null_result]
384
+ break unless more_results?
354
385
  end
355
386
  return self
356
387
  end
357
- return @fields ? store_result : nil
388
+ @protocol.get_result
389
+ return self unless opts[:return_result]
390
+ return store_result(**opts)
358
391
  rescue ServerError => e
359
392
  @last_error = e
360
393
  @sqlstate = e.sqlstate
@@ -364,12 +397,12 @@ class Mysql
364
397
 
365
398
  # Get all data for last query.
366
399
  # @return [Mysql::Result]
367
- def store_result
368
- check_connection
369
- raise ClientError, 'invalid usage' unless @result_exist
370
- res = Result.new @fields, @protocol
371
- @result_exist = false
372
- res
400
+ # @return [nil] if no results
401
+ def store_result(**opts)
402
+ return nil if @protocol.field_count.nil? || @protocol.field_count == 0
403
+ @fields = @protocol.retr_fields
404
+ opts = @opts.merge(opts)
405
+ @result = Result.new(@fields, @protocol, **opts)
373
406
  end
374
407
 
375
408
  # @return [Integer] Thread ID
@@ -388,30 +421,29 @@ class Mysql
388
421
  end
389
422
 
390
423
  # @return [Boolean] true if multiple queries are specified and unexecuted queries exists.
391
- def more_results
392
- @protocol.server_status & SERVER_MORE_RESULTS_EXISTS != 0
424
+ def more_results?
425
+ @protocol.more_results?
393
426
  end
394
- alias more_results? more_results
395
427
 
396
428
  # execute next query if multiple queries are specified.
397
- # @return [Boolean] true if next query exists.
398
- def next_result
399
- return false unless more_results
400
- check_connection
429
+ # @return [Mysql::Result] result set of query if return_result is true.
430
+ # @return [true] if return_result is false and result exists.
431
+ # @return [nil] query returns no results.
432
+ def next_result(**opts)
433
+ return nil unless more_results?
434
+ opts = @opts.merge(opts)
435
+ @protocol.get_result
401
436
  @fields = nil
402
- nfields = @protocol.get_result
403
- if nfields
404
- @fields = @protocol.retr_fields nfields
405
- @result_exist = true
406
- end
407
- return true
437
+ return store_result(**opts) if opts[:return_result]
438
+ true
408
439
  end
409
440
 
410
441
  # Parse prepared-statement.
411
442
  # @param [String] str query string
412
443
  # @return [Mysql::Stmt] Prepared-statement object
413
- def prepare(str)
414
- st = Stmt.new @protocol
444
+ def prepare(str, **opts)
445
+ opts = @opts.merge(opts)
446
+ st = Stmt.new(@protocol, **opts)
415
447
  st.prepare str
416
448
  st
417
449
  end
@@ -419,8 +451,9 @@ class Mysql
419
451
  # @private
420
452
  # Make empty prepared-statement object.
421
453
  # @return [Mysql::Stmt] If block is not specified.
422
- def stmt
423
- Stmt.new @protocol
454
+ def stmt(**opts)
455
+ opts = @opts.merge(opts)
456
+ Stmt.new(@protocol, **opts)
424
457
  end
425
458
 
426
459
  # Check whether the connection is available.
@@ -488,462 +521,15 @@ class Mysql
488
521
  self
489
522
  end
490
523
 
491
- private
492
-
493
- def check_connection
494
- raise ClientError::ServerGoneError, 'MySQL server has gone away' unless @protocol
495
- end
496
-
497
- # @!visibility public
498
- # Field class
499
- class Field
500
- # @return [String] database name
501
- attr_reader :db
502
- # @return [String] table name
503
- attr_reader :table
504
- # @return [String] original table name
505
- attr_reader :org_table
506
- # @return [String] field name
507
- attr_reader :name
508
- # @return [String] original field name
509
- attr_reader :org_name
510
- # @return [Integer] charset id number
511
- attr_reader :charsetnr
512
- # @return [Integer] field length
513
- attr_reader :length
514
- # @return [Integer] field type
515
- attr_reader :type
516
- # @return [Integer] flag
517
- attr_reader :flags
518
- # @return [Integer] number of decimals
519
- attr_reader :decimals
520
- # @return [String] defualt value
521
- attr_reader :default
522
- alias :def :default
523
-
524
- # @private
525
- attr_accessor :result
526
-
527
- # @attr [Protocol::FieldPacket] packet
528
- def initialize(packet)
529
- @db, @table, @org_table, @name, @org_name, @charsetnr, @length, @type, @flags, @decimals, @default =
530
- packet.db, packet.table, packet.org_table, packet.name, packet.org_name, packet.charsetnr, packet.length, packet.type, packet.flags, packet.decimals, packet.default
531
- @flags |= NUM_FLAG if is_num_type?
532
- @max_length = nil
533
- end
534
-
535
- # @return [Hash] field information
536
- def to_hash
537
- {
538
- "name" => @name,
539
- "table" => @table,
540
- "def" => @default,
541
- "type" => @type,
542
- "length" => @length,
543
- "max_length" => max_length,
544
- "flags" => @flags,
545
- "decimals" => @decimals
546
- }
547
- end
548
-
549
- # @private
550
- def inspect
551
- "#<Mysql::Field:#{@name}>"
552
- end
553
-
554
- # @return [Boolean] true if numeric field.
555
- def is_num?
556
- @flags & NUM_FLAG != 0
557
- end
558
-
559
- # @return [Boolean] true if not null field.
560
- def is_not_null?
561
- @flags & NOT_NULL_FLAG != 0
562
- end
563
-
564
- # @return [Boolean] true if primary key field.
565
- def is_pri_key?
566
- @flags & PRI_KEY_FLAG != 0
567
- end
568
-
569
- # @return [Integer] maximum width of the field for the result set
570
- def max_length
571
- return @max_length if @max_length
572
- @max_length = 0
573
- @result.calculate_field_max_length if @result
574
- @max_length
575
- end
576
-
577
- attr_writer :max_length
578
-
579
- private
580
-
581
- def is_num_type?
582
- [TYPE_DECIMAL, TYPE_TINY, TYPE_SHORT, TYPE_LONG, TYPE_FLOAT, TYPE_DOUBLE, TYPE_LONGLONG, TYPE_INT24].include?(@type) || (@type == TYPE_TIMESTAMP && (@length == 14 || @length == 8))
583
- end
584
-
585
- end
586
-
587
- # @!visibility public
588
- # Result set
589
- class ResultBase
590
- include Enumerable
591
-
592
- # @return [Array<Mysql::Field>] field list
593
- attr_reader :fields
594
-
595
- # @param [Array of Mysql::Field] fields
596
- def initialize(fields)
597
- @fields = fields
598
- @field_index = 0 # index of field
599
- @records = [] # all records
600
- @index = 0 # index of record
601
- @fieldname_with_table = nil
602
- @fetched_record = nil
603
- end
604
-
605
- # ignore
606
- # @return [void]
607
- def free
608
- end
609
-
610
- # @return [Integer] number of record
611
- def size
612
- @records.size
613
- end
614
- alias num_rows size
615
-
616
- # @return [Array] current record data
617
- def fetch
618
- @fetched_record = nil
619
- return nil if @index >= @records.size
620
- @records[@index] = @records[@index].to_a unless @records[@index].is_a? Array
621
- @fetched_record = @records[@index]
622
- @index += 1
623
- return @fetched_record
624
- end
625
- alias fetch_row fetch
626
-
627
- # Return data of current record as Hash.
628
- # The hash key is field name.
629
- # @param [Boolean] with_table if true, hash key is "table_name.field_name".
630
- # @return [Hash] current record data
631
- def fetch_hash(with_table=nil)
632
- row = fetch
633
- return nil unless row
634
- if with_table and @fieldname_with_table.nil?
635
- @fieldname_with_table = @fields.map{|f| [f.table, f.name].join(".")}
636
- end
637
- ret = {}
638
- @fields.each_index do |i|
639
- fname = with_table ? @fieldname_with_table[i] : @fields[i].name
640
- ret[fname] = row[i]
641
- end
642
- ret
643
- end
644
-
645
- # Iterate block with record.
646
- # @yield [Array] record data
647
- # @return [self] self. If block is not specified, this returns Enumerator.
648
- def each(&block)
649
- return enum_for(:each) unless block
650
- while rec = fetch
651
- block.call rec
652
- end
653
- self
654
- end
655
-
656
- # Iterate block with record as Hash.
657
- # @param [Boolean] with_table if true, hash key is "table_name.field_name".
658
- # @yield [Hash] record data
659
- # @return [self] self. If block is not specified, this returns Enumerator.
660
- def each_hash(with_table=nil, &block)
661
- return enum_for(:each_hash, with_table) unless block
662
- while rec = fetch_hash(with_table)
663
- block.call rec
664
- end
665
- self
666
- end
667
-
668
- # Set record position
669
- # @param [Integer] n record index
670
- # @return [self] self
671
- def data_seek(n)
672
- @index = n
673
- self
674
- end
675
-
676
- # @return [Integer] current record position
677
- def row_tell
678
- @index
679
- end
680
-
681
- # Set current position of record
682
- # @param [Integer] n record index
683
- # @return [Integer] previous position
684
- def row_seek(n)
685
- ret = @index
686
- @index = n
687
- ret
688
- end
689
- end
690
-
691
- # @!visibility public
692
- # Result set for simple query
693
- class Result < ResultBase
694
- # @private
695
- # @param [Array<Mysql::Field>] fields
696
- # @param [Mysql::Protocol] protocol
697
- def initialize(fields, protocol=nil)
698
- super fields
699
- return unless protocol
700
- @records = protocol.retr_all_records fields
701
- fields.each{|f| f.result = self} # for calculating max_field
702
- end
703
-
704
- # @private
705
- # calculate max_length of all fields
706
- def calculate_field_max_length
707
- max_length = Array.new(@fields.size, 0)
708
- @records.each_with_index do |rec, i|
709
- rec = @records[i] = rec.to_a if rec.is_a? RawRecord
710
- max_length.each_index do |j|
711
- max_length[j] = rec[j].length if rec[j] && rec[j].length > max_length[j]
712
- end
713
- end
714
- max_length.each_with_index do |len, i|
715
- @fields[i].max_length = len
716
- end
717
- end
718
-
719
- # @return [Mysql::Field] current field
720
- def fetch_field
721
- return nil if @field_index >= @fields.length
722
- ret = @fields[@field_index]
723
- @field_index += 1
724
- ret
725
- end
726
-
727
- # @return [Integer] current field position
728
- def field_tell
729
- @field_index
730
- end
731
-
732
- # Set field position
733
- # @param [Integer] n field index
734
- # @return [Integer] previous position
735
- def field_seek(n)
736
- ret = @field_index
737
- @field_index = n
738
- ret
739
- end
740
-
741
- # Return specified field
742
- # @param [Integer] n field index
743
- # @return [Mysql::Field] field
744
- def fetch_field_direct(n)
745
- raise ClientError, "invalid argument: #{n}" if n < 0 or n >= @fields.length
746
- @fields[n]
747
- end
748
-
749
- # @return [Array<Mysql::Field>] all fields
750
- def fetch_fields
751
- @fields
752
- end
753
-
754
- # @return [Array<Integer>] length of each fields
755
- def fetch_lengths
756
- return nil unless @fetched_record
757
- @fetched_record.map{|c|c.nil? ? 0 : c.length}
758
- end
759
-
760
- # @return [Integer] number of fields
761
- def num_fields
762
- @fields.size
763
- end
764
- end
765
-
766
- # @!visibility private
767
- # Result set for prepared statement
768
- class StatementResult < ResultBase
769
- # @private
770
- # @param [Array<Mysql::Field>] fields
771
- # @param [Mysql::Protocol] protocol
772
- def initialize(fields, protocol)
773
- super fields
774
- @records = protocol.stmt_retr_all_records @fields, protocol.charset
775
- end
524
+ # session track
525
+ # @return [Hash]
526
+ def session_track
527
+ @protocol.session_track
776
528
  end
777
529
 
778
- # @!visibility public
779
- # Prepared statement
780
- # @!attribute [r] affected_rows
781
- # @return [Integer]
782
- # @!attribute [r] insert_id
783
- # @return [Integer]
784
- # @!attribute [r] server_status
785
- # @return [Integer]
786
- # @!attribute [r] warning_count
787
- # @return [Integer]
788
- # @!attribute [r] param_count
789
- # @return [Integer]
790
- # @!attribute [r] fields
791
- # @return [Array<Mysql::Field>]
792
- # @!attribute [r] sqlstate
793
- # @return [String]
794
- class Stmt
795
- include Enumerable
796
-
797
- attr_reader :affected_rows, :insert_id, :server_status, :warning_count
798
- attr_reader :param_count, :fields, :sqlstate
799
-
800
- # @private
801
- def self.finalizer(protocol, statement_id)
802
- proc do
803
- protocol.gc_stmt statement_id
804
- end
805
- end
806
-
807
- # @private
808
- # @param [Mysql::Protocol] protocol
809
- def initialize(protocol)
810
- @protocol = protocol
811
- @statement_id = nil
812
- @affected_rows = @insert_id = @server_status = @warning_count = 0
813
- @sqlstate = "00000"
814
- @param_count = nil
815
- end
816
-
817
- # @private
818
- # parse prepared-statement and return {Mysql::Stmt} object
819
- # @param [String] str query string
820
- # @return self
821
- def prepare(str)
822
- close
823
- begin
824
- @sqlstate = "00000"
825
- @statement_id, @param_count, @fields = @protocol.stmt_prepare_command(str)
826
- rescue ServerError => e
827
- @last_error = e
828
- @sqlstate = e.sqlstate
829
- raise
830
- end
831
- ObjectSpace.define_finalizer(self, self.class.finalizer(@protocol, @statement_id))
832
- self
833
- end
834
-
835
- # Execute prepared statement.
836
- # @param [Object] values values passed to query
837
- # @return [Mysql::Stmt] self
838
- def execute(*values)
839
- raise ClientError, "not prepared" unless @param_count
840
- raise ClientError, "parameter count mismatch" if values.length != @param_count
841
- values = values.map{|v| @protocol.charset.convert v}
842
- begin
843
- @sqlstate = "00000"
844
- nfields = @protocol.stmt_execute_command @statement_id, values
845
- if nfields
846
- @fields = @protocol.retr_fields nfields
847
- @result = StatementResult.new @fields, @protocol
848
- else
849
- @affected_rows, @insert_id, @server_status, @warning_count, @info =
850
- @protocol.affected_rows, @protocol.insert_id, @protocol.server_status, @protocol.warning_count, @protocol.message
851
- end
852
- return self
853
- rescue ServerError => e
854
- @last_error = e
855
- @sqlstate = e.sqlstate
856
- raise
857
- end
858
- end
859
-
860
- # Close prepared statement
861
- # @return [void]
862
- def close
863
- ObjectSpace.undefine_finalizer(self)
864
- @protocol.stmt_close_command @statement_id if @statement_id
865
- @statement_id = nil
866
- end
867
-
868
- # @return [Array] current record data
869
- def fetch
870
- @result.fetch
871
- end
872
-
873
- # Return data of current record as Hash.
874
- # The hash key is field name.
875
- # @param [Boolean] with_table if true, hash key is "table_name.field_name".
876
- # @return [Hash] record data
877
- def fetch_hash(with_table=nil)
878
- @result.fetch_hash with_table
879
- end
880
-
881
- # Iterate block with record.
882
- # @yield [Array] record data
883
- # @return [Mysql::Stmt] self
884
- # @return [Enumerator] If block is not specified
885
- def each(&block)
886
- return enum_for(:each) unless block
887
- while rec = fetch
888
- block.call rec
889
- end
890
- self
891
- end
892
-
893
- # Iterate block with record as Hash.
894
- # @param [Boolean] with_table if true, hash key is "table_name.field_name".
895
- # @yield [Hash] record data
896
- # @return [Mysql::Stmt] self
897
- # @return [Enumerator] If block is not specified
898
- def each_hash(with_table=nil, &block)
899
- return enum_for(:each_hash, with_table) unless block
900
- while rec = fetch_hash(with_table)
901
- block.call rec
902
- end
903
- self
904
- end
905
-
906
- # @return [Integer] number of record
907
- def size
908
- @result.size
909
- end
910
- alias num_rows size
911
-
912
- # Set record position
913
- # @param [Integer] n record index
914
- # @return [void]
915
- def data_seek(n)
916
- @result.data_seek(n)
917
- end
918
-
919
- # @return [Integer] current record position
920
- def row_tell
921
- @result.row_tell
922
- end
923
-
924
- # Set current position of record
925
- # @param [Integer] n record index
926
- # @return [Integer] previous position
927
- def row_seek(n)
928
- @result.row_seek(n)
929
- end
930
-
931
- # @return [Integer] number of columns for last query
932
- def field_count
933
- @fields.length
934
- end
935
-
936
- # ignore
937
- # @return [void]
938
- def free_result
939
- end
530
+ private
940
531
 
941
- # Returns Mysql::Result object that is empty.
942
- # Use fetch_fields to get list of fields.
943
- # @return [Mysql::Result]
944
- def result_metadata
945
- return nil if @fields.empty?
946
- Result.new @fields
947
- end
532
+ def check_connection
533
+ raise ClientError, 'MySQL client is not connected' unless @protocol
948
534
  end
949
535
  end