tiny_tds 3.2.0-x86_64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +20 -0
  3. data/.gitattributes +1 -0
  4. data/.github/workflows/ci.yml +590 -0
  5. data/.gitignore +22 -0
  6. data/.rubocop.yml +31 -0
  7. data/CHANGELOG.md +305 -0
  8. data/CODE_OF_CONDUCT.md +31 -0
  9. data/Gemfile +2 -0
  10. data/ISSUE_TEMPLATE.md +38 -0
  11. data/MIT-LICENSE +23 -0
  12. data/README.md +493 -0
  13. data/Rakefile +67 -0
  14. data/VERSION +1 -0
  15. data/bin/defncopy-ttds +3 -0
  16. data/bin/tsql-ttds +3 -0
  17. data/docker-compose.yml +34 -0
  18. data/exe/.keep +0 -0
  19. data/ext/tiny_tds/client.c +492 -0
  20. data/ext/tiny_tds/client.h +53 -0
  21. data/ext/tiny_tds/extconf.rb +190 -0
  22. data/ext/tiny_tds/extconsts.rb +8 -0
  23. data/ext/tiny_tds/result.c +626 -0
  24. data/ext/tiny_tds/result.h +32 -0
  25. data/ext/tiny_tds/tiny_tds_ext.c +15 -0
  26. data/ext/tiny_tds/tiny_tds_ext.h +17 -0
  27. data/lib/tiny_tds/2.7/tiny_tds.so +0 -0
  28. data/lib/tiny_tds/3.0/tiny_tds.so +0 -0
  29. data/lib/tiny_tds/3.1/tiny_tds.so +0 -0
  30. data/lib/tiny_tds/3.2/tiny_tds.so +0 -0
  31. data/lib/tiny_tds/3.3/tiny_tds.so +0 -0
  32. data/lib/tiny_tds/3.4/tiny_tds.so +0 -0
  33. data/lib/tiny_tds/bin.rb +90 -0
  34. data/lib/tiny_tds/client.rb +132 -0
  35. data/lib/tiny_tds/error.rb +12 -0
  36. data/lib/tiny_tds/gem.rb +23 -0
  37. data/lib/tiny_tds/result.rb +5 -0
  38. data/lib/tiny_tds/version.rb +3 -0
  39. data/lib/tiny_tds.rb +42 -0
  40. data/patches/freetds/1.00.27/0001-mingw_missing_inet_pton.diff +34 -0
  41. data/patches/freetds/1.00.27/0002-Don-t-use-MSYS2-file-libws2_32.diff +28 -0
  42. data/patches/libiconv/1.14/1-avoid-gets-error.patch +17 -0
  43. data/ports/x86_64-linux-musl/bin/defncopy +0 -0
  44. data/ports/x86_64-linux-musl/bin/tsql +0 -0
  45. data/ports/x86_64-linux-musl/lib/libsybdb.so.5 +0 -0
  46. data/setup_cimgruby_dev.sh +25 -0
  47. data/start_dev.sh +21 -0
  48. data/tasks/native_gem.rake +16 -0
  49. data/tasks/package.rake +6 -0
  50. data/tasks/ports.rake +24 -0
  51. data/tasks/test.rake +7 -0
  52. data/test/bin/install-freetds.sh +18 -0
  53. data/test/bin/install-mssql.ps1 +42 -0
  54. data/test/bin/install-mssqltools.sh +9 -0
  55. data/test/bin/install-openssl.sh +18 -0
  56. data/test/bin/restore-from-native-gem.ps1 +10 -0
  57. data/test/bin/setup_tinytds_db.sh +7 -0
  58. data/test/bin/setup_volume_permissions.sh +10 -0
  59. data/test/client_test.rb +266 -0
  60. data/test/gem_test.rb +100 -0
  61. data/test/result_test.rb +708 -0
  62. data/test/schema/1px.gif +0 -0
  63. data/test/schema/sqlserver_2017.sql +140 -0
  64. data/test/schema/sqlserver_azure.sql +140 -0
  65. data/test/schema_test.rb +417 -0
  66. data/test/sql/db-create.sql +18 -0
  67. data/test/sql/db-login.sql +38 -0
  68. data/test/test_helper.rb +244 -0
  69. data/test/thread_test.rb +89 -0
  70. data/tiny_tds.gemspec +31 -0
  71. metadata +259 -0
@@ -0,0 +1,244 @@
1
+ require "bundler"
2
+ Bundler.require :development, :test
3
+ require "tiny_tds"
4
+ require "minitest/autorun"
5
+ require "toxiproxy"
6
+
7
+ require "minitest/reporters"
8
+ Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new, Minitest::Reporters::JUnitReporter.new]
9
+
10
+ TINYTDS_SCHEMAS = ["sqlserver_2017", "sqlserver_azure"].freeze
11
+
12
+ module TinyTds
13
+ class TestCase < Minitest::Spec
14
+ class << self
15
+ def current_schema
16
+ ENV["TINYTDS_SCHEMA"] || "sqlserver_2017"
17
+ end
18
+
19
+ TINYTDS_SCHEMAS.each do |schema|
20
+ define_method :"#{schema}?" do
21
+ schema == current_schema
22
+ end
23
+ end
24
+ end
25
+
26
+ after { close_client }
27
+
28
+ protected
29
+
30
+ TINYTDS_SCHEMAS.each do |schema|
31
+ define_method :"#{schema}?" do
32
+ schema == self.class.current_schema
33
+ end
34
+ end
35
+
36
+ def current_schema
37
+ self.class.current_schema
38
+ end
39
+
40
+ def close_client(client = @client)
41
+ client.close if defined?(client) && client.is_a?(TinyTds::Client)
42
+ end
43
+
44
+ def new_connection(options = {})
45
+ client = TinyTds::Client.new(connection_options(options))
46
+ if sqlserver_azure?
47
+ client.execute("SET ANSI_NULLS ON").do
48
+ client.execute("SET CURSOR_CLOSE_ON_COMMIT OFF").do
49
+ client.execute("SET ANSI_NULL_DFLT_ON ON").do
50
+ client.execute("SET IMPLICIT_TRANSACTIONS OFF").do
51
+ client.execute("SET ANSI_PADDING ON").do
52
+ client.execute("SET QUOTED_IDENTIFIER ON").do
53
+ client.execute("SET ANSI_WARNINGS ON").do
54
+ else
55
+ client.execute("SET ANSI_DEFAULTS ON").do
56
+ client.execute("SET CURSOR_CLOSE_ON_COMMIT OFF").do
57
+ client.execute("SET IMPLICIT_TRANSACTIONS OFF").do
58
+ end
59
+ client.execute("SET TEXTSIZE 2147483647").do
60
+ client.execute("SET CONCAT_NULL_YIELDS_NULL ON").do
61
+ client
62
+ end
63
+
64
+ def connection_options(options = {})
65
+ username = (sqlserver_azure? ? ENV["TINYTDS_UNIT_AZURE_USER"] : ENV["TINYTDS_UNIT_USER"]) || "tinytds"
66
+ password = (sqlserver_azure? ? ENV["TINYTDS_UNIT_AZURE_PASS"] : ENV["TINYTDS_UNIT_PASS"]) || ""
67
+ {dataserver: sqlserver_azure? ? nil : ENV["TINYTDS_UNIT_DATASERVER"],
68
+ host: ENV["TINYTDS_UNIT_HOST"] || "localhost",
69
+ port: ENV["TINYTDS_UNIT_PORT"] || "1433",
70
+ tds_version: ENV["TINYTDS_UNIT_VERSION"],
71
+ username: username,
72
+ password: password,
73
+ database: ENV["TINYTDS_UNIT_DATABASE"] || "tinytdstest",
74
+ appname: "TinyTds Dev",
75
+ login_timeout: 5,
76
+ timeout: connection_timeout,
77
+ azure: sqlserver_azure?}.merge(options)
78
+ end
79
+
80
+ def connection_timeout
81
+ sqlserver_azure? ? 20 : 8
82
+ end
83
+
84
+ def assert_client_works(client)
85
+ _(client.execute("SELECT 'client_works' as [client_works]").each).must_equal [{"client_works" => "client_works"}]
86
+ end
87
+
88
+ def assert_new_connections_work
89
+ client = new_connection
90
+ client.execute("SELECT 'new_connections_work' as [new_connections_work]").each
91
+ client.close
92
+ end
93
+
94
+ def assert_raise_tinytds_error(action)
95
+ result = nil
96
+ error_raised = false
97
+ begin
98
+ result = action.call
99
+ rescue TinyTds::Error => e
100
+ error_raised = true
101
+ end
102
+ assert error_raised, "expected a TinyTds::Error but none happened"
103
+ yield e
104
+ ensure
105
+ close_client(result)
106
+ end
107
+
108
+ def inspect_tinytds_exception
109
+ yield
110
+ rescue TinyTds::Error => e
111
+ props = {source: e.source, message: e.message, severity: e.severity,
112
+ db_error_number: e.db_error_number, os_error_number: e.os_error_number}
113
+ raise "TinyTds::Error - #{props.inspect}"
114
+ end
115
+
116
+ def assert_binary_encoding(value)
117
+ assert_equal Encoding.find("BINARY"), value.encoding
118
+ end
119
+
120
+ def assert_utf8_encoding(value)
121
+ assert_equal Encoding.find("UTF-8"), value.encoding
122
+ end
123
+
124
+ def rubyRbx?
125
+ RUBY_DESCRIPTION =~ /rubinius/i
126
+ end
127
+
128
+ def ruby_windows?
129
+ RbConfig::CONFIG["host_os"] =~ /ming/
130
+ end
131
+
132
+ def ruby_darwin?
133
+ RbConfig::CONFIG["host_os"] =~ /darwin/
134
+ end
135
+
136
+ def load_current_schema
137
+ loader = new_connection
138
+ schema_file = File.expand_path File.join(File.dirname(__FILE__), "schema", "#{current_schema}.sql")
139
+ schema_sql = File.open(schema_file, "rb:UTF-8") { |f| f.read }
140
+ loader.execute(drop_sql).do
141
+ loader.execute(schema_sql).do
142
+ loader.execute(sp_sql).do
143
+ loader.execute(sp_error_sql).do
144
+ loader.execute(sp_several_prints_sql).do
145
+ loader.close
146
+ true
147
+ end
148
+
149
+ def drop_sql
150
+ %|IF EXISTS (
151
+ SELECT TABLE_NAME
152
+ FROM INFORMATION_SCHEMA.TABLES
153
+ WHERE TABLE_CATALOG = 'tinytdstest'
154
+ AND TABLE_TYPE = 'BASE TABLE'
155
+ AND TABLE_NAME = 'datatypes'
156
+ ) DROP TABLE [datatypes]
157
+ IF EXISTS (
158
+ SELECT name FROM sysobjects
159
+ WHERE name = 'tinytds_TestReturnCodes' AND type = 'P'
160
+ ) DROP PROCEDURE tinytds_TestReturnCodes
161
+ IF EXISTS (
162
+ SELECT name FROM sysobjects
163
+ WHERE name = 'tinytds_TestPrintWithError' AND type = 'P'
164
+ ) DROP PROCEDURE tinytds_TestPrintWithError
165
+ IF EXISTS (
166
+ SELECT name FROM sysobjects
167
+ WHERE name = 'tinytds_TestSeveralPrints' AND type = 'P'
168
+ ) DROP PROCEDURE tinytds_TestSeveralPrints|
169
+ end
170
+
171
+ def sp_sql
172
+ %|CREATE PROCEDURE tinytds_TestReturnCodes
173
+ AS
174
+ SELECT 1 as [one]
175
+ RETURN(420) |
176
+ end
177
+
178
+ def sp_error_sql
179
+ %|CREATE PROCEDURE tinytds_TestPrintWithError
180
+ AS
181
+ PRINT 'hello'
182
+ RAISERROR('Error following print', 16, 1)|
183
+ end
184
+
185
+ def sp_several_prints_sql
186
+ %(CREATE PROCEDURE tinytds_TestSeveralPrints
187
+ AS
188
+ PRINT 'hello 1'
189
+ PRINT 'hello 2'
190
+ PRINT 'hello 3')
191
+ end
192
+
193
+ def find_value(id, column, query_options = {})
194
+ query_options[:timezone] ||= :utc
195
+ sql = "SELECT [#{column}] FROM [datatypes] WHERE [id] = #{id}"
196
+ @client.execute(sql).each(query_options).first[column.to_s]
197
+ end
198
+
199
+ def local_offset
200
+ TinyTds::Client.local_offset
201
+ end
202
+
203
+ def utc_offset
204
+ ::Time.local(2010).utc_offset
205
+ end
206
+
207
+ def rollback_transaction(client)
208
+ client.execute("BEGIN TRANSACTION").do
209
+ yield
210
+ ensure
211
+ client.execute("ROLLBACK TRANSACTION").do
212
+ end
213
+
214
+ def init_toxiproxy
215
+ # In order for toxiproxy to work for local docker instances of mssql, the containers must be on the same network
216
+ # and the host used below must match the mssql container name so toxiproxy knows where to proxy to.
217
+ # localhost from the perspective of toxiproxy's container is its own container an *not* the mssql container it needs to proxy to.
218
+ # docker-compose.yml handles this automatically for us. In instances where someone is using their own local mssql container they'll
219
+ # need to set up the networks manually and set TINYTDS_UNIT_HOST to their mssql container name
220
+ # For anything other than localhost just use the environment config
221
+ toxi_host = ENV["TOXIPROXY_HOST"] || "localhost"
222
+ toxi_api_port = 8474
223
+ toxi_test_port = 1234
224
+ Toxiproxy.host = "http://#{toxi_host}:#{toxi_api_port}"
225
+
226
+ toxi_upstream_host = ENV["TINYTDS_UNIT_HOST_TEST"] || ENV["TINYTDS_UNIT_HOST"] || "localhost"
227
+ toxi_upstream_port = ENV["TINYTDS_UNIT_PORT"] || 1433
228
+
229
+ puts "\n-------------------------"
230
+ puts "Toxiproxy api listener: #{toxi_host}:#{toxi_api_port}"
231
+ puts "Toxiproxy unit test listener: #{toxi_host}:#{toxi_test_port}"
232
+ puts "Toxiproxy upstream sqlserver: #{toxi_upstream_host}:#{toxi_upstream_port}"
233
+ puts "-------------------------"
234
+
235
+ Toxiproxy.populate([
236
+ {
237
+ name: "sqlserver_test",
238
+ listen: "#{toxi_host}:#{toxi_test_port}",
239
+ upstream: "#{toxi_upstream_host}:#{toxi_upstream_port}"
240
+ }
241
+ ])
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,89 @@
1
+ require "test_helper"
2
+ require "logger"
3
+ require "benchmark"
4
+
5
+ class ThreadTest < TinyTds::TestCase
6
+ describe "Threaded SELECT queries" do
7
+ before do
8
+ @logger = Logger.new $stdout
9
+ @logger.level = Logger::WARN
10
+ @poolsize = 4
11
+ @numthreads = 10
12
+ @query = "waitfor delay '00:00:01'"
13
+ @pool = ConnectionPool.new(size: @poolsize, timeout: 5) { new_connection }
14
+ end
15
+
16
+ after do
17
+ @pool.shutdown { |c| c.close }
18
+ end
19
+
20
+ it "should finish faster in parallel" do
21
+ skip if sqlserver_azure?
22
+ x = Benchmark.realtime do
23
+ threads = []
24
+ @numthreads.times do |i|
25
+ start = Time.new
26
+ threads << Thread.new do
27
+ ts = Time.new
28
+ @pool.with { |c| c.execute(@query).do }
29
+ te = Time.new
30
+ @logger.info "Thread #{i} finished in #{te - ts} thread seconds, #{te - start} real seconds"
31
+ end
32
+ end
33
+ threads.each { |t| t.join }
34
+ end
35
+ assert x < @numthreads, "#{x} is not faster than #{@numthreads} seconds"
36
+ mintime = (1.0 * @numthreads / @poolsize).ceil
37
+ @logger.info "#{@numthreads} queries on #{@poolsize} threads: #{x} sec. Minimum time: #{mintime} sec."
38
+ assert x > mintime, "#{x} is not slower than #{mintime} seconds"
39
+ end
40
+
41
+ it "should not crash on error in parallel" do
42
+ skip if sqlserver_azure?
43
+ threads = []
44
+ @numthreads.times do |i|
45
+ threads << Thread.new do
46
+ @pool.with do |client|
47
+ result = client.execute "select dbname()"
48
+ result.each { |r| puts r }
49
+ rescue => _e
50
+ # We are throwing an error on purpose here since 0.6.1 would
51
+ # segfault on errors thrown in threads
52
+ end
53
+ end
54
+ end
55
+ threads.each { |t| t.join }
56
+ assert true
57
+ end
58
+
59
+ it "should cancel when hitting timeout in thread" do
60
+ exception = false
61
+
62
+ thread = Thread.new do
63
+ @pool.with do |client|
64
+ delay = ("0" + (connection_timeout + 2).to_s)[-2, 2] # Two seconds longer than default.
65
+ result = client.execute "waitfor delay '00:00:#{delay}'; select db_name()"
66
+ result.each { |r| puts r }
67
+ rescue TinyTds::Error => e
68
+ if e.message == "Adaptive Server connection timed out"
69
+ exception = true
70
+ end
71
+ end
72
+ end
73
+
74
+ timer_thread = Thread.new do
75
+ # Sleep until after the timeout should have been reached
76
+ sleep(connection_timeout + 2)
77
+ if !exception
78
+ thread.kill
79
+ raise "Timeout passed without query timing out"
80
+ end
81
+ end
82
+
83
+ thread.join
84
+ timer_thread.join
85
+
86
+ assert exception
87
+ end
88
+ end
89
+ end
data/tiny_tds.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ $LOAD_PATH.push File.expand_path("../lib", __FILE__)
2
+ require "tiny_tds/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "tiny_tds"
6
+ s.version = TinyTds::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Ken Collins", "Erik Bryn", "Will Bond"]
9
+ s.email = ["ken@metaskills.net", "will@wbond.net"]
10
+ s.homepage = "http://github.com/rails-sqlserver/tiny_tds"
11
+ s.summary = "TinyTDS - A modern, simple and fast FreeTDS library for Ruby using DB-Library."
12
+ s.description = "TinyTDS - A modern, simple and fast FreeTDS library for Ruby using DB-Library. Developed for the ActiveRecord SQL Server adapter."
13
+ s.files = `git ls-files`.split("\n") + Dir.glob("exe/*")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
15
+ s.require_paths = ["lib"]
16
+ s.rdoc_options = ["--charset=UTF-8"]
17
+ s.extensions = ["ext/tiny_tds/extconf.rb"]
18
+ s.license = "MIT"
19
+ s.required_ruby_version = ">= 2.7.0"
20
+ s.metadata["msys2_mingw_dependencies"] = "freetds"
21
+ s.add_dependency "bigdecimal", "~> 3"
22
+ s.add_development_dependency "mini_portile2", "~> 2.8.0"
23
+ s.add_development_dependency "rake", "~> 13.0.0"
24
+ s.add_development_dependency "rake-compiler", "~> 1.2"
25
+ s.add_development_dependency "rake-compiler-dock", "~> 1.9.1"
26
+ s.add_development_dependency "minitest", "~> 5.25"
27
+ s.add_development_dependency "minitest-reporters", "~> 1.6.1"
28
+ s.add_development_dependency "connection_pool", "~> 2.2.0"
29
+ s.add_development_dependency "toxiproxy", "~> 2.0.0"
30
+ s.add_development_dependency "standard", "~> 1.31.0"
31
+ end
metadata ADDED
@@ -0,0 +1,259 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tiny_tds
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.2.0
5
+ platform: x86_64-linux-musl
6
+ authors:
7
+ - Ken Collins
8
+ - Erik Bryn
9
+ - Will Bond
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2025-02-11 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bigdecimal
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: mini_portile2
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 2.8.0
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 2.8.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 13.0.0
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 13.0.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake-compiler
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1.2'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.2'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rake-compiler-dock
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 1.9.1
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 1.9.1
84
+ - !ruby/object:Gem::Dependency
85
+ name: minitest
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '5.25'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '5.25'
98
+ - !ruby/object:Gem::Dependency
99
+ name: minitest-reporters
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: 1.6.1
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 1.6.1
112
+ - !ruby/object:Gem::Dependency
113
+ name: connection_pool
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: 2.2.0
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: 2.2.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: toxiproxy
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 2.0.0
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 2.0.0
140
+ - !ruby/object:Gem::Dependency
141
+ name: standard
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 1.31.0
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 1.31.0
154
+ description: TinyTDS - A modern, simple and fast FreeTDS library for Ruby using DB-Library.
155
+ Developed for the ActiveRecord SQL Server adapter.
156
+ email:
157
+ - ken@metaskills.net
158
+ - will@wbond.net
159
+ executables:
160
+ - defncopy-ttds
161
+ - tsql-ttds
162
+ extensions: []
163
+ extra_rdoc_files: []
164
+ files:
165
+ - ".codeclimate.yml"
166
+ - ".gitattributes"
167
+ - ".github/workflows/ci.yml"
168
+ - ".gitignore"
169
+ - ".rubocop.yml"
170
+ - CHANGELOG.md
171
+ - CODE_OF_CONDUCT.md
172
+ - Gemfile
173
+ - ISSUE_TEMPLATE.md
174
+ - MIT-LICENSE
175
+ - README.md
176
+ - Rakefile
177
+ - VERSION
178
+ - bin/defncopy-ttds
179
+ - bin/tsql-ttds
180
+ - docker-compose.yml
181
+ - exe/.keep
182
+ - ext/tiny_tds/client.c
183
+ - ext/tiny_tds/client.h
184
+ - ext/tiny_tds/extconf.rb
185
+ - ext/tiny_tds/extconsts.rb
186
+ - ext/tiny_tds/result.c
187
+ - ext/tiny_tds/result.h
188
+ - ext/tiny_tds/tiny_tds_ext.c
189
+ - ext/tiny_tds/tiny_tds_ext.h
190
+ - lib/tiny_tds.rb
191
+ - lib/tiny_tds/2.7/tiny_tds.so
192
+ - lib/tiny_tds/3.0/tiny_tds.so
193
+ - lib/tiny_tds/3.1/tiny_tds.so
194
+ - lib/tiny_tds/3.2/tiny_tds.so
195
+ - lib/tiny_tds/3.3/tiny_tds.so
196
+ - lib/tiny_tds/3.4/tiny_tds.so
197
+ - lib/tiny_tds/bin.rb
198
+ - lib/tiny_tds/client.rb
199
+ - lib/tiny_tds/error.rb
200
+ - lib/tiny_tds/gem.rb
201
+ - lib/tiny_tds/result.rb
202
+ - lib/tiny_tds/version.rb
203
+ - patches/freetds/1.00.27/0001-mingw_missing_inet_pton.diff
204
+ - patches/freetds/1.00.27/0002-Don-t-use-MSYS2-file-libws2_32.diff
205
+ - patches/libiconv/1.14/1-avoid-gets-error.patch
206
+ - ports/x86_64-linux-musl/bin/defncopy
207
+ - ports/x86_64-linux-musl/bin/tsql
208
+ - ports/x86_64-linux-musl/lib/libsybdb.so.5
209
+ - setup_cimgruby_dev.sh
210
+ - start_dev.sh
211
+ - tasks/native_gem.rake
212
+ - tasks/package.rake
213
+ - tasks/ports.rake
214
+ - tasks/test.rake
215
+ - test/bin/install-freetds.sh
216
+ - test/bin/install-mssql.ps1
217
+ - test/bin/install-mssqltools.sh
218
+ - test/bin/install-openssl.sh
219
+ - test/bin/restore-from-native-gem.ps1
220
+ - test/bin/setup_tinytds_db.sh
221
+ - test/bin/setup_volume_permissions.sh
222
+ - test/client_test.rb
223
+ - test/gem_test.rb
224
+ - test/result_test.rb
225
+ - test/schema/1px.gif
226
+ - test/schema/sqlserver_2017.sql
227
+ - test/schema/sqlserver_azure.sql
228
+ - test/schema_test.rb
229
+ - test/sql/db-create.sql
230
+ - test/sql/db-login.sql
231
+ - test/test_helper.rb
232
+ - test/thread_test.rb
233
+ - tiny_tds.gemspec
234
+ homepage: http://github.com/rails-sqlserver/tiny_tds
235
+ licenses:
236
+ - MIT
237
+ metadata: {}
238
+ rdoc_options:
239
+ - "--charset=UTF-8"
240
+ require_paths:
241
+ - lib
242
+ required_ruby_version: !ruby/object:Gem::Requirement
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: '2.7'
247
+ - - "<"
248
+ - !ruby/object:Gem::Version
249
+ version: 3.5.dev
250
+ required_rubygems_version: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: 3.3.22
255
+ requirements: []
256
+ rubygems_version: 3.6.2
257
+ specification_version: 4
258
+ summary: TinyTDS - A modern, simple and fast FreeTDS library for Ruby using DB-Library.
259
+ test_files: []