dohmysql 0.1.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.
- data/MIT-LICENSE +20 -0
- data/bin/makedb +28 -0
- data/lib/doh/mysql/abstract_row.rb +80 -0
- data/lib/doh/mysql/activate.rb +31 -0
- data/lib/doh/mysql/cache_connector.rb +54 -0
- data/lib/doh/mysql/connector_instance.rb +79 -0
- data/lib/doh/mysql/connector_util.rb +27 -0
- data/lib/doh/mysql/convert.rb +18 -0
- data/lib/doh/mysql/current_date.rb +22 -0
- data/lib/doh/mysql/database_creator.rb +101 -0
- data/lib/doh/mysql/db_date.rb +28 -0
- data/lib/doh/mysql/default_type_guesser.rb +37 -0
- data/lib/doh/mysql/error.rb +7 -0
- data/lib/doh/mysql/handle.rb +218 -0
- data/lib/doh/mysql/hash_row.rb +13 -0
- data/lib/doh/mysql/load_sql.rb +26 -0
- data/lib/doh/mysql/metadata_util.rb +73 -0
- data/lib/doh/mysql/parse.rb +36 -0
- data/lib/doh/mysql/raw_row_builder.rb +15 -0
- data/lib/doh/mysql/readonly_row.rb +26 -0
- data/lib/doh/mysql/require_dbtypes.rb +8 -0
- data/lib/doh/mysql/smart_row.rb +156 -0
- data/lib/doh/mysql/to_sql.rb +65 -0
- data/lib/doh/mysql/typed_row_builder.rb +28 -0
- data/lib/doh/mysql/types.rb +33 -0
- data/lib/doh/mysql/unquoted.rb +17 -0
- data/lib/doh/mysql/version.rb +102 -0
- data/lib/doh/mysql/virtual.rb +17 -0
- data/lib/doh/mysql/writable_row.rb +59 -0
- data/lib/doh/mysql.rb +7 -0
- data/test/cache_connector.dt.rb +41 -0
- data/test/connector.yml +4 -0
- data/test/connector.yml.tmpl +4 -0
- data/test/connector_instance.dt.rb +32 -0
- data/test/convert.dt.rb +45 -0
- data/test/db_unit_test.rb +10 -0
- data/test/handle.dt.rb +112 -0
- data/test/metadata_util.dt.rb +53 -0
- data/test/parse.dt.rb +39 -0
- data/test/readonly_row.dt.rb +85 -0
- data/test/smart_row.dt.rb +21 -0
- data/test/to_sql.dt.rb +19 -0
- data/test/types.dt.rb +32 -0
- data/test/unquoted.dt.rb +16 -0
- data/test/writable_row.dt.rb +21 -0
- metadata +118 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
module DohDb
|
2
|
+
|
3
|
+
class Unquoted < String
|
4
|
+
def to_sql
|
5
|
+
to_s
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.unquoted(str)
|
10
|
+
Unquoted.new(str)
|
11
|
+
end
|
12
|
+
|
13
|
+
NOW = Unquoted.new('NOW()').freeze
|
14
|
+
TODAY = Unquoted.new('CURDATE()').freeze
|
15
|
+
NULL = Unquoted.new('NULL').freeze
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'doh/mysql/connector_instance'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module DohDb
|
5
|
+
|
6
|
+
def self.locked_filename(database)
|
7
|
+
File.join(Doh::root, 'database', database, 'migrate/locked.yml')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.migration_filename(database, version, upordown = 'up')
|
11
|
+
version_str = version.to_s.rjust(3, '0')
|
12
|
+
File.join(Doh::root, 'database', database, "migrate/#{version_str}_#{upordown}.sql")
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.current_database_version(database = nil)
|
16
|
+
if database.nil?
|
17
|
+
table = 'version'
|
18
|
+
else
|
19
|
+
table = database + '.version'
|
20
|
+
end
|
21
|
+
DohDb::select_field("SELECT version FROM #{table}").to_i
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.latest_database_version(database = nil)
|
25
|
+
locked_version = locked_database_version(database)
|
26
|
+
unlocked_version = locked_version + 1
|
27
|
+
unlocked_migration_file = migration_filename(database, unlocked_version)
|
28
|
+
if File.exist?(unlocked_migration_file)
|
29
|
+
unlocked_version
|
30
|
+
else
|
31
|
+
locked_version
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.locked_version_info(database = nil)
|
36
|
+
database ||= (DohDb::connector_instance && DohDb::connector_instance.database) || Doh::config['primary_database']
|
37
|
+
filename = locked_filename(database)
|
38
|
+
return [0, nil] unless File.exist?(filename)
|
39
|
+
YAML.load_file(filename)
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.locked_database_version(database = nil)
|
43
|
+
locked_version_info(database).first
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.locked_svn_revision(database = nil)
|
47
|
+
locked_version_info(database).last
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.update_locked_file(database)
|
51
|
+
locked_file = locked_filename(database)
|
52
|
+
if File.exist?(locked_file)
|
53
|
+
new_version = YAML.load_file(locked_file).first + 1
|
54
|
+
else
|
55
|
+
new_version = 0
|
56
|
+
need_to_add = true
|
57
|
+
end
|
58
|
+
|
59
|
+
file_to_check = ''
|
60
|
+
if need_to_add
|
61
|
+
file_to_check = File.join(Doh::root, "database")
|
62
|
+
else
|
63
|
+
unlocked_migration_file = migration_filename(database, new_version)
|
64
|
+
return [true, "nothing to lock"] unless File.exist?(unlocked_migration_file)
|
65
|
+
|
66
|
+
svnout = `svn st #{unlocked_migration_file}`
|
67
|
+
unless svnout.strip.empty?
|
68
|
+
return [false, "svn status shows local changes to #{unlocked_migration_file} -- this needs to be resolved before updating the migration locked file"]
|
69
|
+
end
|
70
|
+
|
71
|
+
file_to_check = unlocked_migration_file
|
72
|
+
end
|
73
|
+
|
74
|
+
`svn update #{file_to_check}`
|
75
|
+
svnout = `svn st -v #{file_to_check}`.split("\n")
|
76
|
+
svnout =~ /(\d+)/
|
77
|
+
revision = svnout.collect {|elem| elem =~ /(\d+)/; $1.to_i}.max
|
78
|
+
if !revision
|
79
|
+
return [false, "unable to extract svn revision from: '#{svnout}'"]
|
80
|
+
end
|
81
|
+
|
82
|
+
outfile = File.new(locked_file, 'w')
|
83
|
+
outfile.puts([new_version, revision.to_i].inspect)
|
84
|
+
outfile.close
|
85
|
+
|
86
|
+
if need_to_add
|
87
|
+
svnout = `svn add #{locked_file}`
|
88
|
+
if svnout[0,1] != 'A'
|
89
|
+
return [false, "failed to svn add #{locked_file}"]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
msg = "migrate lock for #{database} database, version #{new_version}"
|
94
|
+
svnout = `svn ci -m \"#{msg}\" #{locked_file}`
|
95
|
+
unless svnout.index("Committed revision")
|
96
|
+
return [false, "failed to svn ci #{locked_file}"]
|
97
|
+
end
|
98
|
+
|
99
|
+
[true, "#{locked_file} successfully updated"]
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'doh/mysql/metadata_util'
|
2
|
+
require 'doh/mysql/readonly_row'
|
3
|
+
require 'doh/mysql/types'
|
4
|
+
|
5
|
+
module DohDb
|
6
|
+
|
7
|
+
class LinkedRow
|
8
|
+
def self.build(field, idvalue)
|
9
|
+
return ReadOnlyRow.new([], []) if idvalue.to_i == 0
|
10
|
+
table = field.sub(/_id/, '')
|
11
|
+
table = table.rafter('_') unless DohDb::table_exist?(table)
|
12
|
+
raise "unable to determine child table name for field #{field}" unless DohDb::table_exist?(table)
|
13
|
+
DohDb::select_row("SELECT * FROM #{table} WHERE #{DohDb::find_primary_key(table)} = #{idvalue}", DohDb::find_row_type(table) || :smart)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'doh/core_ext/string'
|
2
|
+
require 'doh/mysql/abstract_row'
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
module DohDb
|
6
|
+
|
7
|
+
class WritableRow < AbstractRow
|
8
|
+
attr_reader :changed_keys
|
9
|
+
|
10
|
+
# can accept 2 arguments: keys array, values array
|
11
|
+
# or 1 argument: a hash
|
12
|
+
def initialize(*args)
|
13
|
+
keys, values = parse_initialize_args(*args)
|
14
|
+
@keys = keys.dup
|
15
|
+
@values = values.dup
|
16
|
+
@changed_keys = Set.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize_copy(orig)
|
20
|
+
super(orig)
|
21
|
+
@changed_keys = Set.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def set(key, value)
|
25
|
+
index = @keys.index(key)
|
26
|
+
if index
|
27
|
+
@values[index] = value
|
28
|
+
else
|
29
|
+
@keys.push(key)
|
30
|
+
@values.push(value)
|
31
|
+
end
|
32
|
+
@changed_keys.add(key)
|
33
|
+
value
|
34
|
+
end
|
35
|
+
alias []= set
|
36
|
+
|
37
|
+
def clear_changed_keys
|
38
|
+
@changed_keys.clear
|
39
|
+
end
|
40
|
+
|
41
|
+
def method_missing(sym, *args)
|
42
|
+
name = sym.to_s
|
43
|
+
if name.lastn(1) == '='
|
44
|
+
key = name[0..-2]
|
45
|
+
assign = true
|
46
|
+
else
|
47
|
+
key = name
|
48
|
+
end
|
49
|
+
raise RuntimeError.new("unknown field: " + name) unless key?(key)
|
50
|
+
|
51
|
+
if assign
|
52
|
+
set(key, args.first)
|
53
|
+
else
|
54
|
+
get(key)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
data/lib/doh/mysql.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'db_unit_test'
|
2
|
+
|
3
|
+
module DohDb
|
4
|
+
|
5
|
+
class Test_CacheConnector < DohTest::TestGroup
|
6
|
+
def create_table
|
7
|
+
@cc.request_handle.query("CREATE TEMPORARY TABLE #@tbl (id INT AUTO_INCREMENT KEY)")
|
8
|
+
end
|
9
|
+
|
10
|
+
def insert_record
|
11
|
+
@cc.request_handle.insert("INSERT INTO #@tbl (id) VALUES (null)")
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_stuff
|
15
|
+
sharedcc = DohDb::connector_instance
|
16
|
+
@cc = DohDb::CacheConnector.new(sharedcc.host, sharedcc.username, sharedcc.password, sharedcc.database, sharedcc.row_builder)
|
17
|
+
@tbl = 'doh_mysql_cache_connector_stuff_test'
|
18
|
+
|
19
|
+
create_table
|
20
|
+
assert_equal(1, insert_record)
|
21
|
+
|
22
|
+
dbh = @cc.request_handle
|
23
|
+
assert_equal(2, insert_record)
|
24
|
+
dbh.close
|
25
|
+
# temporary table gets deleted on handle close
|
26
|
+
create_table
|
27
|
+
|
28
|
+
#test it resets the handle
|
29
|
+
@cc.reset
|
30
|
+
create_table
|
31
|
+
@cc.reset
|
32
|
+
@cc.reset
|
33
|
+
|
34
|
+
# test it still works after timeout
|
35
|
+
create_table
|
36
|
+
@cc.timeout = -1
|
37
|
+
create_table
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/test/connector.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative 'db_unit_test'
|
2
|
+
|
3
|
+
module DohDb
|
4
|
+
|
5
|
+
class Test_ConnectorInstance < DohTest::TestGroup
|
6
|
+
def test_stuff
|
7
|
+
tbl = "doh_mysql_connector_instance_stuff_test"
|
8
|
+
DohDb::query("CREATE TEMPORARY TABLE #{tbl} (id INT UNSIGNED AUTO_INCREMENT NOT NULL KEY, value INT NOT NULL DEFAULT 0, created_on DATE, created_at DATETIME, money DECIMAL(7,2) NOT NULL DEFAULT 0)")
|
9
|
+
assert_equal(1, DohDb::insert("INSERT INTO #{tbl} (id, created_on, created_at, money) VALUES (null, CURDATE(), '2007-01-01 10:30:05', 10.5)"))
|
10
|
+
assert_equal(2, DohDb::insert("INSERT INTO #{tbl} (id, created_on) VALUES (null, 0)"))
|
11
|
+
assert_equal(1, DohDb::update("UPDATE #{tbl} SET money = 10.8 WHERE id = 1"))
|
12
|
+
assert_equal(BigDecimal('10.80'), DohDb::select_field("SELECT money FROM #{tbl} WHERE id = 1"))
|
13
|
+
assert_raises(UnexpectedQueryResult) {DohDb::select_row("SELECT * FROM #{tbl} WHERE id = 7")}
|
14
|
+
assert_equal(nil, DohDb::select_optional_row("SELECT * FROM #{tbl} WHERE id = 7"))
|
15
|
+
assert_raises(UnexpectedQueryResult){DohDb::select_optional_row("SELECT * FROM #{tbl} WHERE id < 3")}
|
16
|
+
assert_equal(nil, DohDb::select_optional_field("SELECT money FROM #{tbl} WHERE id = 7"))
|
17
|
+
assert_raises(UnexpectedQueryResult) {DohDb::select_field("SELECT money FROM #{tbl} WHERE id = 7")}
|
18
|
+
assert_equal(1, DohDb::update_row("UPDATE #{tbl} SET money = 10.95 WHERE id = 1"))
|
19
|
+
assert_raises(Mysql::Error){DohDb::query("some invalid sql here")}
|
20
|
+
# TODO: re-enable
|
21
|
+
# assert(DohTest::pop_error)
|
22
|
+
assert_raises(UnexpectedQueryResult) {DohDb::update_row("UPDATE #{tbl} SET money = 10.95 WHERE id = 7")}
|
23
|
+
onerow = DohDb::select_row("SELECT * FROM #{tbl} WHERE id = 1")
|
24
|
+
assert_equal(1, onerow['id'])
|
25
|
+
onerow = DohDb::select_optional_row("SELECT * FROM #{tbl} WHERE id = 1")
|
26
|
+
assert_equal(1, onerow['id'])
|
27
|
+
rows = DohDb::select("SELECT * FROM #{tbl}")
|
28
|
+
rows.each {|row| assert(row['id'] != 0)}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/test/convert.dt.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative 'db_unit_test'
|
2
|
+
require 'doh/mysql/convert'
|
3
|
+
|
4
|
+
module DohDb
|
5
|
+
|
6
|
+
class Test_Convert < DohTest::TestGroup
|
7
|
+
def before_each
|
8
|
+
@tbl = "doh_mysql_convert_tests"
|
9
|
+
DohDb::query("DROP TABLE IF EXISTS #@tbl")
|
10
|
+
DohDb::request_handle.query("CREATE TABLE #{@tbl} (not_null_field CHAR(1) NOT NULL, null_ok_field CHAR(1), int_field INT, bool_field TINYINT(1), date_field DATE, datetime_field DATETIME)")
|
11
|
+
end
|
12
|
+
|
13
|
+
def after_each
|
14
|
+
DohDb::query("DROP TABLE IF EXISTS #@tbl")
|
15
|
+
end
|
16
|
+
|
17
|
+
def convert(value)
|
18
|
+
DohDb::convert(@tbl, @field, value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def verify(converted, original)
|
22
|
+
assert_equal(converted, convert(original))
|
23
|
+
end
|
24
|
+
|
25
|
+
def verify_same(value)
|
26
|
+
verify(value, value)
|
27
|
+
end
|
28
|
+
|
29
|
+
def verify_exception(value, exception_class)
|
30
|
+
assert_raises(exception_class) { convert(value) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_nil_null
|
34
|
+
# assert_raises(UnknownColumn) { DohDb::convert('some_table_that_doesnt_exist', 'some_column_that_doesnt_exist', 'blah') }
|
35
|
+
assert_equal('blah', DohDb::convert('some_table_that_doesnt_exist', 'some_column_that_doesnt_exist', 'blah'))
|
36
|
+
assert_equal('blah', DohDb::convert('', 'some_column_that_doesnt_exist', 'blah'))
|
37
|
+
assert_raises(CannotBeNull) { DohDb::convert(@tbl, 'not_null_field', nil) }
|
38
|
+
assert_equal(nil, DohDb::convert(@tbl, 'null_ok_field', nil))
|
39
|
+
assert_equal('', DohDb::convert(@tbl, 'not_null_field', ''))
|
40
|
+
assert_equal(nil, DohDb::convert(@tbl, 'null_ok_field', ''))
|
41
|
+
assert_equal(nil, DohDb::convert(@tbl, 'int_field', ''))
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'doh/mysql/connector_instance'
|
2
|
+
require 'doh/mysql/cache_connector'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
config_filename = File.join(File.dirname(__FILE__), 'connector.yml')
|
6
|
+
raise RuntimeError.new("mysql connector configuration file (#{config_filename}) must exist (see #{config_filename}.tmpl for an example)") unless File.exist?(config_filename)
|
7
|
+
config = YAML.load_file(config_filename)
|
8
|
+
|
9
|
+
connector = DohDb::CacheConnector.new(config['host'], config['username'], config['password'], config['database'])
|
10
|
+
DohDb::set_connector_instance(connector)
|
data/test/handle.dt.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require_relative 'db_unit_test'
|
2
|
+
require 'doh/core_ext/hash'
|
3
|
+
|
4
|
+
module DohDb
|
5
|
+
|
6
|
+
class Test_Handle < DohTest::TestGroup
|
7
|
+
def test_stuff
|
8
|
+
dbh = DohDb::request_handle
|
9
|
+
tbl = "doh_mysql_handle_stuff_test"
|
10
|
+
dbh.query("CREATE TEMPORARY TABLE #{tbl} (id INT UNSIGNED AUTO_INCREMENT NOT NULL KEY, value INT NOT NULL DEFAULT 0, created_on DATE, created_at DATETIME, money DECIMAL(7,2) NOT NULL DEFAULT 0)")
|
11
|
+
assert_equal(1, dbh.insert("INSERT INTO #{tbl} (id, created_on, created_at, money) VALUES (null, CURDATE(), '2007-01-01 10:30:05', 10.5)"))
|
12
|
+
assert_equal(2, dbh.insert("INSERT INTO #{tbl} (id, created_on, created_at) VALUES (null, 0, 0)"))
|
13
|
+
assert_equal(3, dbh.insert("INSERT INTO #{tbl} (id) VALUES (null)"))
|
14
|
+
onerow = dbh.select_row("SELECT * FROM #{tbl} WHERE id = 1")
|
15
|
+
assert_equal(1, onerow['id'])
|
16
|
+
rows = dbh.select("SELECT * FROM #{tbl}")
|
17
|
+
rows.each {|row| assert(row['id'] != 0)}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_select_transpose_2fields
|
21
|
+
dbh = DohDb::request_handle
|
22
|
+
tbl = "doh_mysql_handle_select_transpose_2fields_test"
|
23
|
+
DohDb::query("CREATE TEMPORARY TABLE #{tbl} (field CHAR(30) NOT NULL, value CHAR(30) NOT NULL)")
|
24
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'some_name', value = 'some_value'")
|
25
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'other_name', value = 'matching_other_value'")
|
26
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'yet_another_name', value = 'strange_value'")
|
27
|
+
hash = DohDb::select_transpose("SELECT field, value FROM #{tbl}")
|
28
|
+
assert_equal('some_value', hash['some_name'])
|
29
|
+
assert_equal('matching_other_value', hash['other_name'])
|
30
|
+
assert_equal('strange_value', hash['yet_another_name'])
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_select_transpose_3fields
|
34
|
+
dbh = DohDb::request_handle
|
35
|
+
tbl = "doh_mysql_handle_select_transpose_3fields_test"
|
36
|
+
DohDb::query("CREATE TEMPORARY TABLE #{tbl} (field CHAR(30), some_value CHAR(30), other_value CHAR(30))")
|
37
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'some_name', some_value = 'some_value', other_value = 'blah'")
|
38
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'other_name', some_value = 'matching_other_value', other_value = 'blee'")
|
39
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'yet_another_name', some_value = 'strange_value', other_value = 'bloo'")
|
40
|
+
hash = DohDb::select_transpose("SELECT field, some_value, other_value FROM #{tbl}")
|
41
|
+
assert_equal(hash['some_name'], {'some_value' => 'some_value', 'other_value' => 'blah'})
|
42
|
+
assert_equal(hash['other_name'], {'some_value' => 'matching_other_value', 'other_value' => 'blee'})
|
43
|
+
assert_equal(hash['yet_another_name'], {'some_value' => 'strange_value', 'other_value' => 'bloo'})
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_select_values
|
47
|
+
dbh = DohDb::request_handle
|
48
|
+
tbl = "doh_mysql_handle_select_values_test"
|
49
|
+
DohDb::query("CREATE TEMPORARY TABLE #{tbl} (field CHAR(30), some_value CHAR(30))")
|
50
|
+
DohDb::query("INSERT INTO #{tbl} SET field = 'some_name', some_value = 'some_value'")
|
51
|
+
assert_equal([['some_name', 'some_value']], DohDb::select_values("SELECT field, some_value FROM #{tbl}"))
|
52
|
+
assert_equal([['some_name']], DohDb::select_values("SELECT field FROM #{tbl}"))
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_multi_select
|
56
|
+
dbh = DohDb::request_handle
|
57
|
+
tbl = "doh_mysql_handle_multi_select_test"
|
58
|
+
DohDb::query("CREATE TEMPORARY TABLE #{tbl} (value CHAR(30))")
|
59
|
+
DohDb::query("INSERT INTO #{tbl} SET value = 'first'")
|
60
|
+
DohDb::query("INSERT INTO #{tbl} SET value = 'second'")
|
61
|
+
|
62
|
+
stmts = []
|
63
|
+
stmts.push("SELECT * FROM #{tbl}")
|
64
|
+
stmts.push("INSERT INTO #{tbl} SET value = 'third'")
|
65
|
+
stmts.push(["SELECT * FROM #{tbl}", :hash])
|
66
|
+
stmts.push("SELECT * FROM #{tbl}")
|
67
|
+
stmts.push("INSERT INTO #{tbl} SET value = 'fourth'")
|
68
|
+
stmts.push(["SELECT * FROM #{tbl}", :smart])
|
69
|
+
select_results = DohDb::multi_select(stmts)
|
70
|
+
assert_equal(4, select_results.size)
|
71
|
+
assert_equal(4, DohDb::select_field("SELECT COUNT(*) FROM #{tbl}"))
|
72
|
+
|
73
|
+
curr_select = select_results[0]
|
74
|
+
assert_equal(2, curr_select.size)
|
75
|
+
assert_instance_of(ReadOnlyRow, curr_select[0])
|
76
|
+
assert_equal({'value' => 'first'}, curr_select[0].to_h)
|
77
|
+
assert_equal({'value' => 'second'}, curr_select[1].to_h)
|
78
|
+
|
79
|
+
curr_select = select_results[1]
|
80
|
+
assert_equal(3, curr_select.size)
|
81
|
+
assert_instance_of(Hash, curr_select[0])
|
82
|
+
assert_equal({'value' => 'first'}, curr_select[0].to_h)
|
83
|
+
assert_equal({'value' => 'second'}, curr_select[1].to_h)
|
84
|
+
assert_equal({'value' => 'third'}, curr_select[2].to_h)
|
85
|
+
|
86
|
+
curr_select = select_results[2]
|
87
|
+
assert_equal(3, curr_select.size)
|
88
|
+
assert_equal({'value' => 'first'}, curr_select[0].to_h)
|
89
|
+
assert_equal({'value' => 'second'}, curr_select[1].to_h)
|
90
|
+
assert_equal({'value' => 'third'}, curr_select[2].to_h)
|
91
|
+
|
92
|
+
curr_select = select_results[3]
|
93
|
+
assert_equal(4, curr_select.size)
|
94
|
+
assert_instance_of(SmartRow, curr_select[0])
|
95
|
+
assert_equal({'value' => 'first'}, curr_select[0].to_h)
|
96
|
+
assert_equal({'value' => 'second'}, curr_select[1].to_h)
|
97
|
+
assert_equal({'value' => 'third'}, curr_select[2].to_h)
|
98
|
+
assert_equal({'value' => 'fourth'}, curr_select[3].to_h)
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_insert_hash
|
102
|
+
dbh = DohDb::request_handle
|
103
|
+
tbl = "doh_mysql_insert_hash_test"
|
104
|
+
dbh.query("CREATE TEMPORARY TABLE #{tbl} (value INT KEY)")
|
105
|
+
hash1 = {'value' => 1}
|
106
|
+
assert_equal(0, dbh.insert_hash(hash1, tbl))
|
107
|
+
assert_raises(Mysql::Error) { dbh.insert_hash(hash1, tbl) }
|
108
|
+
assert_equal(0, dbh.insert_hash(hash1, tbl, true))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative 'db_unit_test'
|
2
|
+
require 'doh/mysql/metadata_util'
|
3
|
+
|
4
|
+
module DohDb
|
5
|
+
|
6
|
+
class Test_metadata_util < DohTest::TestGroup
|
7
|
+
def tbl
|
8
|
+
"doh_mysql_metadata_util_test"
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_stuff
|
12
|
+
dbh = DohDb::request_handle
|
13
|
+
dbh.query("CREATE TABLE #{tbl} (num INT, str CHAR(7))")
|
14
|
+
column_info = DohDb::column_info(tbl)
|
15
|
+
info = column_info['str']
|
16
|
+
assert_equal('char', info['data_type'])
|
17
|
+
assert_equal(7, info['character_maximum_length'])
|
18
|
+
info = column_info['num']
|
19
|
+
assert_equal('int', info['data_type'])
|
20
|
+
assert_equal(nil, info['character_maximum_length'])
|
21
|
+
|
22
|
+
assert_equal(7, DohDb::field_character_size(tbl, 'str'))
|
23
|
+
assert_equal(nil, DohDb::field_character_size(tbl, 'num'))
|
24
|
+
|
25
|
+
row = {'num' => 'blahblahblah', 'str' => 'blahblahblah'}
|
26
|
+
DohDb::chop_character_fields!(tbl, row)
|
27
|
+
assert_equal('blahblahblah', row['num'])
|
28
|
+
assert_equal('blahbla', row['str'])
|
29
|
+
|
30
|
+
row = {'num' => 'blahblahblah', 'str' => 'blahblahblah'}
|
31
|
+
newrow = DohDb::chop_character_fields(tbl, row)
|
32
|
+
assert_equal('blahblahblah', newrow['num'])
|
33
|
+
assert_equal('blahbla', newrow['str'])
|
34
|
+
assert_equal('blahblahblah', row['num'])
|
35
|
+
assert_equal('blahblahblah', row['str'])
|
36
|
+
|
37
|
+
assert(DohDb::table_exist?(tbl))
|
38
|
+
|
39
|
+
assert_equal('num', DohDb::find_primary_key(tbl))
|
40
|
+
assert_raises(RuntimeError) { DohDb::find_primary_key(tbl, "this_database_doesnt_exist") }
|
41
|
+
assert_raises(RuntimeError) { DohDb::find_primary_key("this table doesn't exist") }
|
42
|
+
end
|
43
|
+
|
44
|
+
def before_each
|
45
|
+
DohDb::query("DROP TABLE IF EXISTS #{tbl}")
|
46
|
+
end
|
47
|
+
|
48
|
+
def after_each
|
49
|
+
DohDb::query("DROP TABLE IF EXISTS #{tbl}")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/test/parse.dt.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'doh/mysql/parse'
|
2
|
+
|
3
|
+
module DohDb
|
4
|
+
|
5
|
+
class Test_Parse < DohTest::TestGroup
|
6
|
+
def test_bool
|
7
|
+
assert_equal(false, DohDb::parse_bool('0'))
|
8
|
+
assert_equal(true, DohDb::parse_bool('1'))
|
9
|
+
assert_raises(ArgumentError) {DohDb::parse_bool('blah')}
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_date
|
13
|
+
assert_raises(ArgumentError) {DohDb::parse_date('blah')}
|
14
|
+
assert_equal(Date.new(2008,2,14), DohDb::parse_date('2008-02-14'))
|
15
|
+
assert_raises(ArgumentError) {DohDb::parse_date('20080214')}
|
16
|
+
assert_not_equal(Date.new(2008,2,14), DohDb::parse_date('2008-02-15'))
|
17
|
+
assert_equal(nil, DohDb::parse_date('0000-00-00'))
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_datetime
|
21
|
+
assert_raises(ArgumentError) {DohDb::parse_date('blah')}
|
22
|
+
assert_raises(ArgumentError) {DohDb::parse_datetime('zzzzzzzzzzzzzzzzzzz')}
|
23
|
+
assert_equal(DateTime.new(2008,2,14,10,20,30), DohDb::parse_datetime('2008-02-14 10:20:30'))
|
24
|
+
assert_not_equal(DateTime.new(2008,2,14,10,20,30), DohDb::parse_datetime('2008-02-14 10:20:31'))
|
25
|
+
assert_equal(nil, DohDb::parse_datetime('0000-00-00 00:00:00'))
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_decimal
|
29
|
+
assert_equal(BigDecimal.new('3.14'), DohDb::parse_decimal('3.14'))
|
30
|
+
assert_equal(BigDecimal.new('0.0'), DohDb::parse_decimal('sjdkflsdjl'))
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_int
|
34
|
+
assert_equal(3, DohDb::parse_int('3'))
|
35
|
+
assert_equal(0, DohDb::parse_int('sjdkflsdjl'))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'doh/mysql/readonly_row'
|
2
|
+
|
3
|
+
module DohDb
|
4
|
+
|
5
|
+
class Test_ReadOnlyRow < DohTest::TestGroup
|
6
|
+
def before_each
|
7
|
+
@row = ReadOnlyRow.new(['id', 'fname', 'lname', 'other', 'flag', 'emptystr'], [3, 'george', 'bob', nil, true, ''])
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_keys
|
11
|
+
assert_equal(['id', 'fname', 'lname', 'other', 'flag', 'emptystr'], @row.keys)
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_at_bad
|
15
|
+
assert_raises(TypeError) {@row.at(nil)}
|
16
|
+
assert_raises(TypeError) {@row.at('id')}
|
17
|
+
assert_equal(nil, @row.at(8))
|
18
|
+
assert_equal(nil, @row.at(-10))
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_bracket_get_bad
|
22
|
+
assert_equal(nil, @row[nil])
|
23
|
+
assert_equal(nil, @row['blee'])
|
24
|
+
assert_equal(nil, @row[8])
|
25
|
+
assert_equal(nil, @row[-10])
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_bracket_get_valid
|
29
|
+
assert_equal(3, @row['id'])
|
30
|
+
assert_equal('george', @row['fname'])
|
31
|
+
assert_equal('bob', @row['lname'])
|
32
|
+
assert_equal(nil, @row['other'])
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_key_exists_bad
|
36
|
+
assert_equal(false, @row.key?(nil))
|
37
|
+
assert_equal(false, @row.key?('blee'))
|
38
|
+
assert_equal(false, @row.key?(8))
|
39
|
+
assert_equal(false, @row.key?(-10))
|
40
|
+
assert_equal(false, @row.key?(-10))
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_key_exists_valid
|
44
|
+
assert_equal(true, @row.key?('id'))
|
45
|
+
assert_equal(true, @row.key?('fname'))
|
46
|
+
assert_equal(true, @row.key?('lname'))
|
47
|
+
assert_equal(true, @row.key?('other'))
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_to_a
|
51
|
+
ary = @row.to_a
|
52
|
+
assert_equal(6, ary.size)
|
53
|
+
assert_equal(['id', 3], ary.at(0))
|
54
|
+
assert_equal(['fname','george'], ary.at(1))
|
55
|
+
assert_equal(['lname', 'bob'], ary.at(2))
|
56
|
+
assert_equal(['other', nil], ary.at(3))
|
57
|
+
assert_equal(['flag', true], ary.at(4))
|
58
|
+
assert_equal(['emptystr', ''], ary.at(5))
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_to_h
|
62
|
+
hsh = @row.to_h
|
63
|
+
assert_equal(6, hsh.size)
|
64
|
+
assert_equal(3, hsh['id'])
|
65
|
+
assert_equal('george', hsh['fname'])
|
66
|
+
assert_equal('bob', hsh['lname'])
|
67
|
+
assert_equal(nil, hsh['other'])
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_method_missing
|
71
|
+
assert_equal('george', @row.fname)
|
72
|
+
assert_equal('bob', @row.lname)
|
73
|
+
assert_equal(nil, @row.other)
|
74
|
+
assert_raises(RuntimeError) {@row.this_field_doesnt_exist}
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_empty_field
|
78
|
+
assert(!@row.empty_field?('id'))
|
79
|
+
assert(@row.empty_field?('other'))
|
80
|
+
assert(@row.empty_field?('emptystr'))
|
81
|
+
assert(@row.empty_field?('unknown_field_name'))
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'doh/mysql/smart_row'
|
2
|
+
|
3
|
+
module DohDb
|
4
|
+
|
5
|
+
class Test_SmartRow < DohTest::TestGroup
|
6
|
+
def test_display
|
7
|
+
row = SmartRow.new(['flag'], [true])
|
8
|
+
assert_equal('', row.display('this_field_doesnt_exist'))
|
9
|
+
assert_raises(RuntimeError) { row.display.this_field_doesnt_exist }
|
10
|
+
assert_equal('yes', row.display('flag'))
|
11
|
+
assert_equal('yes', row.display.flag)
|
12
|
+
row2 = row.dup
|
13
|
+
assert_equal(true, row2.flag)
|
14
|
+
row2.flag = false
|
15
|
+
assert_equal(false, row2.flag)
|
16
|
+
assert_equal(true, row.flag)
|
17
|
+
assert_raises(RuntimeError) { row.this_field_doesnt_exist }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|