shard-crystal-db/src/db/driver.cr

60 lines
1.7 KiB
Crystal

module DB
# Database driver implementors must subclass `Driver`,
# register with a driver_name using `DB#register_driver` and
# override the factory method `#connection_builder`.
#
# ```
# require "db"
#
# class FakeDriver < DB::Driver
# class FakeConnectionBuilder < DB::ConnectionBuilder
# def initialize(@options : DB::Connection::Options)
# end
#
# def build : DB::Connection
# FakeConnection.new(@options)
# end
# end
#
# def connection_builder(uri : URI) : ConnectionBuilder
# params = HTTP::Params.parse(uri.query || "")
# options = connection_options(params)
# # If needed, parse custom options from uri here
# # so they are parsed only once.
# FakeConnectionBuilder.new(options)
# end
# end
#
# DB.register_driver "fake", FakeDriver
# ```
#
# Access to this fake database will be available with
#
# ```
# DB.open "fake://..." do |db|
# # ... use db ...
# end
# ```
#
# Refer to `Connection`, `Statement` and `ResultSet` for further
# driver implementation instructions.
#
# Override `#connection_options` and `#pool_options` to provide custom
# defaults or parsing of the connection string URI.
abstract class Driver
# Returns a new connection factory.
#
# NOTE: For implementors *uri* should be parsed once. If all the options
# are sound a ConnectionBuilder is returned.
abstract def connection_builder(uri : URI) : ConnectionBuilder
def connection_options(params : HTTP::Params) : Connection::Options
Connection::Options.from_http_params(params)
end
def pool_options(params : HTTP::Params) : Pool::Options
Pool::Options.from_http_params(params)
end
end
end