@@ -59,13 +59,67 @@ class SQLServerAdapter < AbstractAdapter
59
59
self . use_output_inserted = true
60
60
self . exclude_output_inserted_table_names = Concurrent ::Map . new { false }
61
61
62
- def initialize ( connection , logger = nil , config = { } )
62
+ class << self
63
+ def new_client ( config )
64
+ case config [ :mode ]
65
+ when :dblib
66
+ dblib_connect ( config )
67
+ end
68
+ end
69
+
70
+ def dblib_connect ( config )
71
+ TinyTds ::Client . new (
72
+ dataserver : config [ :dataserver ] ,
73
+ host : config [ :host ] ,
74
+ port : config [ :port ] ,
75
+ username : config [ :username ] ,
76
+ password : config [ :password ] ,
77
+ database : config [ :database ] ,
78
+ tds_version : config [ :tds_version ] || "7.3" ,
79
+ appname : config_appname ( config ) ,
80
+ login_timeout : config_login_timeout ( config ) ,
81
+ timeout : config_timeout ( config ) ,
82
+ encoding : config_encoding ( config ) ,
83
+ azure : config [ :azure ] ,
84
+ contained : config [ :contained ]
85
+ ) . tap do |client |
86
+ if config [ :azure ]
87
+ client . execute ( "SET ANSI_NULLS ON" ) . do
88
+ client . execute ( "SET ANSI_NULL_DFLT_ON ON" ) . do
89
+ client . execute ( "SET ANSI_PADDING ON" ) . do
90
+ client . execute ( "SET ANSI_WARNINGS ON" ) . do
91
+ else
92
+ client . execute ( "SET ANSI_DEFAULTS ON" ) . do
93
+ end
94
+ client . execute ( "SET QUOTED_IDENTIFIER ON" ) . do
95
+ client . execute ( "SET CURSOR_CLOSE_ON_COMMIT OFF" ) . do
96
+ client . execute ( "SET IMPLICIT_TRANSACTIONS OFF" ) . do
97
+ client . execute ( "SET TEXTSIZE 2147483647" ) . do
98
+ client . execute ( "SET CONCAT_NULL_YIELDS_NULL ON" ) . do
99
+ end
100
+ end
101
+
102
+ def config_appname ( config )
103
+ config [ :appname ] || configure_application_name || Rails . application . class . name . split ( "::" ) . first rescue nil
104
+ end
105
+
106
+ def config_login_timeout ( config )
107
+ config [ :login_timeout ] . present? ? config [ :login_timeout ] . to_i : nil
108
+ end
109
+
110
+ def config_timeout ( config )
111
+ config [ :timeout ] . present? ? config [ :timeout ] . to_i / 1000 : nil
112
+ end
113
+
114
+ def config_encoding ( config )
115
+ config [ :encoding ] . present? ? config [ :encoding ] : nil
116
+ end
117
+ end
118
+
119
+ def initialize ( connection , logger , _connection_options , config )
63
120
super ( connection , logger , config )
64
- # Our Responsibility
65
121
@connection_options = config
66
- connect
67
- initialize_dateformatter
68
- use_database
122
+ configure_connection
69
123
end
70
124
71
125
# === Abstract Adapter ========================================== #
@@ -226,6 +280,14 @@ def reset!
226
280
do_execute "IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION"
227
281
end
228
282
283
+ def configure_connection
284
+ @spid = _raw_select ( "SELECT @@SPID" , fetch : :rows ) . first . first
285
+ @version_year = version_year
286
+
287
+ initialize_dateformatter
288
+ use_database
289
+ end
290
+
229
291
# === Abstract Adapter (Misc Support) =========================== #
230
292
231
293
def tables_with_referential_integrity
@@ -408,78 +470,18 @@ def translate_exception(e, message:, sql:, binds:)
408
470
409
471
# === SQLServer Specific (Connection Management) ================ #
410
472
411
- def connect
412
- config = @connection_options
413
- @connection = case config [ :mode ]
414
- when :dblib
415
- dblib_connect ( config )
416
- end
417
- @spid = _raw_select ( "SELECT @@SPID" , fetch : :rows ) . first . first
418
- @version_year = version_year
419
- configure_connection
420
- end
421
-
422
473
def connection_errors
423
474
@connection_errors ||= [ ] . tap do |errors |
424
475
errors << TinyTds ::Error if defined? ( TinyTds ::Error )
425
476
end
426
477
end
427
478
428
- def dblib_connect ( config )
429
- TinyTds ::Client . new (
430
- dataserver : config [ :dataserver ] ,
431
- host : config [ :host ] ,
432
- port : config [ :port ] ,
433
- username : config [ :username ] ,
434
- password : config [ :password ] ,
435
- database : config [ :database ] ,
436
- tds_version : config [ :tds_version ] || "7.3" ,
437
- appname : config_appname ( config ) ,
438
- login_timeout : config_login_timeout ( config ) ,
439
- timeout : config_timeout ( config ) ,
440
- encoding : config_encoding ( config ) ,
441
- azure : config [ :azure ] ,
442
- contained : config [ :contained ]
443
- ) . tap do |client |
444
- if config [ :azure ]
445
- client . execute ( "SET ANSI_NULLS ON" ) . do
446
- client . execute ( "SET ANSI_NULL_DFLT_ON ON" ) . do
447
- client . execute ( "SET ANSI_PADDING ON" ) . do
448
- client . execute ( "SET ANSI_WARNINGS ON" ) . do
449
- else
450
- client . execute ( "SET ANSI_DEFAULTS ON" ) . do
451
- end
452
- client . execute ( "SET QUOTED_IDENTIFIER ON" ) . do
453
- client . execute ( "SET CURSOR_CLOSE_ON_COMMIT OFF" ) . do
454
- client . execute ( "SET IMPLICIT_TRANSACTIONS OFF" ) . do
455
- client . execute ( "SET TEXTSIZE 2147483647" ) . do
456
- client . execute ( "SET CONCAT_NULL_YIELDS_NULL ON" ) . do
457
- end
458
- end
459
-
460
- def config_appname ( config )
461
- config [ :appname ] || configure_application_name || Rails . application . class . name . split ( "::" ) . first rescue nil
462
- end
463
-
464
- def config_login_timeout ( config )
465
- config [ :login_timeout ] . present? ? config [ :login_timeout ] . to_i : nil
466
- end
467
-
468
- def config_timeout ( config )
469
- config [ :timeout ] . present? ? config [ :timeout ] . to_i / 1000 : nil
470
- end
471
-
472
- def config_encoding ( config )
473
- config [ :encoding ] . present? ? config [ :encoding ] : nil
474
- end
475
-
476
- def configure_connection ; end
477
-
478
479
def configure_application_name ; end
479
480
480
481
def initialize_dateformatter
481
482
@database_dateformat = user_options_dateformat
482
483
a , b , c = @database_dateformat . each_char . to_a
484
+
483
485
[ a , b , c ] . each { |f | f . upcase! if f == "y" }
484
486
dateformat = "%#{ a } -%#{ b } -%#{ c } "
485
487
::Date ::DATE_FORMATS [ :_sqlserver_dateformat ] = dateformat
@@ -502,6 +504,13 @@ def version_year
502
504
def sqlserver_version
503
505
@sqlserver_version ||= _raw_select ( "SELECT @@version" , fetch : :rows ) . first . first . to_s
504
506
end
507
+
508
+ private
509
+
510
+ def connect
511
+ @connection = self . class . new_client ( @connection_options )
512
+ configure_connection
513
+ end
505
514
end
506
515
end
507
516
end
0 commit comments