@@ -2,9 +2,14 @@ module ActiveRecord
2
2
module ConnectionAdapters
3
3
module Sqlserver
4
4
module DatabaseStatements
5
-
5
+
6
+ def select_one ( sql , name = nil )
7
+ result = raw_select sql , name , :fetch => :one
8
+ ( result && result . first . present? ) ? result . first : nil
9
+ end
10
+
6
11
def select_rows ( sql , name = nil )
7
- raw_select sql , name , true
12
+ raw_select sql , name , :fetch => :rows
8
13
end
9
14
10
15
def execute ( sql , name = nil , skip_logging = false )
@@ -70,7 +75,7 @@ def execute_procedure(proc_name, *variables)
70
75
log ( sql , 'Execute Procedure' ) do
71
76
raw_connection_run ( sql ) do |handle |
72
77
get_rows = lambda {
73
- rows = handle_to_names_and_values ( handle , false )
78
+ rows = handle_to_names_and_values handle , :fetch => :all
74
79
rows . each_with_index { |r , i | rows [ i ] = r . with_indifferent_access }
75
80
results << rows
76
81
}
@@ -162,7 +167,7 @@ def charset
162
167
protected
163
168
164
169
def select ( sql , name = nil )
165
- raw_select ( sql , name )
170
+ raw_select sql , name , :fetch => :all
166
171
end
167
172
168
173
def insert_sql ( sql , name = nil , pk = nil , id_value = nil , sequence_name = nil )
@@ -200,11 +205,11 @@ def raw_connection_do(sql)
200
205
201
206
# === SQLServer Specific (Selecting) ============================ #
202
207
203
- def raw_select ( sql , name = nil , rows_only = false )
208
+ def raw_select ( sql , name = nil , options = { } )
204
209
log ( sql , name ) do
205
210
begin
206
211
handle = raw_connection_run ( sql )
207
- handle_to_names_and_values ( handle , rows_only )
212
+ handle_to_names_and_values ( handle , options )
208
213
ensure
209
214
finish_statement_handle ( handle )
210
215
end
@@ -231,45 +236,52 @@ def handle_more_results?(handle)
231
236
end
232
237
end
233
238
234
- def handle_to_names_and_values ( handle , rows_only )
239
+ def handle_to_names_and_values ( handle , options = { } )
235
240
case connection_mode
236
241
when :odbc
237
- handle_to_names_and_values_odbc ( handle , rows_only )
242
+ handle_to_names_and_values_odbc ( handle , options )
238
243
when :adonet
239
- handle_to_names_and_values_adonet ( handle , rows_only )
244
+ handle_to_names_and_values_adonet ( handle , options )
240
245
end
241
246
end
242
247
243
- def handle_to_names_and_values_odbc ( handle , rows_only )
244
- rows = handle . fetch_all || [ ]
245
- if rows_only
248
+ def handle_to_names_and_values_odbc ( handle , options = { } )
249
+ case options [ :fetch ]
250
+ when :all , :one
251
+ rows = if options [ :fetch ] == :all
252
+ handle . fetch_all || [ ]
253
+ else
254
+ row = handle . fetch
255
+ row ? [ row ] : [ [ ] ]
256
+ end
257
+ names = handle . columns ( true ) . map { |c | c . name }
258
+ names_and_values = [ ]
246
259
rows . each do |row |
260
+ h = { }
247
261
i = 0
248
262
while i < row . size
249
263
v = row [ i ]
250
- row [ i ] = v . to_sqlserver_string if v . respond_to? ( :to_sqlserver_string )
264
+ h [ names [ i ] ] = v . respond_to? ( :to_sqlserver_string ) ? v . to_sqlserver_string : v
251
265
i += 1
252
266
end
267
+ names_and_values << h
253
268
end
254
- rows
255
- else
256
- names = handle . columns ( true ) . map { |c | c . name }
257
- names_and_values = [ ]
269
+ names_and_values
270
+ when :rows
271
+ rows = handle . fetch_all || [ ]
258
272
rows . each do |row |
259
- h = { }
260
273
i = 0
261
274
while i < row . size
262
275
v = row [ i ]
263
- h [ names [ i ] ] = v . respond_to? ( : to_sqlserver_string) ? v . to_sqlserver_string : v
276
+ row [ i ] = v . to_sqlserver_string if v . respond_to? ( :to_sqlserver_string )
264
277
i += 1
265
278
end
266
- names_and_values << h
267
279
end
268
- names_and_values
280
+ rows
269
281
end
270
282
end
271
283
272
- def handle_to_names_and_values_adonet ( handle , rows_only )
284
+ def handle_to_names_and_values_adonet ( handle , options = { } )
273
285
if handle . has_rows
274
286
fields = [ ]
275
287
rows = [ ]
0 commit comments