rsql 0.1.9 → 0.2.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.
@@ -1,1127 +0,0 @@
1
- module RSQL
2
- # $Id: mysql.rb,v 1.24 2005/02/12 11:37:15 tommy Exp $
3
- #
4
- # Copyright (C) 2003-2005 TOMITA Masahiro
5
- # tommy@tmtm.org
6
- #
7
-
8
- class Mysql
9
-
10
- VERSION = "4.0-ruby-0.2.5"
11
-
12
- require "socket"
13
-
14
- MAX_PACKET_LENGTH = 256*256*256-1
15
- MAX_ALLOWED_PACKET = 1024*1024*1024
16
-
17
- MYSQL_UNIX_ADDR = "/tmp/mysql.sock"
18
- MYSQL_PORT = 3306
19
- PROTOCOL_VERSION = 10
20
-
21
- # Command
22
- COM_SLEEP = 0
23
- COM_QUIT = 1
24
- COM_INIT_DB = 2
25
- COM_QUERY = 3
26
- COM_FIELD_LIST = 4
27
- COM_CREATE_DB = 5
28
- COM_DROP_DB = 6
29
- COM_REFRESH = 7
30
- COM_SHUTDOWN = 8
31
- COM_STATISTICS = 9
32
- COM_PROCESS_INFO = 10
33
- COM_CONNECT = 11
34
- COM_PROCESS_KILL = 12
35
- COM_DEBUG = 13
36
- COM_PING = 14
37
- COM_TIME = 15
38
- COM_DELAYED_INSERT = 16
39
- COM_CHANGE_USER = 17
40
- COM_BINLOG_DUMP = 18
41
- COM_TABLE_DUMP = 19
42
- COM_CONNECT_OUT = 20
43
- COM_REGISTER_SLAVE = 21
44
-
45
- # Client flag
46
- CLIENT_LONG_PASSWORD = 1
47
- CLIENT_FOUND_ROWS = 1 << 1
48
- CLIENT_LONG_FLAG = 1 << 2
49
- CLIENT_CONNECT_WITH_DB= 1 << 3
50
- CLIENT_NO_SCHEMA = 1 << 4
51
- CLIENT_COMPRESS = 1 << 5
52
- CLIENT_ODBC = 1 << 6
53
- CLIENT_LOCAL_FILES = 1 << 7
54
- CLIENT_IGNORE_SPACE = 1 << 8
55
- CLIENT_INTERACTIVE = 1 << 10
56
- CLIENT_SSL = 1 << 11
57
- CLIENT_IGNORE_SIGPIPE = 1 << 12
58
- CLIENT_TRANSACTIONS = 1 << 13
59
- CLIENT_CAPABILITIES = CLIENT_LONG_PASSWORD|CLIENT_LONG_FLAG|CLIENT_TRANSACTIONS
60
-
61
- # Connection Option
62
- OPT_CONNECT_TIMEOUT = 0
63
- OPT_COMPRESS = 1
64
- OPT_NAMED_PIPE = 2
65
- INIT_COMMAND = 3
66
- READ_DEFAULT_FILE = 4
67
- READ_DEFAULT_GROUP = 5
68
- SET_CHARSET_DIR = 6
69
- SET_CHARSET_NAME = 7
70
- OPT_LOCAL_INFILE = 8
71
-
72
- # Server Status
73
- SERVER_STATUS_IN_TRANS = 1
74
- SERVER_STATUS_AUTOCOMMIT = 2
75
-
76
- # Refresh parameter
77
- REFRESH_GRANT = 1
78
- REFRESH_LOG = 2
79
- REFRESH_TABLES = 4
80
- REFRESH_HOSTS = 8
81
- REFRESH_STATUS = 16
82
- REFRESH_THREADS = 32
83
- REFRESH_SLAVE = 64
84
- REFRESH_MASTER = 128
85
-
86
- def initialize(*args)
87
- @client_flag = 0
88
- @max_allowed_packet = MAX_ALLOWED_PACKET
89
- @query_with_result = true
90
- @status = :STATUS_READY
91
- if args[0] != :INIT then
92
- real_connect(*args)
93
- end
94
- end
95
-
96
- def real_connect(host=nil, user=nil, passwd=nil, db=nil, port=nil, socket=nil, flag=nil)
97
- @server_status = SERVER_STATUS_AUTOCOMMIT
98
- if (host == nil or host == "localhost") and defined? UNIXSocket then
99
- unix_socket = socket || ENV["MYSQL_UNIX_PORT"] || MYSQL_UNIX_ADDR
100
- sock = UNIXSocket::new(unix_socket)
101
- @host_info = Error::err(Error::CR_LOCALHOST_CONNECTION)
102
- @unix_socket = unix_socket
103
- else
104
- sock = TCPSocket::new(host, port||ENV["MYSQL_TCP_PORT"]||(Socket::getservbyname("mysql","tcp") rescue MYSQL_PORT))
105
- @host_info = sprintf Error::err(Error::CR_TCP_CONNECTION), host
106
- end
107
- @host = host ? host.dup : nil
108
- sock.setsockopt Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true
109
- @net = Net::new sock
110
-
111
- a = read
112
- @protocol_version = a.slice!(0)
113
- @server_version, a = a.split(/\0/,2)
114
- @thread_id, @scramble_buff = a.slice!(0,13).unpack("La8")
115
- if a.size >= 2 then
116
- @server_capabilities, = a.slice!(0,2).unpack("v")
117
- end
118
- if a.size >= 16 then
119
- @server_language, @server_status = a.unpack("cv")
120
- end
121
-
122
- flag = 0 if flag == nil
123
- flag |= @client_flag | CLIENT_CAPABILITIES
124
- flag |= CLIENT_CONNECT_WITH_DB if db
125
- data = Net::int2str(flag)+Net::int3str(@max_allowed_packet)+(user||"")+"\0"+scramble(passwd, @scramble_buff, @protocol_version==9)
126
- if db and @server_capabilities & CLIENT_CONNECT_WITH_DB != 0 then
127
- data << "\0"+db
128
- @db = db.dup
129
- end
130
- write data
131
- read
132
- ObjectSpace.define_finalizer(self, Mysql.finalizer(@net))
133
- self
134
- end
135
- alias :connect :real_connect
136
-
137
- def escape_string(str)
138
- Mysql::escape_string str
139
- end
140
- alias :quote :escape_string
141
-
142
- def get_client_info()
143
- VERSION
144
- end
145
- alias :client_info :get_client_info
146
-
147
- def options(option, arg=nil)
148
- if option == OPT_LOCAL_INFILE then
149
- if arg == false or arg == 0 then
150
- @client_flag &= ~CLIENT_LOCAL_FILES
151
- else
152
- @client_flag |= CLIENT_LOCAL_FILES
153
- end
154
- else
155
- raise "not implemented"
156
- end
157
- end
158
-
159
- def real_query(query)
160
- command COM_QUERY, query, true
161
- read_query_result
162
- self
163
- end
164
-
165
- def use_result()
166
- if @status != :STATUS_GET_RESULT then
167
- error Error::CR_COMMANDS_OUT_OF_SYNC
168
- end
169
- res = Result::new self, @fields, @field_count
170
- @status = :STATUS_USE_RESULT
171
- res
172
- end
173
-
174
- def store_result()
175
- if @status != :STATUS_GET_RESULT then
176
- error Error::CR_COMMANDS_OUT_OF_SYNC
177
- end
178
- @status = :STATUS_READY
179
- data = read_rows @field_count
180
- res = Result::new self, @fields, @field_count, data
181
- @fields = nil
182
- @affected_rows = data.length
183
- res
184
- end
185
-
186
- def change_user(user="", passwd="", db="")
187
- data = user+"\0"+scramble(passwd, @scramble_buff, @protocol_version==9)+"\0"+db
188
- command COM_CHANGE_USER, data
189
- @user = user
190
- @passwd = passwd
191
- @db = db
192
- end
193
-
194
- def character_set_name()
195
- raise "not implemented"
196
- end
197
-
198
- def close()
199
- @status = :STATUS_READY
200
- command COM_QUIT, nil, true
201
- @net.close
202
- self
203
- end
204
-
205
- def create_db(db)
206
- command COM_CREATE_DB, db
207
- self
208
- end
209
-
210
- def drop_db(db)
211
- command COM_DROP_DB, db
212
- self
213
- end
214
-
215
- def dump_debug_info()
216
- command COM_DEBUG
217
- self
218
- end
219
-
220
- def get_host_info()
221
- @host_info
222
- end
223
- alias :host_info :get_host_info
224
-
225
- def get_proto_info()
226
- @protocol_version
227
- end
228
- alias :proto_info :get_proto_info
229
-
230
- def get_server_info()
231
- @server_version
232
- end
233
- alias :server_info :get_server_info
234
-
235
- def kill(id)
236
- command COM_PROCESS_KILL, Net::int4str(id)
237
- self
238
- end
239
-
240
- def list_dbs(db=nil)
241
- real_query "show databases #{db}"
242
- @status = :STATUS_READY
243
- read_rows(1).flatten
244
- end
245
-
246
- def list_fields(table, field=nil)
247
- command COM_FIELD_LIST, "#{table}\0#{field}", true
248
- f = read_rows 6
249
- fields = unpack_fields(f, @server_capabilities & CLIENT_LONG_FLAG != 0)
250
- res = Result::new self, fields, f.length
251
- res.eof = true
252
- res
253
- end
254
-
255
- def list_processes()
256
- data = command COM_PROCESS_INFO
257
- @field_count = get_length data
258
- fields = read_rows 5
259
- @fields = unpack_fields(fields, @server_capabilities & CLIENT_LONG_FLAG != 0)
260
- @status = :STATUS_GET_RESULT
261
- store_result
262
- end
263
-
264
- def list_tables(table=nil)
265
- real_query "show tables #{table}"
266
- @status = :STATUS_READY
267
- read_rows(1).flatten
268
- end
269
-
270
- def ping()
271
- command COM_PING
272
- self
273
- end
274
-
275
- def query(query)
276
- real_query query
277
- if not @query_with_result then
278
- return self
279
- end
280
- if @field_count == 0 then
281
- return nil
282
- end
283
- store_result
284
- end
285
-
286
- def refresh(r)
287
- command COM_REFRESH, r.chr
288
- self
289
- end
290
-
291
- def reload()
292
- refresh REFRESH_GRANT
293
- self
294
- end
295
-
296
- def select_db(db)
297
- command COM_INIT_DB, db
298
- @db = db
299
- self
300
- end
301
-
302
- def shutdown()
303
- command COM_SHUTDOWN
304
- self
305
- end
306
-
307
- def stat()
308
- command COM_STATISTICS
309
- end
310
-
311
- attr_reader :info, :insert_id, :affected_rows, :field_count, :thread_id
312
- attr_accessor :query_with_result, :status
313
-
314
- def read_one_row(field_count)
315
- data = read
316
- return if data[0] == 254 and data.length == 1
317
- rec = []
318
- field_count.times do
319
- len = get_length data
320
- if len == nil then
321
- rec << len
322
- else
323
- rec << data.slice!(0,len)
324
- end
325
- end
326
- rec
327
- end
328
-
329
- def skip_result()
330
- if @status == :STATUS_USE_RESULT then
331
- loop do
332
- data = read
333
- break if data[0] == 254 and data.length == 1
334
- end
335
- @status = :STATUS_READY
336
- end
337
- end
338
-
339
- def inspect()
340
- "#<#{self.class}>"
341
- end
342
-
343
- private
344
-
345
- def read_query_result()
346
- data = read
347
- @field_count = get_length(data)
348
- if @field_count == nil then # LOAD DATA LOCAL INFILE
349
- File::open(data) do |f|
350
- write f.read
351
- end
352
- write "" # mark EOF
353
- data = read
354
- @field_count = get_length(data)
355
- end
356
- if @field_count == 0 then
357
- @affected_rows = get_length(data, true)
358
- @insert_id = get_length(data, true)
359
- if @server_capabilities & CLIENT_TRANSACTIONS != 0 then
360
- a = data.slice!(0,2)
361
- @server_status = a[0]+a[1]*256
362
- end
363
- if data.size > 0 and get_length(data) then
364
- @info = data
365
- end
366
- else
367
- @extra_info = get_length(data, true)
368
- fields = read_rows 5
369
- @fields = unpack_fields(fields, @server_capabilities & CLIENT_LONG_FLAG != 0)
370
- @status = :STATUS_GET_RESULT
371
- end
372
- self
373
- end
374
-
375
- def unpack_fields(data, long_flag_protocol)
376
- ret = []
377
- data.each do |f|
378
- table = org_table = f[0]
379
- name = f[1]
380
- length = f[2][0]+f[2][1]*256+f[2][2]*256*256
381
- type = f[3][0]
382
- if long_flag_protocol then
383
- flags = f[4][0]+f[4][1]*256
384
- decimals = f[4][2]
385
- else
386
- flags = f[4][0]
387
- decimals = f[4][1]
388
- end
389
- def_value = f[5]
390
- max_length = 0
391
- ret << Field::new(table, org_table, name, length, type, flags, decimals, def_value, max_length)
392
- end
393
- ret
394
- end
395
-
396
- def read_rows(field_count)
397
- ret = []
398
- while rec = read_one_row(field_count) do
399
- ret << rec
400
- end
401
- ret
402
- end
403
-
404
- def get_length(data, longlong=nil)
405
- return if data.length == 0
406
- c = data.slice!(0)
407
- case c
408
- when 251
409
- return nil
410
- when 252
411
- a = data.slice!(0,2)
412
- return a[0]+a[1]*256
413
- when 253
414
- a = data.slice!(0,3)
415
- return a[0]+a[1]*256+a[2]*256**2
416
- when 254
417
- a = data.slice!(0,8)
418
- if longlong then
419
- return a[0]+a[1]*256+a[2]*256**2+a[3]*256**3+
420
- a[4]*256**4+a[5]*256**5+a[6]*256**6+a[7]*256**7
421
- else
422
- return a[0]+a[1]*256+a[2]*256**2+a[3]*256**3
423
- end
424
- else
425
- c
426
- end
427
- end
428
-
429
- def command(cmd, arg=nil, skip_check=nil)
430
- unless @net then
431
- error Error::CR_SERVER_GONE_ERROR
432
- end
433
- if @status != :STATUS_READY then
434
- error Error::CR_COMMANDS_OUT_OF_SYNC
435
- end
436
- @net.clear
437
- write cmd.chr+(arg||"")
438
- read unless skip_check
439
- end
440
-
441
- def read()
442
- unless @net then
443
- error Error::CR_SERVER_GONE_ERROR
444
- end
445
- a = @net.read
446
- if a[0] == 255 then
447
- if a.length > 3 then
448
- @errno = a[1]+a[2]*256
449
- @error = a[3 .. -1]
450
- else
451
- @errno = Error::CR_UNKNOWN_ERROR
452
- @error = Error::err @errno
453
- end
454
- raise Error::new(@errno, @error)
455
- end
456
- a
457
- end
458
-
459
- def write(arg)
460
- unless @net then
461
- error Error::CR_SERVER_GONE_ERROR
462
- end
463
- @net.write arg
464
- end
465
-
466
- def hash_password(password)
467
- nr = 1345345333
468
- add = 7
469
- nr2 = 0x12345671
470
- password.each_byte do |i|
471
- next if i == 0x20 or i == 9
472
- nr ^= (((nr & 63) + add) * i) + (nr << 8)
473
- nr2 += (nr2 << 8) ^ nr
474
- add += i
475
- end
476
- [nr & ((1 << 31) - 1), nr2 & ((1 << 31) - 1)]
477
- end
478
-
479
- def scramble(password, message, old_ver)
480
- return "" if password == nil or password == ""
481
- raise "old version password is not implemented" if old_ver
482
- hash_pass = hash_password password
483
- hash_message = hash_password message
484
- rnd = Random::new hash_pass[0] ^ hash_message[0], hash_pass[1] ^ hash_message[1]
485
- to = []
486
- 1.upto(message.length) do
487
- to << ((rnd.rnd*31)+64).floor
488
- end
489
- extra = (rnd.rnd*31).floor
490
- to.map! do |t| (t ^ extra).chr end
491
- to.join
492
- end
493
-
494
- def error(errno)
495
- @errno = errno
496
- @error = Error::err errno
497
- raise Error::new(@errno, @error)
498
- end
499
-
500
- class Result
501
- def initialize(mysql, fields, field_count, data=nil)
502
- @handle = mysql
503
- @fields = fields
504
- @field_count = field_count
505
- @data = data
506
- @current_field = 0
507
- @current_row = 0
508
- @eof = false
509
- @row_count = 0
510
- end
511
- attr_accessor :eof
512
-
513
- def data_seek(n)
514
- @current_row = n
515
- end
516
-
517
- def fetch_field()
518
- return if @current_field >= @field_count
519
- f = @fields[@current_field]
520
- @current_field += 1
521
- f
522
- end
523
-
524
- def fetch_fields()
525
- @fields
526
- end
527
-
528
- def fetch_field_direct(n)
529
- @fields[n]
530
- end
531
-
532
- def fetch_lengths()
533
- @data ? @data[@current_row].map{|i| i ? i.length : 0} : @lengths
534
- end
535
-
536
- def fetch_row()
537
- if @data then
538
- if @current_row >= @data.length then
539
- @handle.status = :STATUS_READY
540
- return
541
- end
542
- ret = @data[@current_row]
543
- @current_row += 1
544
- else
545
- return if @eof
546
- ret = @handle.read_one_row @field_count
547
- if ret == nil then
548
- @eof = true
549
- return
550
- end
551
- @lengths = ret.map{|i| i ? i.length : 0}
552
- @row_count += 1
553
- end
554
- ret
555
- end
556
-
557
- def fetch_hash(with_table=nil)
558
- row = fetch_row
559
- return if row == nil
560
- hash = {}
561
- @fields.each_index do |i|
562
- f = with_table ? @fields[i].table+"."+@fields[i].name : @fields[i].name
563
- hash[f] = row[i]
564
- end
565
- hash
566
- end
567
-
568
- def field_seek(n)
569
- @current_field = n
570
- end
571
-
572
- def field_tell()
573
- @current_field
574
- end
575
-
576
- def free()
577
- @handle.skip_result
578
- @handle = @fields = @data = nil
579
- GC::start
580
- end
581
-
582
- def num_fields()
583
- @field_count
584
- end
585
-
586
- def num_rows()
587
- @data ? @data.length : @row_count
588
- end
589
-
590
- def row_seek(n)
591
- @current_row = n
592
- end
593
-
594
- def row_tell()
595
- @current_row
596
- end
597
-
598
- def each()
599
- while row = fetch_row do
600
- yield row
601
- end
602
- end
603
-
604
- def each_hash(with_table=nil)
605
- while hash = fetch_hash(with_table) do
606
- yield hash
607
- end
608
- end
609
-
610
- def inspect()
611
- "#<#{self.class}>"
612
- end
613
-
614
- end
615
-
616
- class Field
617
- # Field type
618
- TYPE_DECIMAL = 0
619
- TYPE_TINY = 1
620
- TYPE_SHORT = 2
621
- TYPE_LONG = 3
622
- TYPE_FLOAT = 4
623
- TYPE_DOUBLE = 5
624
- TYPE_NULL = 6
625
- TYPE_TIMESTAMP = 7
626
- TYPE_LONGLONG = 8
627
- TYPE_INT24 = 9
628
- TYPE_DATE = 10
629
- TYPE_TIME = 11
630
- TYPE_DATETIME = 12
631
- TYPE_YEAR = 13
632
- TYPE_NEWDATE = 14
633
- TYPE_ENUM = 247
634
- TYPE_SET = 248
635
- TYPE_TINY_BLOB = 249
636
- TYPE_MEDIUM_BLOB = 250
637
- TYPE_LONG_BLOB = 251
638
- TYPE_BLOB = 252
639
- TYPE_VAR_STRING = 253
640
- TYPE_STRING = 254
641
- TYPE_GEOMETRY = 255
642
- TYPE_CHAR = TYPE_TINY
643
- TYPE_INTERVAL = TYPE_ENUM
644
-
645
- # Flag
646
- NOT_NULL_FLAG = 1
647
- PRI_KEY_FLAG = 2
648
- UNIQUE_KEY_FLAG = 4
649
- MULTIPLE_KEY_FLAG = 8
650
- BLOB_FLAG = 16
651
- UNSIGNED_FLAG = 32
652
- ZEROFILL_FLAG = 64
653
- BINARY_FLAG = 128
654
- ENUM_FLAG = 256
655
- AUTO_INCREMENT_FLAG = 512
656
- TIMESTAMP_FLAG = 1024
657
- SET_FLAG = 2048
658
- NUM_FLAG = 32768
659
- PART_KEY_FLAG = 16384
660
- GROUP_FLAG = 32768
661
- UNIQUE_FLAG = 65536
662
-
663
- def initialize(table, org_table, name, length, type, flags, decimals, def_value, max_length)
664
- @table = table
665
- @org_table = org_table
666
- @name = name
667
- @length = length
668
- @type = type
669
- @flags = flags
670
- @decimals = decimals
671
- @def = def_value
672
- @max_length = max_length
673
- if (type <= TYPE_INT24 and (type != TYPE_TIMESTAMP or length == 14 or length == 8)) or type == TYPE_YEAR then
674
- @flags |= NUM_FLAG
675
- end
676
- end
677
- attr_reader :table, :org_table, :name, :length, :type, :flags, :decimals, :def, :max_length
678
-
679
- def inspect()
680
- "#<#{self.class}:#{@name}>"
681
- end
682
- end
683
-
684
- class Error < StandardError
685
- # Server Error
686
- ER_HASHCHK = 1000
687
- ER_NISAMCHK = 1001
688
- ER_NO = 1002
689
- ER_YES = 1003
690
- ER_CANT_CREATE_FILE = 1004
691
- ER_CANT_CREATE_TABLE = 1005
692
- ER_CANT_CREATE_DB = 1006
693
- ER_DB_CREATE_EXISTS = 1007
694
- ER_DB_DROP_EXISTS = 1008
695
- ER_DB_DROP_DELETE = 1009
696
- ER_DB_DROP_RMDIR = 1010
697
- ER_CANT_DELETE_FILE = 1011
698
- ER_CANT_FIND_SYSTEM_REC = 1012
699
- ER_CANT_GET_STAT = 1013
700
- ER_CANT_GET_WD = 1014
701
- ER_CANT_LOCK = 1015
702
- ER_CANT_OPEN_FILE = 1016
703
- ER_FILE_NOT_FOUND = 1017
704
- ER_CANT_READ_DIR = 1018
705
- ER_CANT_SET_WD = 1019
706
- ER_CHECKREAD = 1020
707
- ER_DISK_FULL = 1021
708
- ER_DUP_KEY = 1022
709
- ER_ERROR_ON_CLOSE = 1023
710
- ER_ERROR_ON_READ = 1024
711
- ER_ERROR_ON_RENAME = 1025
712
- ER_ERROR_ON_WRITE = 1026
713
- ER_FILE_USED = 1027
714
- ER_FILSORT_ABORT = 1028
715
- ER_FORM_NOT_FOUND = 1029
716
- ER_GET_ERRNO = 1030
717
- ER_ILLEGAL_HA = 1031
718
- ER_KEY_NOT_FOUND = 1032
719
- ER_NOT_FORM_FILE = 1033
720
- ER_NOT_KEYFILE = 1034
721
- ER_OLD_KEYFILE = 1035
722
- ER_OPEN_AS_READONLY = 1036
723
- ER_OUTOFMEMORY = 1037
724
- ER_OUT_OF_SORTMEMORY = 1038
725
- ER_UNEXPECTED_EOF = 1039
726
- ER_CON_COUNT_ERROR = 1040
727
- ER_OUT_OF_RESOURCES = 1041
728
- ER_BAD_HOST_ERROR = 1042
729
- ER_HANDSHAKE_ERROR = 1043
730
- ER_DBACCESS_DENIED_ERROR = 1044
731
- ER_ACCESS_DENIED_ERROR = 1045
732
- ER_NO_DB_ERROR = 1046
733
- ER_UNKNOWN_COM_ERROR = 1047
734
- ER_BAD_NULL_ERROR = 1048
735
- ER_BAD_DB_ERROR = 1049
736
- ER_TABLE_EXISTS_ERROR = 1050
737
- ER_BAD_TABLE_ERROR = 1051
738
- ER_NON_UNIQ_ERROR = 1052
739
- ER_SERVER_SHUTDOWN = 1053
740
- ER_BAD_FIELD_ERROR = 1054
741
- ER_WRONG_FIELD_WITH_GROUP = 1055
742
- ER_WRONG_GROUP_FIELD = 1056
743
- ER_WRONG_SUM_SELECT = 1057
744
- ER_WRONG_VALUE_COUNT = 1058
745
- ER_TOO_LONG_IDENT = 1059
746
- ER_DUP_FIELDNAME = 1060
747
- ER_DUP_KEYNAME = 1061
748
- ER_DUP_ENTRY = 1062
749
- ER_WRONG_FIELD_SPEC = 1063
750
- ER_PARSE_ERROR = 1064
751
- ER_EMPTY_QUERY = 1065
752
- ER_NONUNIQ_TABLE = 1066
753
- ER_INVALID_DEFAULT = 1067
754
- ER_MULTIPLE_PRI_KEY = 1068
755
- ER_TOO_MANY_KEYS = 1069
756
- ER_TOO_MANY_KEY_PARTS = 1070
757
- ER_TOO_LONG_KEY = 1071
758
- ER_KEY_COLUMN_DOES_NOT_EXITS = 1072
759
- ER_BLOB_USED_AS_KEY = 1073
760
- ER_TOO_BIG_FIELDLENGTH = 1074
761
- ER_WRONG_AUTO_KEY = 1075
762
- ER_READY = 1076
763
- ER_NORMAL_SHUTDOWN = 1077
764
- ER_GOT_SIGNAL = 1078
765
- ER_SHUTDOWN_COMPLETE = 1079
766
- ER_FORCING_CLOSE = 1080
767
- ER_IPSOCK_ERROR = 1081
768
- ER_NO_SUCH_INDEX = 1082
769
- ER_WRONG_FIELD_TERMINATORS = 1083
770
- ER_BLOBS_AND_NO_TERMINATED = 1084
771
- ER_TEXTFILE_NOT_READABLE = 1085
772
- ER_FILE_EXISTS_ERROR = 1086
773
- ER_LOAD_INFO = 1087
774
- ER_ALTER_INFO = 1088
775
- ER_WRONG_SUB_KEY = 1089
776
- ER_CANT_REMOVE_ALL_FIELDS = 1090
777
- ER_CANT_DROP_FIELD_OR_KEY = 1091
778
- ER_INSERT_INFO = 1092
779
- ER_INSERT_TABLE_USED = 1093
780
- ER_NO_SUCH_THREAD = 1094
781
- ER_KILL_DENIED_ERROR = 1095
782
- ER_NO_TABLES_USED = 1096
783
- ER_TOO_BIG_SET = 1097
784
- ER_NO_UNIQUE_LOGFILE = 1098
785
- ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099
786
- ER_TABLE_NOT_LOCKED = 1100
787
- ER_BLOB_CANT_HAVE_DEFAULT = 1101
788
- ER_WRONG_DB_NAME = 1102
789
- ER_WRONG_TABLE_NAME = 1103
790
- ER_TOO_BIG_SELECT = 1104
791
- ER_UNKNOWN_ERROR = 1105
792
- ER_UNKNOWN_PROCEDURE = 1106
793
- ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107
794
- ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108
795
- ER_UNKNOWN_TABLE = 1109
796
- ER_FIELD_SPECIFIED_TWICE = 1110
797
- ER_INVALID_GROUP_FUNC_USE = 1111
798
- ER_UNSUPPORTED_EXTENSION = 1112
799
- ER_TABLE_MUST_HAVE_COLUMNS = 1113
800
- ER_RECORD_FILE_FULL = 1114
801
- ER_UNKNOWN_CHARACTER_SET = 1115
802
- ER_TOO_MANY_TABLES = 1116
803
- ER_TOO_MANY_FIELDS = 1117
804
- ER_TOO_BIG_ROWSIZE = 1118
805
- ER_STACK_OVERRUN = 1119
806
- ER_WRONG_OUTER_JOIN = 1120
807
- ER_NULL_COLUMN_IN_INDEX = 1121
808
- ER_CANT_FIND_UDF = 1122
809
- ER_CANT_INITIALIZE_UDF = 1123
810
- ER_UDF_NO_PATHS = 1124
811
- ER_UDF_EXISTS = 1125
812
- ER_CANT_OPEN_LIBRARY = 1126
813
- ER_CANT_FIND_DL_ENTRY = 1127
814
- ER_FUNCTION_NOT_DEFINED = 1128
815
- ER_HOST_IS_BLOCKED = 1129
816
- ER_HOST_NOT_PRIVILEGED = 1130
817
- ER_PASSWORD_ANONYMOUS_USER = 1131
818
- ER_PASSWORD_NOT_ALLOWED = 1132
819
- ER_PASSWORD_NO_MATCH = 1133
820
- ER_UPDATE_INFO = 1134
821
- ER_CANT_CREATE_THREAD = 1135
822
- ER_WRONG_VALUE_COUNT_ON_ROW = 1136
823
- ER_CANT_REOPEN_TABLE = 1137
824
- ER_INVALID_USE_OF_NULL = 1138
825
- ER_REGEXP_ERROR = 1139
826
- ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140
827
- ER_NONEXISTING_GRANT = 1141
828
- ER_TABLEACCESS_DENIED_ERROR = 1142
829
- ER_COLUMNACCESS_DENIED_ERROR = 1143
830
- ER_ILLEGAL_GRANT_FOR_TABLE = 1144
831
- ER_GRANT_WRONG_HOST_OR_USER = 1145
832
- ER_NO_SUCH_TABLE = 1146
833
- ER_NONEXISTING_TABLE_GRANT = 1147
834
- ER_NOT_ALLOWED_COMMAND = 1148
835
- ER_SYNTAX_ERROR = 1149
836
- ER_DELAYED_CANT_CHANGE_LOCK = 1150
837
- ER_TOO_MANY_DELAYED_THREADS = 1151
838
- ER_ABORTING_CONNECTION = 1152
839
- ER_NET_PACKET_TOO_LARGE = 1153
840
- ER_NET_READ_ERROR_FROM_PIPE = 1154
841
- ER_NET_FCNTL_ERROR = 1155
842
- ER_NET_PACKETS_OUT_OF_ORDER = 1156
843
- ER_NET_UNCOMPRESS_ERROR = 1157
844
- ER_NET_READ_ERROR = 1158
845
- ER_NET_READ_INTERRUPTED = 1159
846
- ER_NET_ERROR_ON_WRITE = 1160
847
- ER_NET_WRITE_INTERRUPTED = 1161
848
- ER_TOO_LONG_STRING = 1162
849
- ER_TABLE_CANT_HANDLE_BLOB = 1163
850
- ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164
851
- ER_DELAYED_INSERT_TABLE_LOCKED = 1165
852
- ER_WRONG_COLUMN_NAME = 1166
853
- ER_WRONG_KEY_COLUMN = 1167
854
- ER_WRONG_MRG_TABLE = 1168
855
- ER_DUP_UNIQUE = 1169
856
- ER_BLOB_KEY_WITHOUT_LENGTH = 1170
857
- ER_PRIMARY_CANT_HAVE_NULL = 1171
858
- ER_TOO_MANY_ROWS = 1172
859
- ER_REQUIRES_PRIMARY_KEY = 1173
860
- ER_NO_RAID_COMPILED = 1174
861
- ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175
862
- ER_KEY_DOES_NOT_EXITS = 1176
863
- ER_CHECK_NO_SUCH_TABLE = 1177
864
- ER_CHECK_NOT_IMPLEMENTED = 1178
865
- ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179
866
- ER_ERROR_DURING_COMMIT = 1180
867
- ER_ERROR_DURING_ROLLBACK = 1181
868
- ER_ERROR_DURING_FLUSH_LOGS = 1182
869
- ER_ERROR_DURING_CHECKPOINT = 1183
870
- ER_NEW_ABORTING_CONNECTION = 1184
871
- ER_DUMP_NOT_IMPLEMENTED = 1185
872
- ER_FLUSH_MASTER_BINLOG_CLOSED = 1186
873
- ER_INDEX_REBUILD = 1187
874
- ER_MASTER = 1188
875
- ER_MASTER_NET_READ = 1189
876
- ER_MASTER_NET_WRITE = 1190
877
- ER_FT_MATCHING_KEY_NOT_FOUND = 1191
878
- ER_LOCK_OR_ACTIVE_TRANSACTION = 1192
879
- ER_UNKNOWN_SYSTEM_VARIABLE = 1193
880
- ER_CRASHED_ON_USAGE = 1194
881
- ER_CRASHED_ON_REPAIR = 1195
882
- ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196
883
- ER_TRANS_CACHE_FULL = 1197
884
- ER_SLAVE_MUST_STOP = 1198
885
- ER_SLAVE_NOT_RUNNING = 1199
886
- ER_BAD_SLAVE = 1200
887
- ER_MASTER_INFO = 1201
888
- ER_SLAVE_THREAD = 1202
889
- ER_TOO_MANY_USER_CONNECTIONS = 1203
890
- ER_SET_CONSTANTS_ONLY = 1204
891
- ER_LOCK_WAIT_TIMEOUT = 1205
892
- ER_LOCK_TABLE_FULL = 1206
893
- ER_READ_ONLY_TRANSACTION = 1207
894
- ER_DROP_DB_WITH_READ_LOCK = 1208
895
- ER_CREATE_DB_WITH_READ_LOCK = 1209
896
- ER_WRONG_ARGUMENTS = 1210
897
- ER_NO_PERMISSION_TO_CREATE_USER = 1211
898
- ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212
899
- ER_LOCK_DEADLOCK = 1213
900
- ER_TABLE_CANT_HANDLE_FULLTEXT = 1214
901
- ER_CANNOT_ADD_FOREIGN = 1215
902
- ER_NO_REFERENCED_ROW = 1216
903
- ER_ROW_IS_REFERENCED = 1217
904
- ER_CONNECT_TO_MASTER = 1218
905
- ER_QUERY_ON_MASTER = 1219
906
- ER_ERROR_WHEN_EXECUTING_COMMAND = 1220
907
- ER_WRONG_USAGE = 1221
908
- ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222
909
- ER_CANT_UPDATE_WITH_READLOCK = 1223
910
- ER_MIXING_NOT_ALLOWED = 1224
911
- ER_DUP_ARGUMENT = 1225
912
- ER_USER_LIMIT_REACHED = 1226
913
- ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227
914
- ER_LOCAL_VARIABLE = 1228
915
- ER_GLOBAL_VARIABLE = 1229
916
- ER_NO_DEFAULT = 1230
917
- ER_WRONG_VALUE_FOR_VAR = 1231
918
- ER_WRONG_TYPE_FOR_VAR = 1232
919
- ER_VAR_CANT_BE_READ = 1233
920
- ER_CANT_USE_OPTION_HERE = 1234
921
- ER_NOT_SUPPORTED_YET = 1235
922
- ER_MASTER_FATAL_ERROR_READING_BINLOG = 1236
923
- ER_SLAVE_IGNORED_TABLE = 1237
924
- ER_ERROR_MESSAGES = 238
925
-
926
- # Client Error
927
- CR_MIN_ERROR = 2000
928
- CR_MAX_ERROR = 2999
929
- CR_UNKNOWN_ERROR = 2000
930
- CR_SOCKET_CREATE_ERROR = 2001
931
- CR_CONNECTION_ERROR = 2002
932
- CR_CONN_HOST_ERROR = 2003
933
- CR_IPSOCK_ERROR = 2004
934
- CR_UNKNOWN_HOST = 2005
935
- CR_SERVER_GONE_ERROR = 2006
936
- CR_VERSION_ERROR = 2007
937
- CR_OUT_OF_MEMORY = 2008
938
- CR_WRONG_HOST_INFO = 2009
939
- CR_LOCALHOST_CONNECTION = 2010
940
- CR_TCP_CONNECTION = 2011
941
- CR_SERVER_HANDSHAKE_ERR = 2012
942
- CR_SERVER_LOST = 2013
943
- CR_COMMANDS_OUT_OF_SYNC = 2014
944
- CR_NAMEDPIPE_CONNECTION = 2015
945
- CR_NAMEDPIPEWAIT_ERROR = 2016
946
- CR_NAMEDPIPEOPEN_ERROR = 2017
947
- CR_NAMEDPIPESETSTATE_ERROR = 2018
948
- CR_CANT_READ_CHARSET = 2019
949
- CR_NET_PACKET_TOO_LARGE = 2020
950
- CR_EMBEDDED_CONNECTION = 2021
951
- CR_PROBE_SLAVE_STATUS = 2022
952
- CR_PROBE_SLAVE_HOSTS = 2023
953
- CR_PROBE_SLAVE_CONNECT = 2024
954
- CR_PROBE_MASTER_CONNECT = 2025
955
- CR_SSL_CONNECTION_ERROR = 2026
956
- CR_MALFORMED_PACKET = 2027
957
-
958
- CLIENT_ERRORS = [
959
- "Unknown MySQL error",
960
- "Can't create UNIX socket (%d)",
961
- "Can't connect to local MySQL server through socket '%-.64s' (%d)",
962
- "Can't connect to MySQL server on '%-.64s' (%d)",
963
- "Can't create TCP/IP socket (%d)",
964
- "Unknown MySQL Server Host '%-.64s' (%d)",
965
- "MySQL server has gone away",
966
- "Protocol mismatch. Server Version = %d Client Version = %d",
967
- "MySQL client run out of memory",
968
- "Wrong host info",
969
- "Localhost via UNIX socket",
970
- "%-.64s via TCP/IP",
971
- "Error in server handshake",
972
- "Lost connection to MySQL server during query",
973
- "Commands out of sync; You can't run this command now",
974
- "%-.64s via named pipe",
975
- "Can't wait for named pipe to host: %-.64s pipe: %-.32s (%lu)",
976
- "Can't open named pipe to host: %-.64s pipe: %-.32s (%lu)",
977
- "Can't set state of named pipe to host: %-.64s pipe: %-.32s (%lu)",
978
- "Can't initialize character set %-.64s (path: %-.64s)",
979
- "Got packet bigger than 'max_allowed_packet'",
980
- "Embedded server",
981
- "Error on SHOW SLAVE STATUS:",
982
- "Error on SHOW SLAVE HOSTS:",
983
- "Error connecting to slave:",
984
- "Error connecting to master:",
985
- "SSL connection error",
986
- "Malformed packet"
987
- ]
988
-
989
- def initialize(errno, error)
990
- @errno = errno
991
- @error = error
992
- super error
993
- end
994
- attr_reader :errno, :error
995
-
996
- def Error::err(errno)
997
- CLIENT_ERRORS[errno - Error::CR_MIN_ERROR]
998
- end
999
- end
1000
-
1001
- class Net
1002
- def initialize(sock)
1003
- @sock = sock
1004
- @pkt_nr = 0
1005
- end
1006
-
1007
- def clear()
1008
- @pkt_nr = 0
1009
- end
1010
-
1011
- def read()
1012
- buf = []
1013
- len = nil
1014
- @sock.sync = false
1015
- while len == nil or len == MAX_PACKET_LENGTH do
1016
- a = @sock.read(4)
1017
- len = a[0]+a[1]*256+a[2]*256*256
1018
- pkt_nr = a[3]
1019
- if @pkt_nr != pkt_nr then
1020
- raise "Packets out of order: #{@pkt_nr}<>#{pkt_nr}"
1021
- end
1022
- @pkt_nr = @pkt_nr + 1 & 0xff
1023
- buf << @sock.read(len)
1024
- end
1025
- @sock.sync = true
1026
- buf.join
1027
- end
1028
-
1029
- def write(data)
1030
- if data.is_a? Array then
1031
- data = data.join
1032
- end
1033
- @sock.sync = false
1034
- ptr = 0
1035
- while data.length >= MAX_PACKET_LENGTH do
1036
- @sock.write Net::int3str(MAX_PACKET_LENGTH)+@pkt_nr.chr+data[ptr, MAX_PACKET_LENGTH]
1037
- @pkt_nr = @pkt_nr + 1 & 0xff
1038
- ptr += MAX_PACKET_LENGTH
1039
- end
1040
- @sock.write Net::int3str(data.length-ptr)+@pkt_nr.chr+data[ptr .. -1]
1041
- @pkt_nr = @pkt_nr + 1 & 0xff
1042
- @sock.sync = true
1043
- @sock.flush
1044
- end
1045
-
1046
- def close()
1047
- @sock.close
1048
- end
1049
-
1050
- def Net::int2str(n)
1051
- [n].pack("v")
1052
- end
1053
-
1054
- def Net::int3str(n)
1055
- [n%256, n>>8].pack("cv")
1056
- end
1057
-
1058
- def Net::int4str(n)
1059
- [n].pack("V")
1060
- end
1061
-
1062
- end
1063
-
1064
- class Random
1065
- def initialize(seed1, seed2)
1066
- @max_value = 0x3FFFFFFF
1067
- @seed1 = seed1 % @max_value
1068
- @seed2 = seed2 % @max_value
1069
- end
1070
-
1071
- def rnd()
1072
- @seed1 = (@seed1*3+@seed2) % @max_value
1073
- @seed2 = (@seed1+@seed2+33) % @max_value
1074
- @seed1.to_f / @max_value
1075
- end
1076
- end
1077
-
1078
- end
1079
-
1080
- class << Mysql
1081
- def init()
1082
- Mysql::new :INIT
1083
- end
1084
-
1085
- def real_connect(*args)
1086
- Mysql::new(*args)
1087
- end
1088
- alias :connect :real_connect
1089
-
1090
- def finalizer(net)
1091
- proc {
1092
- net.clear
1093
- net.write Mysql::COM_QUIT.chr
1094
- }
1095
- end
1096
-
1097
- def escape_string(str)
1098
- str.gsub(/([\0\n\r\032\'\"\\])/) do
1099
- case $1
1100
- when "\0" then "\\0"
1101
- when "\n" then "\\n"
1102
- when "\r" then "\\r"
1103
- when "\032" then "\\Z"
1104
- else "\\"+$1
1105
- end
1106
- end
1107
- end
1108
- alias :quote :escape_string
1109
-
1110
- def get_client_info()
1111
- Mysql::VERSION
1112
- end
1113
- alias :client_info :get_client_info
1114
-
1115
- def debug(str)
1116
- raise "not implemented"
1117
- end
1118
- end
1119
-
1120
- #
1121
- # for compatibility
1122
- #
1123
-
1124
- MysqlRes = Mysql::Result
1125
- MysqlField = Mysql::Field
1126
- MysqlError = Mysql::Error
1127
- end # module RSQL