DBI::BaseDatabase
Models the DBI::BaseDatabase API to create DBI::DatabaseHandle objects.
Hash to translate MySQL type names to DBI SQL type constants
Only used in mysql_type_info.
This maps type names to DBI Types.
Constructor. Attributes supported:
AutoCommit: Commit after each executed statement. This will raise a DBI::NotSupportedError if the backend does not support transactions.
# File lib/dbd/mysql/database.rb, line 130 def initialize(handle, attr) super # check server version to determine transaction capability ver_str = @handle.get_server_info major, minor, teeny = ver_str.split(".") teeny.sub!(/\D*$/, "") # strip any non-numeric suffix if present server_version = major.to_i*10000 + minor.to_i*100 + teeny.to_i # It's not until 3.23.17 that SET AUTOCOMMIT, # BEGIN, COMMIT, and ROLLBACK all are available @have_transactions = (server_version >= 32317) # assume that the connection begins in AutoCommit mode @attr['AutoCommit'] = true @mutex = Mutex.new end
See DBI::DBD::MySQL::Database.new for supported attributes and usage.
# File lib/dbd/mysql/database.rb, line 293 def []=(attr, value) case attr when 'AutoCommit' if @have_transactions self.do("SET AUTOCOMMIT=" + (value ? "1" : "0")) else raise NotSupportedError end else raise NotSupportedError end @attr[attr] = value end
# File lib/dbd/mysql/database.rb, line 393 def __client_info @handle.client_info end
# File lib/dbd/mysql/database.rb, line 397 def __client_version @handle.client_version end
# File lib/dbd/mysql/database.rb, line 353 def __createdb(db) @handle.create_db(db) end
# File lib/dbd/mysql/database.rb, line 357 def __dropdb(db) @handle.drop_db(db) end
# File lib/dbd/mysql/database.rb, line 381 def __host_info @handle.host_info end
# File lib/dbd/mysql/database.rb, line 377 def __info @handle.info end
# File lib/dbd/mysql/database.rb, line 369 def __insert_id @handle.insert_id end
# File lib/dbd/mysql/database.rb, line 385 def __proto_info @handle.proto_info end
# File lib/dbd/mysql/database.rb, line 365 def __reload @handle.reload end
# File lib/dbd/mysql/database.rb, line 389 def __server_info @handle.server_info end
# File lib/dbd/mysql/database.rb, line 361 def __shutdown @handle.shutdown end
# File lib/dbd/mysql/database.rb, line 401 def __stat @handle.stat end
# File lib/dbd/mysql/database.rb, line 373 def __thread_id @handle.thread_id end
See DBI::BaseDatabase#columns.
Extra attributes:
sql_type: XOPEN integer constant relating to type.
nullable: true if the column allows NULL as a value.
indexed: true if the column belongs to an index.
primary: true if the column is a part of a primary key.
unique: true if the values in this column are unique.
default: the default value if this column is not explicitly set.
# File lib/dbd/mysql/database.rb, line 187 def columns(table) dbh = DBI::DatabaseHandle.new(self) uniques = [] dbh.execute("SHOW INDEX FROM #{table}") do |sth| sth.each do |row| uniques << row[4] if row[1] == 0 end end ret = nil dbh.execute("SHOW FIELDS FROM #{table}") do |sth| ret = sth.collect do |row| name, type, nullable, key, default, extra = row #type = row[1] #size = type[type.index('(')+1..type.index(')')-1] #size = 0 #type = type[0..type.index('(')-1] sqltype, type, size, decimal = mysql_type_info(row[1]) col = Hash.new col['name'] = name col['sql_type'] = sqltype col['type_name'] = type col['nullable'] = nullable == "YES" col['indexed'] = key != "" col['primary'] = key == "PRI" col['unique'] = uniques.index(name) != nil col['precision'] = size col['scale'] = decimal col['default'] = row[4] case col['type_name'] when 'timestamp' col['dbi_type'] = DBI::Type::Timestamp end col end # collect end # execute ret end
MySQL has several backends, some of which may not support commits. If the backend this database uses doesn't, calling this method will raise a DBI::NotSupportedError.
# File lib/dbd/mysql/database.rb, line 250 def commit if @have_transactions self.do("COMMIT") else raise NotSupportedError end rescue MyError => err error(err) end
# File lib/dbd/mysql/database.rb, line 152 def database_name sth = Statement.new(self, @handle, "select DATABASE()", @mutex) sth.execute res = sth.fetch sth.finish return res[0] end
# File lib/dbd/mysql/database.rb, line 145 def disconnect self.rollback unless @attr['AutoCommit'] @handle.close rescue MyError => err error(err) end
# File lib/dbd/mysql/database.rb, line 230 def do(stmt, *bindvars) st = Statement.new(self, @handle, stmt, @mutex) st.bind_params(*bindvars) res = st.execute st.finish return res rescue MyError => err error(err) end
# File lib/dbd/mysql/database.rb, line 160 def ping begin @handle.ping return true rescue MyError return false end end
# File lib/dbd/mysql/database.rb, line 241 def prepare(statement) Statement.new(self, @handle, statement, @mutex) end
See commit for information regarding transactionless database backends.
# File lib/dbd/mysql/database.rb, line 264 def rollback if @have_transactions self.do("ROLLBACK") else raise NotSupportedError end rescue MyError => err error(err) end
Generated with the Darkfish Rdoc Generator 2.