DataObjects
May 11, 2015
DataObjects
Dirkjan Bussink
© Jon Truran
Text
Sorry for the photoshop skills...
connection = Mysql.real_connect("localhost", "root", "", "do_test")reader = connection.query("SELECT login, password FROM users")reader.each do |row| row[0] => 'dbussink' row[1] => 'secret'end
connection = OCI8.new("root", "", "localhost")reader = connection.exec("SELECT login, password FROM users")while row = reader.fetch row[0] => 'dbussink' row[1] => 'secret'end
connection = PGconn.connect("localhost", 5432, nil, nil, "do_test", "root", "")reader = connection.exec("SELECT login, password FROM users")
for i in 0...reader.ntuples do reader.getvalue(i,0) => 'dbussink' reader.getvalue(i,1) => 'secret'end
connection = SQLite3::Database.new("do_test.db")reader = connection.execute("SELECT login, password FROM users")
reader[0][0] => 'dbussink'reader[0][1] => 'secret'
It’s all about the API
connection = DataObjects::Connection.new("mysql://root@localhost/do_test")command = connection.create_command("INSERT INTO users (login) VALUES ('dbussink')")result = command.execute_non_query
result.affected_rows => 1result.insert_id => 2
connection = DataObjects::Connection.new("mysql://root@localhost/do_test")command = connection.create_command("SELECT id, login, created_at FROM users")reader = command.execute_reader
reader.fields => ['id', 'login', 'created_at']
while reader.next! reader.values => [1, 'dbussink', Date.civil(2009, 5, 10)]end
Typecasting
connection = DataObjects::Connection.new("mysql://root@localhost/do_test")command = connection.create_command("SELECT id, login, created_at FROM users")command.set_types(String, String, String)reader = command.execute_reader
reader.fields => ['id', 'login', 'created_at']
while reader.next! reader.values => ['1', 'dbussink', '2009-5-10']end
connection = DataObjects::Connection.new("mysql://root@localhost/do_test")
command = connection.create_command("SELECT id, login, password FROM users WHERE login = ?")reader = command.execute_reader('dbussink')reader.fields => ['id', 'login', 'created_at']
while reader.next! reader.values => [1, 'dbussink', Date.civil(2009, 5, 10)]end
IntegerString
Float
BigDecimalDate
DateTimeTrueClass
Shared specs
describe DataObjects::Postgres::Command do it_should_behave_like 'a Command' it_should_behave_like 'a Command with async'end
describe DataObjects::Postgres::Command do it_should_behave_like 'a Command' it_should_behave_like 'a Command with async'end
Implement standard Command API
describe DataObjects::Postgres::Command do it_should_behave_like 'a Command' it_should_behave_like 'a Command with async'end
Implement standard Command API
Command is green thread friendly
describe 'DataObjects::Postgres with BigDecimal' do it_should_behave_like 'supporting BigDecimal' it_should_behave_like 'supporting BigDecimal autocasting'end
describe 'DataObjects::Postgres with BigDecimal' do it_should_behave_like 'supporting BigDecimal' it_should_behave_like 'supporting BigDecimal autocasting'end
Deserialize and serialize BigDecimal
describe 'DataObjects::Postgres with BigDecimal' do it_should_behave_like 'supporting BigDecimal' it_should_behave_like 'supporting BigDecimal autocasting'end
Deserialize and serialize BigDecimal
Database provides a mapped type (DECIMAL)
How can I help?
Improved transactions
Prepared statements
Specs!And documentation too :)
ActiveRecord adapter