dbd-mysql 0.4.1 → 0.4.2
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/lib/dbd/Mysql.rb +1 -1
- data/lib/dbd/mysql/statement.rb +1 -1
- data/test/dbd/general/test_database.rb +29 -7
- data/test/dbd/general/test_statement.rb +38 -7
- data/test/dbd/general/test_types.rb +28 -0
- data/test/dbd/mysql/up.sql +1 -1
- metadata +2 -2
data/lib/dbd/Mysql.rb
CHANGED
data/lib/dbd/mysql/statement.rb
CHANGED
@@ -140,7 +140,7 @@ module DBI::DBD::Mysql
|
|
140
140
|
'sql_type' => sql_type,
|
141
141
|
'type_name' => type_name,
|
142
142
|
# XXX it seems mysql counts the literal decimal point when weighing in the "length".
|
143
|
-
'precision' =>
|
143
|
+
'precision' => type_name == "NUMERIC" ? col.length - 2 : col.length,
|
144
144
|
'scale' => col.decimals,
|
145
145
|
'nullable' => !col.is_not_null?,
|
146
146
|
'indexed' => ((col.flags & indexed) != 0) ||
|
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
assert(cols)
|
13
13
|
assert_kind_of(Array, cols)
|
14
|
-
assert_equal(
|
14
|
+
assert_equal(4, cols.length)
|
15
15
|
|
16
16
|
# the first column should always be "text_field" and have the following
|
17
17
|
# properties:
|
@@ -30,19 +30,41 @@
|
|
30
30
|
end
|
31
31
|
|
32
32
|
assert_equal(
|
33
|
-
DBI::Type::Varchar,
|
34
|
-
DBI::TypeUtil.type_name_to_module(cols[0]["type_name"])
|
33
|
+
DBI::Type::Varchar.object_id,
|
34
|
+
DBI::TypeUtil.type_name_to_module(cols[0]["type_name"]).object_id
|
35
35
|
)
|
36
36
|
|
37
37
|
# the second column should always be "integer_field" and have the following
|
38
38
|
# properties:
|
39
39
|
assert_equal("integer_field", cols[1]["name"])
|
40
40
|
assert(cols[1]["nullable"])
|
41
|
-
assert_equal(1, cols[
|
42
|
-
assert_equal(2, cols[
|
41
|
+
assert_equal(1, cols[2]["scale"])
|
42
|
+
assert_equal(2, cols[2]["precision"])
|
43
43
|
assert_equal(
|
44
|
-
DBI::Type::
|
45
|
-
DBI::TypeUtil.type_name_to_module(cols[1]["type_name"])
|
44
|
+
DBI::Type::Integer.object_id,
|
45
|
+
DBI::TypeUtil.type_name_to_module(cols[1]["type_name"]).object_id
|
46
|
+
)
|
47
|
+
|
48
|
+
# the second column should always be "integer_field" and have the following
|
49
|
+
# properties:
|
50
|
+
assert_equal("decimal_field", cols[2]["name"])
|
51
|
+
assert(cols[2]["nullable"])
|
52
|
+
assert_equal(1, cols[2]["scale"])
|
53
|
+
assert_equal(2, cols[2]["precision"])
|
54
|
+
assert_equal(
|
55
|
+
DBI::Type::Decimal.object_id,
|
56
|
+
DBI::TypeUtil.type_name_to_module(cols[2]["type_name"]).object_id
|
57
|
+
)
|
58
|
+
|
59
|
+
# the second column should always be "numeric_field" and have the following
|
60
|
+
# properties:
|
61
|
+
assert_equal("numeric_field", cols[3]["name"])
|
62
|
+
assert(cols[3]["nullable"])
|
63
|
+
assert_equal(6, cols[3]["scale"])
|
64
|
+
assert_equal(30, cols[3]["precision"])
|
65
|
+
assert_equal(
|
66
|
+
DBI::Type::Decimal.object_id,
|
67
|
+
DBI::TypeUtil.type_name_to_module(cols[3]["type_name"]).object_id
|
46
68
|
)
|
47
69
|
|
48
70
|
# finally, we ensure that every column in the array is a ColumnInfo
|
@@ -44,7 +44,7 @@
|
|
44
44
|
|
45
45
|
assert(cols)
|
46
46
|
assert_kind_of(Array, cols)
|
47
|
-
assert_equal(
|
47
|
+
assert_equal(4, cols.length)
|
48
48
|
|
49
49
|
# the first column should always be "text_field" and have the following
|
50
50
|
# properties:
|
@@ -61,18 +61,49 @@
|
|
61
61
|
end
|
62
62
|
|
63
63
|
assert_equal(
|
64
|
-
DBI::Type::Varchar,
|
65
|
-
DBI::TypeUtil.type_name_to_module(cols[0]["type_name"])
|
64
|
+
DBI::Type::Varchar.object_id,
|
65
|
+
DBI::TypeUtil.type_name_to_module(cols[0]["type_name"]).object_id
|
66
66
|
)
|
67
67
|
|
68
68
|
# the second column should always be "integer_field" and have the following
|
69
69
|
# properties:
|
70
70
|
assert_equal("integer_field", cols[1]["name"])
|
71
|
-
|
72
|
-
|
71
|
+
# if these aren't set on the field, they should not exist
|
72
|
+
# FIXME mysql does not follow this rule, neither does ODBC
|
73
|
+
if dbtype == "mysql"
|
74
|
+
assert_equal(0, cols[1]["scale"])
|
75
|
+
assert_equal(11, cols[1]["precision"])
|
76
|
+
elsif dbtype == "odbc"
|
77
|
+
assert_equal(0, cols[1]["scale"])
|
78
|
+
assert_equal(10, cols[1]["precision"])
|
79
|
+
else
|
80
|
+
assert(!cols[1]["scale"])
|
81
|
+
assert(!cols[1]["precision"])
|
82
|
+
end
|
83
|
+
|
84
|
+
assert_equal(
|
85
|
+
DBI::Type::Integer.object_id,
|
86
|
+
DBI::TypeUtil.type_name_to_module(cols[1]["type_name"]).object_id
|
87
|
+
)
|
88
|
+
|
89
|
+
# the second column should always be "integer_field" and have the following
|
90
|
+
# properties:
|
91
|
+
assert_equal("decimal_field", cols[2]["name"])
|
92
|
+
assert_equal(1, cols[2]["scale"])
|
93
|
+
assert_equal(2, cols[2]["precision"])
|
94
|
+
assert_equal(
|
95
|
+
DBI::Type::Decimal.object_id,
|
96
|
+
DBI::TypeUtil.type_name_to_module(cols[2]["type_name"]).object_id
|
97
|
+
)
|
98
|
+
|
99
|
+
# the second column should always be "numeric_field" and have the following
|
100
|
+
# properties:
|
101
|
+
assert_equal("numeric_field", cols[3]["name"])
|
102
|
+
assert_equal(6, cols[3]["scale"])
|
103
|
+
assert_equal(30, cols[3]["precision"])
|
73
104
|
assert_equal(
|
74
|
-
DBI::Type::Decimal,
|
75
|
-
DBI::TypeUtil.type_name_to_module(cols[
|
105
|
+
DBI::Type::Decimal.object_id,
|
106
|
+
DBI::TypeUtil.type_name_to_module(cols[3]["type_name"]).object_id
|
76
107
|
)
|
77
108
|
|
78
109
|
cols.each { |col| assert_kind_of(DBI::ColumnInfo, col) }
|
@@ -25,6 +25,34 @@
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def test_numeric_types
|
29
|
+
assert(@dbh.convert_types)
|
30
|
+
|
31
|
+
@sth = @dbh.prepare("insert into precision_test (text_field, integer_field, decimal_field, numeric_field) values (?, ?, ?, ?)")
|
32
|
+
assert(@sth.convert_types)
|
33
|
+
1.step(5) do |x|
|
34
|
+
@sth.execute("poop#{x}", x, x + 0.123, x + 0.234)
|
35
|
+
end
|
36
|
+
|
37
|
+
@sth.finish
|
38
|
+
|
39
|
+
@sth = @dbh.prepare("select integer_field, decimal_field, numeric_field from precision_test")
|
40
|
+
@sth.execute
|
41
|
+
col_info = @sth.column_info
|
42
|
+
1.step(5) do |x|
|
43
|
+
row = @sth.fetch
|
44
|
+
|
45
|
+
assert_kind_of(Integer, row[0])
|
46
|
+
assert_kind_of(BigDecimal, row[1])
|
47
|
+
assert_kind_of(BigDecimal, row[2])
|
48
|
+
|
49
|
+
# FIXME BigDecimal requires a string and some databases will pad
|
50
|
+
# decimal/numeric with constrained precision. We should account for
|
51
|
+
# this, but I'm not quite sure how yet.
|
52
|
+
end
|
53
|
+
@sth.finish
|
54
|
+
end
|
55
|
+
|
28
56
|
# FIXME
|
29
57
|
# Ideally, this test should be split across the DBI tests and DBD, but for
|
30
58
|
# now testing against the DBDs really doesn't cost us anything other than
|
data/test/dbd/mysql/up.sql
CHANGED
@@ -9,7 +9,7 @@ insert into names (name, age) values ('Jim', 30);
|
|
9
9
|
---
|
10
10
|
insert into names (name, age) values ('Bob', 21);
|
11
11
|
---
|
12
|
-
create table precision_test (text_field varchar(20) primary key not null, integer_field decimal(2,1));
|
12
|
+
create table precision_test (text_field varchar(20) primary key not null, integer_field integer, decimal_field decimal(2,1), numeric_field numeric(30,6));
|
13
13
|
---
|
14
14
|
CREATE TABLE blob_test (name VARCHAR(30), data BLOB) Engine=InnoDB;
|
15
15
|
---
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dbd-mysql
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.4.
|
7
|
-
date: 2008-09
|
6
|
+
version: 0.4.2
|
7
|
+
date: 2008-11-09 00:00:00 -08:00
|
8
8
|
summary: MySQL DBI DBD, Leverages 'mysql' low-level driver
|
9
9
|
require_paths:
|
10
10
|
- lib
|