dohmysql 0.2.32 → 0.2.33

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64befc46b5f3f68c36d20eff7f6e48bb0b6116eb
4
- data.tar.gz: ff731de4c76962b7c36c6bbe03664a65fec08234
3
+ metadata.gz: 3cec61c5a47a3b5fccd99953a0e8c931eb5008bc
4
+ data.tar.gz: da47d7e1916cb59462de5cf0a9048ef7fcc04dad
5
5
  SHA512:
6
- metadata.gz: b65859a254c1f17d61f48235ce1494ec950b3b8841c4e9d0bff40196be625002386e5676632a95c438a9c8372f54d1e018e272c2ef18c5e5f80ef137a1235ae8
7
- data.tar.gz: 2cb98cefc773b33e6537402b9e33e0402a0b810212d0b6d1aeafcec422fa489c8311ee94dd5df24565549a6c60fd5785f4263684bc3ccd6c82e17d178eaa9813
6
+ metadata.gz: d30a63c850e32db1ff7894cce5e11ba4282d55f8d5a9c3373134da0613799593ae80ed1741a827915d52bce6244d582b51a5a801719734574460deac213c7fa4
7
+ data.tar.gz: 98442287c0925d04f552e1b5ec5ed1111dafdef392aa1df8ecce0ab61b65cc9fbbfe78d7dd1afed3c6c228193bcf4e990dfe964dbc013ab1883b26f773a60ddb
@@ -190,6 +190,27 @@ class Handle
190
190
  @testing_rollback = false
191
191
  end
192
192
  end
193
+
194
+ def start_select(statement, &block)
195
+ @async_block = block
196
+ sqlstr = statement.to_s
197
+ DohDb.logger.call('query', "starting async select: #{sqlstr}")
198
+ @mysqlh.query(sqlstr, :async => true)
199
+ rescue Exception => excpt
200
+ DohDb.logger.call('error', "caught exception #{excpt.message} starting aysnc query: #{sqlstr}", excpt)
201
+ reopen
202
+ raise
203
+ end
204
+
205
+ def finish_select
206
+ result_set = @mysqlh.async_result
207
+ DohDb.logger.call('result', "async selected #{result_set.size} rows")
208
+ rows = get_row_builder.build_rows(result_set)
209
+ rows.each do |dbrow|
210
+ @async_block.call(dbrow)
211
+ end
212
+ end
213
+
193
214
  private
194
215
  def generic_query(statement)
195
216
  sqlstr = statement.to_s
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.2.32
4
+ version: 0.2.33
5
5
  platform: ruby
6
6
  authors:
7
7
  - Makani Mason
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-28 00:00:00.000000000 Z
12
+ date: 2013-06-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: dohroot
@@ -118,7 +118,6 @@ files:
118
118
  - lib/dohmysql/error.rb
119
119
  - lib/dohmysql/file_util.rb
120
120
  - lib/dohmysql/handle.rb
121
- - lib/dohmysql/handle.rb.orig
122
121
  - lib/dohmysql/hash_row.rb
123
122
  - lib/dohmysql/load_sql.rb
124
123
  - lib/dohmysql/logger.rb
@@ -163,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
162
  version: '0'
164
163
  requirements: []
165
164
  rubyforge_project:
166
- rubygems_version: 2.0.2
165
+ rubygems_version: 2.0.3
167
166
  signing_key:
168
167
  specification_version: 4
169
168
  summary: friendly mysql client interface
@@ -1,257 +0,0 @@
1
- require 'mysql2'
2
- require 'dohutil/array_to_hash'
3
- require 'dohmysql/logger'
4
- require 'dohmysql/error'
5
- require 'dohmysql/typed_row_builder'
6
- require 'dohmysql/writable_row'
7
- require 'dohmysql/hash_row'
8
- require 'dohmysql/smart_row'
9
- require 'dohmysql/to_sql'
10
- Mysql2::Client.default_query_options[:cast_booleans] = true
11
-
12
- module DohDb
13
-
14
- class Handle
15
- attr_reader :config, :mysqlh
16
-
17
- def initialize(config)
18
- @config = config
19
- @testing_rollback = false
20
- log_config = @config.dup
21
- @config[:reconnect] = true if !@config.keys.include?(:reconnect)
22
- log_config.delete(:password)
23
- DohDb.logger.call('connection', "creating connection with config: #{log_config}")
24
- @mysqlh = Mysql2::Client.new(@config)
25
- DohDb.logger.call('connection', "new connection created: id #{@mysqlh.thread_id}")
26
- end
27
-
28
- def close
29
- unless closed?
30
- begin
31
- DohDb.logger.call('connection', "closing connection: id #{@mysqlh.thread_id}")
32
- @mysqlh.close
33
- ensure
34
- @mysqlh = nil
35
- end
36
- end
37
- end
38
-
39
- def closed?
40
- @mysqlh.nil?
41
- end
42
-
43
- def query(statement)
44
- generic_query(statement)
45
- retval = @mysqlh.affected_rows
46
- DohDb.logger.call('result', "affected #{retval} rows")
47
- retval
48
- end
49
-
50
- def update(statement)
51
- generic_query(statement)
52
- retval = @mysqlh.affected_rows
53
- DohDb.logger.call('result', "updated #{retval} rows")
54
- retval
55
- end
56
-
57
- def update_row(statement)
58
- retval = update(statement)
59
- raise UnexpectedQueryResult, "updated #{retval} rows; expected 1" unless retval == 1
60
- retval
61
- end
62
-
63
- def update_hash(hash, table, primary_key_value, primary_key_name)
64
- items = hash.keys.collect {|key| key + ' = ' + hash[key].to_sql}
65
- query("UPDATE #{table} SET #{items.join(', ')} WHERE #{primary_key_name} = #{primary_key_value.to_sql}")
66
- end
67
-
68
- def insert(statement)
69
- generic_query(statement)
70
- retval = @mysqlh.last_id
71
- DohDb.logger.call('result', "insert_id was #{retval}")
72
- retval
73
- end
74
-
75
- def insert_hash(hash, table, quote_strings = true)
76
- insert_hash_helper(hash, table, 'INSERT', quote_strings)
77
- end
78
-
79
- def insert_hashes(hashes, table, quote_strings = true)
80
- insert_hashes_helper(hashes, table, 'INSERT', quote_strings)
81
- end
82
-
83
- def insert_ignore_hash(hash, table, quote_strings = true)
84
- insert_hash_helper(hash, table, 'INSERT IGNORE', quote_strings)
85
- end
86
-
87
- def insert_ignore_hashes(hash, table, quote_strings = true)
88
- insert_hashes_helper(hash, table, 'INSERT IGNORE', quote_strings)
89
- end
90
-
91
- def replace_hash(hash, table, quote_strings = true)
92
- insert_hash_helper(hash, table, 'REPLACE', quote_strings)
93
- end
94
-
95
- # The most generic form of select.
96
- # It calls to_s on the statement object to facilitate the use of sql builder objects.
97
- def select(statement, row_builder = nil)
98
- result_set = generic_query(statement)
99
- DohDb.logger.call('result', "selected #{result_set.size} rows")
100
- rows = get_row_builder(row_builder).build_rows(result_set)
101
- rows
102
- end
103
-
104
- # Simple convenience wrapper around the generic select call.
105
- # Throws an exception unless the result set is a single row.
106
- # Returns the row selected.
107
- def select_row(statement, row_builder = nil)
108
- rows = select(statement, row_builder)
109
- raise UnexpectedQueryResult, "selected #{rows.size} rows; expected 1" unless rows.size == 1
110
- rows[0]
111
- end
112
-
113
- # Simple convenience wrapper around the generic select call.
114
- # Throws an exception unless the result set is empty or a single row.
115
- # Returns nil if the result set is empty, or the row selected.
116
- def select_optional_row(statement, row_builder = nil)
117
- rows = select(statement, row_builder)
118
- raise UnexpectedQueryResult, "selected #{rows.size} rows; expected 0 or 1" if rows.size > 1
119
- if rows.empty? then nil else rows[0] end
120
- end
121
-
122
- # Simple convenience wrapper around select_row.
123
- # Returns the first (and typically, the only) field from the selected row.
124
- def select_field(statement, row_builder = nil)
125
- select_row(statement, row_builder).at(0)
126
- end
127
-
128
- # Simple convenience wrapper around select_optional_row.
129
- # Returns the first (and typically, the only) field from the selected row, if any, or nil.
130
- def select_optional_field(statement, row_builder = nil)
131
- row = select_optional_row(statement, row_builder)
132
- row && row.at(0)
133
- end
134
-
135
- # Rows in the result set must have 2 or more fields.
136
- # If there are 2 fields, returns a hash where each key is the first field in the result set, and the value is the second field.
137
- # If there are more than 2 fields, returns a hash where each key is the first field in the result set,
138
- # and the value is the row itself, as a Hash, and without the field used as a key.
139
- def select_transpose(statement, row_builder = nil)
140
- rows = select(statement, row_builder)
141
- return {} if rows.empty?
142
- field_count = rows.first.size
143
- if field_count < 2
144
- raise UnexpectedQueryResult, "must select at least 2 fields in order to transpose"
145
- elsif field_count == 2
146
- Doh.array_to_hash(rows) { |row| [row.at(0), row.at(1)] }
147
- else
148
- key_field = rows.first.keys.first
149
- Doh.array_to_hash(rows) do |row|
150
- value = row.to_h
151
- value.delete(key_field)
152
- [row.at(0), value]
153
- end
154
- end
155
- end
156
-
157
- # Returns an array of arrays, where the individual arrays contain just the values from each database row -- they lack field names.
158
- def select_values(statement, row_builder = nil)
159
- select(statement, row_builder).collect { |row| row.values }
160
- end
161
-
162
- # Returns an array of the first (and typically, the only) field of every row in the result set.
163
- def select_list(statement, row_builder = nil)
164
- select(statement, row_builder).collect { |row| row.at(0) }
165
- end
166
-
167
- def transaction
168
- query("START TRANSACTION")
169
- need_rollback = true
170
- begin
171
- retval = yield(self)
172
- if !@testing_rollback
173
- query("COMMIT")
174
- need_rollback = false
175
- end
176
- ensure
177
- query("ROLLBACK") if need_rollback
178
- end
179
- retval
180
- end
181
-
182
- def test_transaction_rollback
183
- begin
184
- @testing_rollback = true
185
- yield(self)
186
- ensure
187
- @testing_rollback = false
188
- end
189
- end
190
- private
191
- def generic_query(statement)
192
- sqlstr = statement.to_s
193
- DohDb.logger.call('query', sqlstr)
194
- @mysqlh.query(sqlstr)
195
- rescue Exception => excpt
196
- DohDb.logger.call('error', "caught exception #{excpt.message} during query: #{sqlstr}")
197
- close
198
- raise
199
- end
200
-
201
- def get_key_insert_str(keys)
202
- "(`#{keys.join('`,`')}`)"
203
- end
204
-
205
- def insert_hash_helper(hash, table, keyword, quote_strings)
206
- names = []
207
- values = []
208
- hash.each_pair do |key, value|
209
- names.push(key)
210
- values.push(if quote_strings || !value.is_a?(String) then value.to_sql else value end)
211
- end
212
-
213
- insert("#{keyword} INTO #{table} (`#{names.join('`,`')}`) VALUES (#{values.join(',')})")
214
- end
215
-
216
- def insert_hashes_helper(hashes, table, keyword, quote_strings)
217
- <<<<<<< HEAD:lib/dohmysql/handle.rb
218
- return if hashes.empty?
219
-
220
- =======
221
- >>>>>>> implement insert_hashes, mostly not-sharing with insert_hash for speed (3% or so decrease on unit test speeds when I had them shared):lib/doh/mysql/handle.rb
222
- valuestrs = []
223
- keys = hashes[0].keys
224
- keystr = get_key_insert_str(keys)
225
- hashes.each do |hash|
226
- values = []
227
- keys.each do |key|
228
- value = hash[key]
229
- values.push(if quote_strings || !value.is_a?(String) then value.to_sql else value end)
230
- end
231
- valuestrs.push("(#{values.join(',')})")
232
- end
233
-
234
- insert("#{keyword} INTO #{table} #{keystr} VALUES #{valuestrs.join(",")}")
235
- end
236
-
237
-
238
- def get_row_builder(row_builder = nil)
239
- if row_builder.nil?
240
- TypedRowBuilder.new
241
- elsif row_builder == :read
242
- TypedRowBuilder.new(ReadOnlyRow)
243
- elsif row_builder == :hash
244
- TypedRowBuilder.new(HashRow)
245
- elsif row_builder == :write
246
- TypedRowBuilder.new(WritableRow)
247
- elsif row_builder == :smart
248
- TypedRowBuilder.new(SmartRow)
249
- elsif row_builder.respond_to?('build_rows')
250
- row_builder
251
- else
252
- TypedRowBuilder.new(row_builder)
253
- end
254
- end
255
- end
256
-
257
- end