dohmysql 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/bin/makedb CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- require 'doh/app/pwd'
2
+ require 'doh/app/init_from_pwd'
3
3
  require 'doh/options'
4
4
  require 'doh/mysql/database_creator'
5
5
 
@@ -1,5 +1,7 @@
1
+ require 'mysql2'
1
2
  require 'doh/mysql/handle'
2
3
  require 'doh/mysql/typed_row_builder'
4
+ Mysql2::Client.default_query_options[:cast_booleans] = true
3
5
 
4
6
  module DohDb
5
7
 
@@ -41,8 +43,7 @@ private
41
43
  database ||= @database
42
44
  dbmsg = database.to_s.strip.empty? ? 'no default database' : "database #{database}"
43
45
  dohlog.info("connecting to #@host port #@port as username #@username, #{dbmsg}")
44
- mysqlh = Mysql.connect(@host, @username, @password, database, @port, nil, Mysql::CLIENT_MULTI_STATEMENTS)
45
- mysqlh.query_with_result = false
46
+ mysqlh = Mysql2::Client.new(:host => @host, :username => @username, :password => @password, :database => database, :port => @port)
46
47
  Handle.new(mysqlh, @row_builder)
47
48
  end
48
49
 
@@ -1,4 +1,4 @@
1
- require 'date'
1
+ require 'doh/core_ext/datewithtime'
2
2
  require 'doh/mysql/to_sql'
3
3
 
4
4
  module DohDb
@@ -21,7 +21,7 @@ def self.today
21
21
  end
22
22
 
23
23
  def self.now
24
- dt = DateTime.zow
24
+ dt = DateTime.now.utc
25
25
  DateTimeNow.new(dt.year, dt.month, dt.mday, dt.hour, dt.min, dt.sec, dt.zone)
26
26
  end
27
27
 
@@ -53,7 +53,7 @@ class Handle
53
53
 
54
54
  def insert(statement)
55
55
  generic_query(statement)
56
- retval = @mysqlh.insert_id
56
+ retval = @mysqlh.last_id
57
57
  dohlog.info("insert_id was #{retval}")
58
58
  retval
59
59
  end
@@ -71,9 +71,8 @@ class Handle
71
71
  # It calls to_s on the statement object to facilitate the use of sql builder objects.
72
72
  def select(statement, row_builder = nil)
73
73
  result_set = generic_query(statement)
74
- dohlog.info("selected #{result_set.num_rows} rows")
74
+ dohlog.info("selected #{result_set.size} rows")
75
75
  rows = get_row_builder(row_builder).build_rows(result_set)
76
- result_set.free
77
76
  rows
78
77
  end
79
78
 
@@ -140,46 +139,11 @@ class Handle
140
139
  select(statement, row_builder).collect { |row| row.at(0) }
141
140
  end
142
141
 
143
- def multi_select(statement_infos, dflt_row_builder = nil)
144
- statements = []
145
- row_builders = []
146
- statement_infos.each do |info|
147
- if info.is_a?(Array)
148
- statements.push(info.first)
149
- row_builders.push(info.last)
150
- else
151
- statements.push(info)
152
- row_builders.push(nil)
153
- end
154
- end
155
- sqlstr = statements.join(';')
156
-
157
- dohlog.info(sqlstr)
158
- @mysqlh.query(sqlstr)
159
- retval = []
160
- while true
161
- custom_builder = row_builders.shift
162
- if @mysqlh.field_count > 0
163
- result_set = @mysqlh.store_result
164
- dohlog.info("selected #{result_set.num_rows} rows")
165
- rows = get_row_builder(custom_builder || dflt_row_builder).build_rows(result_set)
166
- result_set.free
167
- retval.push(rows)
168
- end
169
- break unless @mysqlh.next_result
170
- end
171
- retval
172
- rescue Exception => excpt
173
- dohlog.error("caught exception during query: #{sqlstr}", excpt)
174
- raise
175
- end
176
-
177
142
  private
178
143
  def generic_query(statement)
179
144
  sqlstr = statement.to_s
180
145
  dohlog.info(sqlstr)
181
146
  @mysqlh.query(sqlstr)
182
- @mysqlh.store_result if @mysqlh.field_count > 0
183
147
  rescue Exception => excpt
184
148
  dohlog.error("caught exception during query: #{sqlstr}", excpt)
185
149
  raise
@@ -40,6 +40,12 @@ class DateTime
40
40
  end
41
41
  end
42
42
 
43
+ class Time
44
+ def to_sql
45
+ '"' + strftime('%Y-%m-%d %H:%M:%S') + '"'
46
+ end
47
+ end
48
+
43
49
  class TrueClass
44
50
  def to_sql
45
51
  '1'
@@ -1,25 +1,28 @@
1
1
  require 'doh/mysql/readonly_row'
2
- require 'doh/mysql/default_type_guesser'
3
2
 
4
3
  module DohDb
5
4
 
6
5
  class TypedRowBuilder
7
6
  def initialize(row_klass = nil, guesser = nil)
8
7
  @row_klass = row_klass || ReadOnlyRow
9
- @guesser = guesser || DefaultTypeGuesser
10
8
  end
11
9
 
12
10
  def build_rows(result_set)
13
- meta_info = result_set.fetch_fields
14
- field_names = meta_info.collect {|elem| elem.name}
11
+ return [] if result_set.size == 0
15
12
 
16
13
  retval = []
17
14
  result_set.each do |row|
18
- typed_values = []
19
- row.each_with_index do |field, index|
20
- typed_values[index] = @guesser.guess_type(field, meta_info[index])
15
+ keys = []
16
+ values = []
17
+ row.each_pair do |key, value|
18
+ keys.push(key)
19
+ if value.is_a?(Time)
20
+ values.push(value.to_datetime)
21
+ else
22
+ values.push(value)
23
+ end
21
24
  end
22
- retval.push(@row_klass.new(field_names, typed_values))
25
+ retval.push(@row_klass.new(keys, values))
23
26
  end
24
27
  retval
25
28
  end
@@ -16,7 +16,7 @@ class Test_ConnectorInstance < DohTest::TestGroup
16
16
  assert_equal(nil, DohDb::select_optional_field("SELECT money FROM #{tbl} WHERE id = 7"))
17
17
  assert_raises(UnexpectedQueryResult) {DohDb::select_field("SELECT money FROM #{tbl} WHERE id = 7")}
18
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")}
19
+ assert_raises(Mysql2::Error){DohDb::query("some invalid sql here")}
20
20
  # TODO: re-enable
21
21
  # assert(DohTest::pop_error)
22
22
  assert_raises(UnexpectedQueryResult) {DohDb::update_row("UPDATE #{tbl} SET money = 10.95 WHERE id = 7")}
data/test/handle.dt.rb CHANGED
@@ -52,59 +52,13 @@ class Test_Handle < DohTest::TestGroup
52
52
  assert_equal([['some_name']], DohDb::select_values("SELECT field FROM #{tbl}"))
53
53
  end
54
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
55
  def test_insert_hash
102
56
  dbh = DohDb::request_handle
103
57
  tbl = "doh_mysql_insert_hash_test"
104
58
  dbh.query("CREATE TEMPORARY TABLE #{tbl} (value INT KEY)")
105
59
  hash1 = {'value' => 1}
106
60
  assert_equal(0, dbh.insert_hash(hash1, tbl))
107
- assert_raises(Mysql::Error) { dbh.insert_hash(hash1, tbl) }
61
+ assert_raises(Mysql2::Error) { dbh.insert_hash(hash1, tbl) }
108
62
  assert_equal(0, dbh.insert_hash(hash1, tbl, true))
109
63
  end
110
64
  end
data/test/types.dt.rb CHANGED
@@ -3,29 +3,25 @@ require 'doh/mysql/types'
3
3
 
4
4
  module DohDb
5
5
 
6
- class ConvertToString
7
- def self.build(field, value)
8
- value.to_s
9
- end
10
- end
11
-
12
6
  class Test_types < DohTest::TestGroup
13
7
  def test_stuff
14
- dbh = DohDb::request_handle
15
- tbl = "doh_mysql_types_stuff_test"
16
- tbl2 = "island.doh_mysql_types_stuff_another_test"
17
- DohDb::query("CREATE TEMPORARY TABLE #{tbl} (amount INT)")
18
- DohDb::query("INSERT INTO #{tbl} SET amount = NULL")
19
- assert_equal(nil, DohDb::select_field("SELECT amount FROM #{tbl}"))
20
- DohDb::query("UPDATE #{tbl} SET amount = 5")
21
- assert_equal(5, DohDb::select_field("SELECT amount FROM #{tbl}"))
8
+ Mysql2::Client.default_query_options[:database_timezone] = :utc
9
+ Mysql2::Client.default_query_options[:application_timezone] = :utc
10
+ DohDb::connector_instance.reset
22
11
 
23
- DohDb::query("CREATE TEMPORARY TABLE #{tbl2} (other INT)")
24
- DohDb::query("INSERT INTO #{tbl2} SET other = 7")
25
- assert_equal(5, DohDb::select_field("SELECT amount, other FROM #{tbl}, #{tbl2}"))
12
+ @tbl = "doh_mysql_type_conversion_tests"
13
+ DohDb::query("DROP TABLE IF EXISTS #@tbl")
14
+ DohDb::request_handle.query("CREATE TEMPORARY TABLE #{@tbl} (char_field CHAR(1) NOT NULL, int_field INT, bool_field TINYINT(1), date_field DATE, datetime_field DATETIME, decimal_field DECIMAL(7,2))")
26
15
 
27
- DohDb::register_column_type(DohDb::connector_instance.database, tbl, 'amount', ConvertToString)
28
- assert_equal('5', DohDb::select_field("SELECT amount FROM #{tbl}"))
16
+ dbh = DohDb::request_handle
17
+ dbh.insert("INSERT INTO #{@tbl} SET char_field = 'c', int_field = 5, bool_field = 1, date_field = '2012-02-20', datetime_field = '2012-02-20 21:06:00', decimal_field = 54.12")
18
+ row = dbh.select_row("SELECT * FROM #{@tbl}")
19
+ assert_equal('c', row['char_field'])
20
+ assert_equal(5, row['int_field'])
21
+ assert_equal(true, row['bool_field'])
22
+ assert_equal(Date.new(2012,2,20), row['date_field'])
23
+ assert_equal(Time.utc(2012,2,20, 21, 6, 0), row['datetime_field'])
24
+ assert_equal(BigDecimal('54.12'), row['decimal_field'])
29
25
  end
30
26
  end
31
27
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dohmysql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,19 +10,41 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-02-11 00:00:00.000000000Z
13
+ date: 2012-02-23 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: dohutil
17
- requirement: &70173088680320 !ruby/object:Gem::Requirement
17
+ requirement: &70236167835480 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
- version: 0.1.4
22
+ version: 0.1.5
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70236167835480
26
+ - !ruby/object:Gem::Dependency
27
+ name: mysql2
28
+ requirement: &70236167834600 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.3.11
23
34
  type: :runtime
24
35
  prerelease: false
25
- version_requirements: *70173088680320
36
+ version_requirements: *70236167834600
37
+ - !ruby/object:Gem::Dependency
38
+ name: dohtest
39
+ requirement: &70236167833680 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 0.1.4
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *70236167833680
26
48
  description: wrapper classes around low level mysql gem to provide a better interface
27
49
  email:
28
50
  - devinfo@atpsoft.com
@@ -42,7 +64,6 @@ files:
42
64
  - lib/doh/mysql/current_date.rb
43
65
  - lib/doh/mysql/database_creator.rb
44
66
  - lib/doh/mysql/db_date.rb
45
- - lib/doh/mysql/default_type_guesser.rb
46
67
  - lib/doh/mysql/error.rb
47
68
  - lib/doh/mysql/handle.rb
48
69
  - lib/doh/mysql/hash_row.rb
@@ -116,3 +137,4 @@ test_files:
116
137
  - test/types.dt.rb
117
138
  - test/unquoted.dt.rb
118
139
  - test/writable_row.dt.rb
140
+ has_rdoc:
@@ -1,37 +0,0 @@
1
- require 'mysql'
2
- require 'doh/mysql/parse'
3
- require 'doh/to_display'
4
- require 'doh/mysql/types'
5
- require 'doh/core_ext/string'
6
-
7
- module DohDb
8
-
9
- class DefaultTypeGuesser
10
- # for compatibility with older mysql gems
11
- if !MysqlField.const_defined?('TYPE_NEWDECIMAL')
12
- MysqlField::TYPE_NEWDECIMAL = 246
13
- end
14
- DECIMAL_TYPES = [MysqlField::TYPE_DECIMAL, MysqlField::TYPE_NEWDECIMAL]
15
- INT_TYPES = [MysqlField::TYPE_TINY,MysqlField::TYPE_SHORT,MysqlField::TYPE_LONG,MysqlField::TYPE_LONGLONG,MysqlField::TYPE_INT24]
16
-
17
- def self.guess_type(value, meta)
18
- return nil if value.nil?
19
-
20
- custom_type = DohDb::find_column_type(nil, meta.table, meta.name) || DohDb::find_column_type(nil, nil, meta.name)
21
- return custom_type.build(meta.name, value) if custom_type
22
-
23
- return DohDb::parse_bool(value) if (meta.type == MysqlField::TYPE_TINY) && (meta.length == 1) && (meta.max_length == 1)
24
- return DohDb::parse_datetime(value) if meta.type == MysqlField::TYPE_DATETIME
25
- return DohDb::parse_date(value) if meta.type == MysqlField::TYPE_DATE
26
- return DohDb::parse_decimal(value) if DECIMAL_TYPES.include?(meta.type)
27
- return DohDb::parse_int(value) if INT_TYPES.include?(meta.type)
28
- if meta.type == MysqlField::TYPE_STRING || meta.type == MysqlField::TYPE_VAR_STRING
29
- return PhoneDisplayString.new(value) if (value.size == 10) && (meta.name.lastn(5) == 'phone')
30
- return SsnDisplayString.new(value) if (value.size == 9) && (meta.max_length == 9) && (meta.name.lastn(3) == 'ssn')
31
- return PostalDisplayString.new(value) if [5,9].include?(value.size) && [5,9].include?(meta.max_length) && ((meta.name.lastn(6) == 'postal') || (meta.name.lastn(3) == 'zip'))
32
- end
33
- value
34
- end
35
- end
36
-
37
- end