ydbi 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +4 -0
  3. data/build/Rakefile.dbi.rb +4 -4
  4. data/lib/dbi/version.rb +1 -1
  5. data/test/dbi/tc_dbi.rb +1 -1
  6. metadata +9 -124
  7. data/.gitignore +0 -6
  8. data/Gemfile +0 -4
  9. data/Rakefile +0 -8
  10. data/TODO +0 -44
  11. data/bench/bench.rb +0 -79
  12. data/build/rake_task_lib.rb +0 -187
  13. data/doc/DBD_SPEC.rdoc +0 -88
  14. data/doc/DBI_SPEC.rdoc +0 -157
  15. data/doc/homepage/contact.html +0 -62
  16. data/doc/homepage/development.html +0 -124
  17. data/doc/homepage/index.html +0 -83
  18. data/doc/homepage/ruby-dbi.css +0 -91
  19. data/lib/dbd/Mysql.rb +0 -137
  20. data/lib/dbd/ODBC.rb +0 -89
  21. data/lib/dbd/Pg.rb +0 -188
  22. data/lib/dbd/SQLite.rb +0 -97
  23. data/lib/dbd/SQLite3.rb +0 -124
  24. data/lib/dbd/mysql/database.rb +0 -405
  25. data/lib/dbd/mysql/driver.rb +0 -125
  26. data/lib/dbd/mysql/statement.rb +0 -188
  27. data/lib/dbd/odbc/database.rb +0 -128
  28. data/lib/dbd/odbc/driver.rb +0 -38
  29. data/lib/dbd/odbc/statement.rb +0 -137
  30. data/lib/dbd/pg/database.rb +0 -516
  31. data/lib/dbd/pg/exec.rb +0 -47
  32. data/lib/dbd/pg/statement.rb +0 -160
  33. data/lib/dbd/pg/tuples.rb +0 -121
  34. data/lib/dbd/pg/type.rb +0 -209
  35. data/lib/dbd/sqlite/database.rb +0 -151
  36. data/lib/dbd/sqlite/statement.rb +0 -125
  37. data/lib/dbd/sqlite3/database.rb +0 -201
  38. data/lib/dbd/sqlite3/statement.rb +0 -78
  39. data/prototypes/types2.rb +0 -237
  40. data/setup.rb +0 -1585
  41. data/test/DBD_TESTS +0 -50
  42. data/test/TESTING +0 -16
  43. data/test/dbd/general/test_database.rb +0 -206
  44. data/test/dbd/general/test_statement.rb +0 -326
  45. data/test/dbd/general/test_types.rb +0 -296
  46. data/test/dbd/mysql/base.rb +0 -26
  47. data/test/dbd/mysql/down.sql +0 -19
  48. data/test/dbd/mysql/test_blob.rb +0 -18
  49. data/test/dbd/mysql/test_new_methods.rb +0 -7
  50. data/test/dbd/mysql/test_patches.rb +0 -111
  51. data/test/dbd/mysql/up.sql +0 -28
  52. data/test/dbd/odbc/base.rb +0 -30
  53. data/test/dbd/odbc/down.sql +0 -19
  54. data/test/dbd/odbc/test_new_methods.rb +0 -12
  55. data/test/dbd/odbc/test_ping.rb +0 -10
  56. data/test/dbd/odbc/test_statement.rb +0 -44
  57. data/test/dbd/odbc/test_transactions.rb +0 -58
  58. data/test/dbd/odbc/up.sql +0 -33
  59. data/test/dbd/postgresql/base.rb +0 -31
  60. data/test/dbd/postgresql/down.sql +0 -31
  61. data/test/dbd/postgresql/test_arrays.rb +0 -179
  62. data/test/dbd/postgresql/test_async.rb +0 -121
  63. data/test/dbd/postgresql/test_blob.rb +0 -36
  64. data/test/dbd/postgresql/test_bytea.rb +0 -87
  65. data/test/dbd/postgresql/test_ping.rb +0 -10
  66. data/test/dbd/postgresql/test_timestamp.rb +0 -77
  67. data/test/dbd/postgresql/test_transactions.rb +0 -58
  68. data/test/dbd/postgresql/testdbipg.rb +0 -307
  69. data/test/dbd/postgresql/up.sql +0 -60
  70. data/test/dbd/sqlite/base.rb +0 -32
  71. data/test/dbd/sqlite/test_database.rb +0 -30
  72. data/test/dbd/sqlite/test_driver.rb +0 -68
  73. data/test/dbd/sqlite/test_statement.rb +0 -112
  74. data/test/dbd/sqlite/up.sql +0 -25
  75. data/test/dbd/sqlite3/base.rb +0 -32
  76. data/test/dbd/sqlite3/test_database.rb +0 -77
  77. data/test/dbd/sqlite3/test_driver.rb +0 -67
  78. data/test/dbd/sqlite3/test_statement.rb +0 -88
  79. data/test/dbd/sqlite3/up.sql +0 -33
  80. data/test/ts_dbd.rb +0 -131
  81. data/ydbi.gemspec +0 -24
@@ -1,405 +0,0 @@
1
- module DBI::DBD::Mysql
2
- #
3
- # Models the DBI::BaseDatabase API to create DBI::DatabaseHandle objects.
4
- #
5
- class Database < DBI::BaseDatabase
6
- include Util
7
-
8
- #
9
- # Hash to translate MySQL type names to DBI SQL type constants
10
- #
11
- # Only used in #mysql_type_info.
12
- #
13
- #--
14
- # Eli Green:
15
- # The hope is that we don't ever need to just assume the default values.
16
- # However, in some cases (notably floats and doubles), I have seen
17
- # "show fields from table" return absolutely zero information about size
18
- # and precision. Sigh. I probably should have made a struct to store
19
- # this info in ... but I didn't.
20
- #++
21
- MYSQL_to_XOPEN = {
22
- "TINYINT" => [DBI::SQL_TINYINT, 1, nil],
23
- "SMALLINT" => [DBI::SQL_SMALLINT, 6, nil],
24
- "MEDIUMINT" => [DBI::SQL_SMALLINT, 6, nil],
25
- "INT" => [DBI::SQL_INTEGER, 11, nil],
26
- "INTEGER" => [DBI::SQL_INTEGER, 11, nil],
27
- "BIGINT" => [DBI::SQL_BIGINT, 25, nil],
28
- "INT24" => [DBI::SQL_BIGINT, 25, nil],
29
- "REAL" => [DBI::SQL_REAL, 12, nil],
30
- "FLOAT" => [DBI::SQL_FLOAT, 12, nil],
31
- "DECIMAL" => [DBI::SQL_DECIMAL, 12, nil],
32
- "NUMERIC" => [DBI::SQL_NUMERIC, 12, nil],
33
- "DOUBLE" => [DBI::SQL_DOUBLE, 22, nil],
34
- "CHAR" => [DBI::SQL_CHAR, 1, nil],
35
- "VARCHAR" => [DBI::SQL_VARCHAR, 255, nil],
36
- "DATE" => [DBI::SQL_DATE, 10, nil],
37
- "TIME" => [DBI::SQL_TIME, 8, nil],
38
- "TIMESTAMP" => [DBI::SQL_TIMESTAMP, 19, nil],
39
- "DATETIME" => [DBI::SQL_TIMESTAMP, 19, nil],
40
- "TINYBLOB" => [DBI::SQL_BINARY, 255, nil],
41
- "BLOB" => [DBI::SQL_VARBINARY, 65535, nil],
42
- "MEDIUMBLOB" => [DBI::SQL_VARBINARY, 16277215, nil],
43
- "LONGBLOB" => [DBI::SQL_LONGVARBINARY, 2147483657, nil],
44
- "TINYTEXT" => [DBI::SQL_VARCHAR, 255, nil],
45
- "TEXT" => [DBI::SQL_LONGVARCHAR, 65535, nil],
46
- "MEDIUMTEXT" => [DBI::SQL_LONGVARCHAR, 16277215, nil],
47
- "LONGTEXT" => [DBI::SQL_LONGVARCHAR, 2147483657, nil],
48
- "ENUM" => [DBI::SQL_CHAR, 255, nil],
49
- "SET" => [DBI::SQL_CHAR, 255, nil],
50
- "BIT" => [DBI::SQL_BIT, 8, nil],
51
- nil => [DBI::SQL_OTHER, nil, nil]
52
- }
53
-
54
-
55
- #
56
- # This maps type names to DBI Types.
57
- #
58
- TYPE_MAP = {}
59
-
60
- ::Mysql::Field.constants.grep(/^TYPE_/).each do |const|
61
- mysql_type = MysqlField.const_get(const) # numeric type code
62
- coercion_method = DBI::Type::Varchar # default coercion method
63
- case const.to_s
64
- when 'TYPE_TINY'
65
- mysql_type_name = 'TINYINT'
66
- coercion_method = DBI::Type::Integer
67
- when 'TYPE_SHORT'
68
- mysql_type_name = 'SMALLINT'
69
- coercion_method = DBI::Type::Integer
70
- when 'TYPE_INT24'
71
- mysql_type_name = 'MEDIUMINT'
72
- coercion_method = DBI::Type::Integer
73
- when 'TYPE_LONG'
74
- mysql_type_name = 'INT'
75
- coercion_method = DBI::Type::Integer
76
- when 'TYPE_LONGLONG'
77
- mysql_type_name = 'BIGINT'
78
- coercion_method = DBI::Type::Integer
79
- when 'TYPE_FLOAT'
80
- mysql_type_name = 'FLOAT'
81
- coercion_method = DBI::Type::Float
82
- when 'TYPE_DOUBLE'
83
- mysql_type_name = 'DOUBLE'
84
- coercion_method = DBI::Type::Float
85
- when 'TYPE_VAR_STRING', 'TYPE_STRING'
86
- mysql_type_name = 'VARCHAR' # questionable?
87
- coercion_method = DBI::Type::Varchar
88
- when 'TYPE_DATE'
89
- mysql_type_name = 'DATE'
90
- coercion_method = DBI::DBD::Mysql::Type::Date
91
- when 'TYPE_TIME'
92
- mysql_type_name = 'TIME'
93
- coercion_method = DBI::Type::Timestamp
94
- when 'TYPE_DATETIME', 'TYPE_TIMESTAMP'
95
- mysql_type_name = 'DATETIME'
96
- coercion_method = DBI::Type::Timestamp
97
- when 'TYPE_CHAR'
98
- mysql_type_name = 'TINYINT' # questionable?
99
- when 'TYPE_TINY_BLOB'
100
- mysql_type_name = 'TINYBLOB' # questionable?
101
- when 'TYPE_MEDIUM_BLOB'
102
- mysql_type_name = 'MEDIUMBLOB' # questionable?
103
- when 'TYPE_LONG_BLOB'
104
- mysql_type_name = 'LONGBLOB' # questionable?
105
- when 'TYPE_GEOMETRY'
106
- mysql_type_name = 'BLOB' # questionable?
107
- when 'TYPE_YEAR',
108
- 'TYPE_DECIMAL', # questionable?
109
- 'TYPE_BLOB', # questionable?
110
- 'TYPE_ENUM',
111
- 'TYPE_SET',
112
- 'TYPE_BIT',
113
- 'TYPE_NULL'
114
- mysql_type_name = const.to_s.sub(/^TYPE_/, '')
115
- else
116
- mysql_type_name = 'UNKNOWN'
117
- end
118
- TYPE_MAP[mysql_type] = [mysql_type_name, coercion_method]
119
- end
120
- TYPE_MAP[nil] = ['UNKNOWN', DBI::Type::Varchar]
121
- TYPE_MAP[246] = ['NUMERIC', DBI::Type::Decimal]
122
-
123
- #
124
- # Constructor. Attributes supported:
125
- #
126
- # * AutoCommit: Commit after each executed statement. This will raise
127
- # a DBI::NotSupportedError if the backend does not support
128
- # transactions.
129
- #
130
- def initialize(handle, attr)
131
- super
132
- # check server version to determine transaction capability
133
- ver_str = @handle.get_server_info
134
- major, minor, teeny = ver_str.split(".")
135
- teeny.sub!(/\D*$/, "") # strip any non-numeric suffix if present
136
- server_version = major.to_i*10000 + minor.to_i*100 + teeny.to_i
137
- # It's not until 3.23.17 that SET AUTOCOMMIT,
138
- # BEGIN, COMMIT, and ROLLBACK all are available
139
- @have_transactions = (server_version >= 32317)
140
- # assume that the connection begins in AutoCommit mode
141
- @attr['AutoCommit'] = true
142
- @mutex = Mutex.new
143
- end
144
-
145
- def disconnect
146
- self.rollback unless @attr['AutoCommit']
147
- @handle.close
148
- rescue MyError => err
149
- error(err)
150
- end
151
-
152
- def database_name
153
- sth = Statement.new(self, @handle, "select DATABASE()", @mutex)
154
- sth.execute
155
- res = sth.fetch
156
- sth.finish
157
- return res[0]
158
- end
159
-
160
- def ping
161
- begin
162
- @handle.ping
163
- return true
164
- rescue MyError
165
- return false
166
- end
167
- end
168
-
169
- def tables
170
- @handle.list_tables
171
- rescue MyError => err
172
- error(err)
173
- end
174
-
175
- #
176
- # See DBI::BaseDatabase#columns.
177
- #
178
- # Extra attributes:
179
- #
180
- # * sql_type: XOPEN integer constant relating to type.
181
- # * nullable: true if the column allows NULL as a value.
182
- # * indexed: true if the column belongs to an index.
183
- # * primary: true if the column is a part of a primary key.
184
- # * unique: true if the values in this column are unique.
185
- # * default: the default value if this column is not explicitly set.
186
- #
187
- def columns(table)
188
- dbh = DBI::DatabaseHandle.new(self)
189
- uniques = []
190
- dbh.execute("SHOW INDEX FROM #{table}") do |sth|
191
- sth.each do |row|
192
- uniques << row[4] if row[1] == 0
193
- end
194
- end
195
-
196
- ret = nil
197
- dbh.execute("SHOW FIELDS FROM #{table}") do |sth|
198
- ret = sth.collect do |row|
199
- name, type, nullable, key, default, extra = row
200
- #type = row[1]
201
- #size = type[type.index('(')+1..type.index(')')-1]
202
- #size = 0
203
- #type = type[0..type.index('(')-1]
204
-
205
- sqltype, type, size, decimal = mysql_type_info(row[1])
206
- col = Hash.new
207
- col['name'] = name
208
- col['sql_type'] = sqltype
209
- col['type_name'] = type
210
- col['nullable'] = nullable == "YES"
211
- col['indexed'] = key != ""
212
- col['primary'] = key == "PRI"
213
- col['unique'] = uniques.index(name) != nil
214
- col['precision'] = size
215
- col['scale'] = decimal
216
- col['default'] = row[4]
217
-
218
- case col['type_name']
219
- when 'timestamp'
220
- col['dbi_type'] = DBI::Type::Timestamp
221
- end
222
-
223
- col
224
- end # collect
225
- end # execute
226
-
227
- ret
228
- end
229
-
230
- def do(stmt, *bindvars)
231
- st = Statement.new(self, @handle, stmt, @mutex)
232
- st.bind_params(*bindvars)
233
- res = st.execute
234
- st.finish
235
- return res
236
- rescue MyError => err
237
- error(err)
238
- end
239
-
240
-
241
- def prepare(statement)
242
- Statement.new(self, @handle, statement, @mutex)
243
- end
244
-
245
- #
246
- # MySQL has several backends, some of which may not support commits.
247
- # If the backend this database uses doesn't, calling this method will
248
- # raise a DBI::NotSupportedError.
249
- #
250
- def commit
251
- if @have_transactions
252
- self.do("COMMIT")
253
- else
254
- raise NotSupportedError
255
- end
256
- rescue MyError => err
257
- error(err)
258
- end
259
-
260
- #
261
- # See #commit for information regarding transactionless database
262
- # backends.
263
- #
264
- def rollback
265
- if @have_transactions
266
- self.do("ROLLBACK")
267
- else
268
- raise NotSupportedError
269
- end
270
- rescue MyError => err
271
- error(err)
272
- end
273
-
274
-
275
- # def quote(value)
276
- # case value
277
- # when String
278
- # "'#{@handle.quote(value)}'"
279
- # when DBI::Binary
280
- # "'#{@handle.quote(value.to_s)}'"
281
- # when TrueClass
282
- # "'1'"
283
- # when FalseClass
284
- # "'0'"
285
- # else
286
- # super
287
- # end
288
- # end
289
-
290
- #
291
- # See DBI::DBD::MySQL::Database.new for supported attributes and usage.
292
- #
293
- def []=(attr, value)
294
- case attr
295
- when 'AutoCommit'
296
- if @have_transactions
297
- self.do("SET AUTOCOMMIT=" + (value ? "1" : "0"))
298
- else
299
- raise NotSupportedError
300
- end
301
- else
302
- raise NotSupportedError
303
- end
304
-
305
- @attr[attr] = value
306
- end
307
-
308
- private # -------------------------------------------------
309
-
310
- #
311
- # Given a type name, weans some basic information from that and returns
312
- # it in a format similar to columns.
313
- #
314
- # Return is an array of +sqltype+, +type+, +size+, and +decimal+.
315
- # +sqltype+ is the XOPEN type, and +type+ is the string with the
316
- # parameters removed.
317
- #
318
- # +size+ and +decimal+ refer to +precision+ and +scale+ in most cases,
319
- # but not always for all types. Please consult the documentation for
320
- # your MySQL version.
321
- #
322
- #
323
- def mysql_type_info(typedef)
324
- sqltype, type, size, decimal = nil, nil, nil, nil
325
-
326
- pos = typedef.index('(')
327
- if not pos.nil?
328
- type = typedef[0..pos-1]
329
- size = typedef[pos+1..-2]
330
- pos = size.index(',')
331
- if not pos.nil?
332
- size, decimal = size.split(',', 2)
333
- decimal = decimal.to_i
334
- end
335
- size = size.to_i
336
- else
337
- type = typedef
338
- end
339
-
340
- type_info = MYSQL_to_XOPEN[type.upcase] || MYSQL_to_XOPEN[nil]
341
- sqltype = type_info[0]
342
- if size.nil? then size = type_info[1] end
343
- if decimal.nil? then decimal = type_info[2] end
344
- return sqltype, type, size, decimal
345
- end
346
-
347
- #--
348
- # Driver-specific functions ------------------------------------------------
349
- #++
350
-
351
- public
352
-
353
- def __createdb(db)
354
- @handle.create_db(db)
355
- end
356
-
357
- def __dropdb(db)
358
- @handle.drop_db(db)
359
- end
360
-
361
- def __shutdown
362
- @handle.shutdown
363
- end
364
-
365
- def __reload
366
- @handle.reload
367
- end
368
-
369
- def __insert_id
370
- @handle.insert_id
371
- end
372
-
373
- def __thread_id
374
- @handle.thread_id
375
- end
376
-
377
- def __info
378
- @handle.info
379
- end
380
-
381
- def __host_info
382
- @handle.host_info
383
- end
384
-
385
- def __proto_info
386
- @handle.proto_info
387
- end
388
-
389
- def __server_info
390
- @handle.server_info
391
- end
392
-
393
- def __client_info
394
- @handle.client_info
395
- end
396
-
397
- def __client_version
398
- @handle.client_version
399
- end
400
-
401
- def __stat
402
- @handle.stat
403
- end
404
- end # class Database
405
- end
@@ -1,125 +0,0 @@
1
- module DBI::DBD::Mysql
2
- #
3
- # Models the DBI::BaseDriver API to create DBI::DriverHandle objects.
4
- #
5
- class Driver < DBI::BaseDriver
6
- include Util
7
-
8
- def initialize
9
- super("0.4.0")
10
- end
11
-
12
- def default_user
13
- ['', nil]
14
- end
15
-
16
- #
17
- # Parameters in the dbname as follows:
18
- #
19
- # * host: host to connect to
20
- # * port: port to connect to
21
- # * socket: connect to a specific unix socket instead of a TCP socket.
22
- # * flag: an OR'd collection of flags to pass to the lower-level
23
- # connection attempt.
24
- # * mysql_read_default_file: FIXME
25
- # * mysql_read_default_group: FIXME
26
- # * mysql_compression: FIXME
27
- # * mysql_local_infile: FIXME
28
- # * mysql_client_found_rows: FIXME boolean, modifies the 'flag'
29
- # setting above.
30
- def connect(dbname, user, auth, attr)
31
- # connect to database server
32
- hash = DBI::Utils.parse_params(dbname)
33
-
34
- hash['host'] ||= 'localhost'
35
-
36
- # these two connection parameters should be passed as numbers
37
- hash['port'] = hash['port'].to_i unless hash['port'].nil?
38
- hash['flag'] = hash['flag'].nil? ? 0 : hash['flag'] = hash['flag'].to_i
39
-
40
- handle = ::Mysql.init
41
-
42
- # Look for options in connect string to be handled
43
- # through mysql_options() before connecting
44
- !hash['mysql_read_default_file'].nil? and
45
- handle.options(::Mysql::READ_DEFAULT_FILE,
46
- hash['mysql_read_default_file'])
47
- !hash['mysql_read_default_group'].nil? and
48
- handle.options(::Mysql::READ_DEFAULT_GROUP,
49
- hash['mysql_read_default_group'])
50
- # The following options can be handled either using mysql_options()
51
- # or in the flag argument to connect().
52
- hash['mysql_compression'].to_i != 0 and
53
- handle.options(::Mysql::OPT_COMPRESS, nil)
54
- hash['mysql_local_infile'].to_i != 0 and
55
- handle.options(::Mysql::OPT_LOCAL_INFILE, true)
56
-
57
- # Look for options to be handled in the flags argument to connect()
58
- if !hash['mysql_client_found_rows'].nil?
59
- if hash['mysql_client_found_rows'].to_i != 0
60
- hash['flag'] |= ::Mysql::CLIENT_FOUND_ROWS
61
- else
62
- hash['flag'] &= ~::Mysql::CLIENT_FOUND_ROWS
63
- end
64
- end
65
-
66
- handle.connect(hash['host'], user, auth, hash['database'], hash['port'], hash['socket'], hash['flag'])
67
-
68
- return Database.new(handle, attr)
69
- rescue MyError => err
70
- error(err)
71
- end
72
-
73
- def data_sources
74
- handle = ::Mysql.new
75
- res = handle.list_dbs.collect {|db| "dbi:Mysql:database=#{db}" }
76
- handle.close
77
- return res
78
- rescue MyError => err
79
- error(err)
80
- end
81
-
82
- #--
83
- # Driver-specific functions ------------------------------------------------
84
- #++
85
-
86
- public
87
-
88
- def __createdb(db, host, user, password, port=nil, sock=nil, flag=nil)
89
- handle = ::Mysql.connect(host, user, password, nil, port, sock, flag)
90
- begin
91
- handle.create_db(db)
92
- ensure
93
- handle.close if handle
94
- end
95
- end
96
-
97
- def __dropdb(db, host, user, password, port=nil, sock=nil, flag=nil)
98
- handle = ::Mysql.connect(host, user, password, nil, port, sock, flag)
99
- begin
100
- handle.drop_db(db)
101
- ensure
102
- handle.close if handle
103
- end
104
- end
105
-
106
- def __shutdown(host, user, password, port=nil, sock=nil, flag=nil)
107
- handle = ::Mysql.connect(host, user, password, nil, port, sock, flag)
108
- begin
109
- handle.shutdown
110
- ensure
111
- handle.close if handle
112
- end
113
- end
114
-
115
- def __reload(host, user, password, port=nil, sock=nil, flag=nil)
116
- handle = ::Mysql.connect(host, user, password, nil, port, sock, flag)
117
- begin
118
- handle.reload
119
- ensure
120
- handle.close if handle
121
- end
122
- end
123
-
124
- end # class Driver
125
- end