tiny_tds 1.0.4-x86-mingw32 → 1.0.5-x86-mingw32

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: da2fc9559aac359fdbbb0e8db1889b99882639b9
4
- data.tar.gz: a6eadf4449ee937c83ef7cea475f197d5eba3419
3
+ metadata.gz: a0e6112a00a1eddb22fdaf22758750bc19ceb340
4
+ data.tar.gz: d1fa7d7465dd329c8db1489c31a55ee9109890d1
5
5
  SHA512:
6
- metadata.gz: dda85977a8b81780bd12bfecdfba72a3ddf39cdc0decbac835b669fa2ae27b8c722fc79e1220768e88685e46f423dc101edbb3decaf71bbe6c19f82a852ecc96
7
- data.tar.gz: c3cafbd909bbbd337807c2c789df6b0ee1cb732f88af60996f9ed0387bc51d6dc871862f8509e8d5592de74ac4d686762867088bd621288e55cdeb4909e3cdac
6
+ metadata.gz: ddfe4a1245fbe78dae33b1fee6625ef3772766726c76d04c6dcf9ae0e2ed720d211182335b7fa7d450c1b95bb1bff2afc0e5a30c659ba334ebd57b4c9705306c
7
+ data.tar.gz: 504836daa5c88f0ba75ada79cc1b43c29ba2ac8db786f36eee2e472c082e824121207e4ac2e0fb2b6d8a441f4631ba6d918533bd658cd2832918a0ccd1e4952d
@@ -0,0 +1,20 @@
1
+ engines:
2
+ bundler-audit:
3
+ enabled: true
4
+ duplication:
5
+ enabled: true
6
+ config:
7
+ languages:
8
+ - ruby
9
+ fixme:
10
+ enabled: true
11
+ rubocop:
12
+ enabled: true
13
+ ratings:
14
+ paths:
15
+ - "**.rb"
16
+ exclude_paths:
17
+ - ext/
18
+ - ports/
19
+ - test/
20
+ - tmp/
@@ -0,0 +1,31 @@
1
+
2
+ AllCops:
3
+ Include:
4
+ - '**/Rakefile'
5
+ Exclude:
6
+ - 'ext/**/*'
7
+ - 'ports/**/*'
8
+ - 'test/**/*'
9
+ - 'tmp/**/*'
10
+
11
+ # Redefined
12
+
13
+ Metrics/LineLength:
14
+ Max: 120
15
+
16
+ Metrics/ClassLength:
17
+ Max: 200
18
+
19
+ # Disabled
20
+
21
+ Style/Documentation:
22
+ Enabled: false
23
+
24
+ Style/EmptyLinesAroundClassBody:
25
+ Enabled: false
26
+
27
+ Style/EmptyLinesAroundModuleBody:
28
+ Enabled: false
29
+
30
+ Style/EmptyLinesAroundBlockBody:
31
+ Enabled: false
data/CHANGELOG CHANGED
@@ -1,3 +1,12 @@
1
+ * 1.0.5 *
2
+
3
+ * Windows Static Builds - Use FreeTDS 1.00.15, OpenSSL 1.0.2j.
4
+ * Appveyor tests 2012, 2014, 2016.
5
+ * Error messages greater than 1024 chars generates a buffer overflow. Fixes #293.
6
+ * Ensures numeric options are treated numerically Fixes #303.
7
+ * New `:contained` login option. May deprecate `:azure`. Fixes #292.
8
+
9
+
1
10
  * 1.0.4 *
2
11
 
3
12
  * Use FreeTDS 1.0 final
@@ -2,4 +2,10 @@ Having problems? Have you checked these first:
2
2
 
3
3
  * Are you using FreeTDS 0.95.80 or later? Check `$ tsql -C` to find out.
4
4
  * If not, please update then uninstall the TinyTDS gem and re-install it.
5
- * Are you using Ubuntu? If so, you may have forgotten to install FreeTDS first.
5
+ * Using Ubuntu? If so, you may have forgotten to install FreeTDS first.
6
+ * Doing work with threads and the raw client? Use the ConnectionPool gem?
7
+
8
+ If none of these help. Please make sure to report:
9
+
10
+ * What platform you are on. Windows, Mac, Ubuntu, etc.
11
+ * What version of FreeTDS you are using.
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # TinyTDS - Simple and fast FreeTDS bindings for Ruby using DB-Library.
2
2
 
3
- [![Build Status](https://ci.appveyor.com/api/projects/status/g2bhhbsdkx0mal55/branch/master?svg=true)](https://ci.appveyor.com/project/rails-sqlserver/tiny-tds/branch/master) [![Gem Version](https://img.shields.io/gem/v/tiny_tds.svg)](https://rubygems.org/gems/tiny_tds) [![Gitter chat](https://img.shields.io/badge/%E2%8A%AA%20GITTER%20-JOIN%20CHAT%20%E2%86%92-brightgreen.svg?style=flat)](https://gitter.im/rails-sqlserver/activerecord-sqlserver-adapter)
3
+ [![Build Status](https://ci.appveyor.com/api/projects/status/g2bhhbsdkx0mal55/branch/master?svg=true)](https://ci.appveyor.com/project/rails-sqlserver/tiny-tds/branch/master) [![Gem Version](https://img.shields.io/gem/v/tiny_tds.svg)](https://rubygems.org/gems/tiny_tds) [![Gitter chat](https://img.shields.io/badge/%E2%8A%AA%20GITTER%20-JOIN%20CHAT%20%E2%86%92-brightgreen.svg?style=flat)](https://gitter.im/rails-sqlserver/activerecord-sqlserver-adapter) <a href="https://codeclimate.com/github/rails-sqlserver/tiny_tds"><img src="https://codeclimate.com/github/rails-sqlserver/tiny_tds/badges/gpa.svg" /></a>
4
4
 
5
5
  The TinyTDS gem is meant to serve the extremely common use-case of connecting, querying and iterating over results to Microsoft SQL Server or Sybase databases from Ruby using the FreeTDS's DB-Library API.
6
6
 
@@ -92,6 +92,8 @@ Creating a new client takes a hash of options. For valid iconv encoding options,
92
92
  * :timeout - Seconds to wait for a response to a SQL command. Default 5 seconds.
93
93
  * :encoding - Any valid iconv value like CP1251 or ISO-8859-1. Default UTF-8.
94
94
  * :azure - Pass true to signal that you are connecting to azure.
95
+ * :contained - Pass true to signal that you are connecting with a contained database user.
96
+ * :use_utf16 - Instead of using UCS-2 for database wide character encoding use UTF-16. Newer Windows versions use this encoding instead of UCS-2. Default true.
95
97
 
96
98
  Use the `#active?` method to determine if a connection is good. The implementation of this method may change but it should always guarantee that a connection is good. Current it checks for either a closed or dead connection.
97
99
 
@@ -324,16 +326,25 @@ SET ANSI_WARNINGS ON
324
326
  Also, please read the [Azure SQL Database General Guidelines and Limitations](https://msdn.microsoft.com/en-us/library/ee336245.aspx) MSDN article to understand the differences. Specifically, the connection constraints section!
325
327
 
326
328
 
329
+ ## Thread Safety
330
+
331
+ TinyTDS must be used with a connection pool for thread safety. If you use ActiveRecord or the [Sequel](https://github.com/jeremyevans/sequel) gem this is done for you. However, if you are using TinyTDS on your own, we recommend using the ConnectionPool gem when using threads:
332
+
333
+ * ConnectionPool Gem - https://github.com/mperham/connection_pool
334
+
335
+ Please read our [thread_test.rb](https://github.com/rails-sqlserver/tiny_tds/blob/master/test/thread_test.rb) file for details on how we test its usage.
336
+
337
+
327
338
  ## Emoji Support 😍
328
339
 
329
- This is possible using FreeTDS version 0.95 or higher. You must add the following config to your `freetds.conf` in either the global section or a specfic dataserver. If you are on Windows, the default location for your conf file will be in `C:\Sites`.
340
+ This is possible using FreeTDS version 0.95 or higher. You must use the `use_utf16` login option or add the following config to your `freetds.conf` in either the global section or a specfic dataserver. If you are on Windows, the default location for your conf file will be in `C:\Sites`.
330
341
 
331
342
  ```ini
332
343
  [global]
333
344
  use utf-16 = true
334
345
  ```
335
346
 
336
- Good news! If you are using FreeTDS v1.0 or later, then `use utf-16` is set true by default!
347
+ The default is true and since FreeTDS v1.0 would do this as well.
337
348
 
338
349
 
339
350
  ## Using MiniPortile
@@ -351,7 +362,7 @@ To find out more about the FreeTDS release system [visit this thread](http://lis
351
362
 
352
363
  ## Compiling Gems for Windows
353
364
 
354
- For the convenience of Windows users, TinyTDS ships pre-compiled gems for Ruby 2.0, 2.1 and 2.2 on Windows. In order to generate these gems, [rake-compiler-dock](https://github.com/rake-compiler/rake-compiler-dock) is used. This project provides a [Docker image](https://registry.hub.docker.com/u/larskanis/rake-compiler-dock/) with rvm, cross-compilers and a number of different target versions of Ruby.
365
+ For the convenience of Windows users, TinyTDS ships pre-compiled gems for Ruby 2.0, 2.1, 2.2, and 2.3 on Windows. In order to generate these gems, [rake-compiler-dock](https://github.com/rake-compiler/rake-compiler-dock) is used. This project provides a [Docker image](https://registry.hub.docker.com/u/larskanis/rake-compiler-dock/) with rvm, cross-compilers and a number of different target versions of Ruby.
355
366
 
356
367
  Run the following rake task to compile the gems for Windows. This will check the availability of [Docker](https://www.docker.com/) (and boot2docker on Windows or OS-X) and will give some advice for download and installation. When docker is running, it will download the docker image (once-only) and start the build:
357
368
 
data/Rakefile CHANGED
@@ -8,14 +8,14 @@ require 'rubygems/package_task'
8
8
  require_relative './ext/tiny_tds/extconsts'
9
9
 
10
10
  def test_libs
11
- ['lib','test']
11
+ %w(lib test)
12
12
  end
13
13
 
14
14
  def test_files
15
15
  if ENV['TEST_FILES']
16
- ENV['TEST_FILES'].split(',').map{ |f| f.strip }.sort
16
+ ENV['TEST_FILES'].split(',').map(&:strip).sort
17
17
  else
18
- Dir.glob("test/**/*_test.rb").sort
18
+ Dir.glob('test/**/*_test.rb').sort
19
19
  end
20
20
  end
21
21
 
@@ -32,7 +32,7 @@ def gem_build_path(spec)
32
32
  File.join 'pkg', spec.full_name
33
33
  end
34
34
 
35
- gemspec = Gem::Specification::load(File.expand_path('../tiny_tds.gemspec', __FILE__))
35
+ gemspec = Gem::Specification.load(File.expand_path('../tiny_tds.gemspec', __FILE__))
36
36
 
37
37
  Rake::TestTask.new do |t|
38
38
  t.libs = test_libs
@@ -47,18 +47,18 @@ end
47
47
 
48
48
  task :compile
49
49
 
50
- task :build => [:clean, :compile]
50
+ task build: [:clean, :compile]
51
51
  task(:build_quietly) { capture_stds { Rake::Task[:build].invoke } }
52
52
 
53
- task :default => [:build, :test]
53
+ task default: [:build, :test]
54
54
 
55
- Dir["tasks/*.rake"].sort.each { |f| load f }
55
+ Dir['tasks/*.rake'].sort.each { |f| load f }
56
56
 
57
57
  Rake::ExtensionTask.new('tiny_tds', gemspec) do |ext|
58
58
  ext.lib_dir = 'lib/tiny_tds'
59
59
  ext.cross_compile = true
60
60
  ext.cross_platform = ['x86-mingw32', 'x64-mingw32']
61
- ext.cross_config_options += %w[ --disable-lookup --enable-cross-build ]
61
+ ext.cross_config_options += %w(--disable-lookup --enable-cross-build)
62
62
  # Add dependent DLLs to the cross gems
63
63
  ext.cross_compiling do |spec|
64
64
  platform_host_map = {
@@ -70,16 +70,16 @@ Rake::ExtensionTask.new('tiny_tds', gemspec) do |ext|
70
70
  dlls = [
71
71
  "libeay32-1.0.2g-#{host}.dll",
72
72
  "ssleay32-1.0.2g-#{host}.dll",
73
- "libiconv-2.dll",
74
- "libsybdb-5.dll",
73
+ 'libiconv-2.dll',
74
+ 'libsybdb-5.dll'
75
75
  ]
76
76
  # We don't need the sources in a fat binary gem
77
- spec.files = spec.files.reject { |f| f=~/^ports\/archives/ }
77
+ spec.files = spec.files.reject { |f| f =~ %r{^ports\/archives/} }
78
78
  spec.files += dlls.map { |dll| "ports/#{host}/bin/#{File.basename(dll)}" }
79
79
  spec.files += Dir.glob('exe/*')
80
80
  dlls.each do |dll|
81
81
  file "ports/#{host}/bin/#{dll}" do |t|
82
- sh "x86_64-w64-mingw32-strip", t.name
82
+ sh 'x86_64-w64-mingw32-strip', t.name
83
83
  end
84
84
  end
85
85
  end
@@ -90,7 +90,7 @@ task gem_build_path(gemspec) do
90
90
  add_file_to_gem gemspec, "ports/archives/freetds-#{FREETDS_VERSION}.tar.bz2"
91
91
  end
92
92
 
93
- desc "Build the windows binary gems per rake-compiler-dock"
93
+ desc 'Build the windows binary gems per rake-compiler-dock'
94
94
  task 'gem:windows' do
95
95
  require 'rake_compiler_dock'
96
96
  RakeCompilerDock.sh <<-EOT
@@ -99,8 +99,10 @@ task 'gem:windows' do
99
99
  end
100
100
 
101
101
  def capture_stds
102
- pstdout, $stdout = $stdout, StringIO.new
103
- pstderr, $stderr = $stderr, StringIO.new
102
+ pstdout = $stdout
103
+ $stdout = StringIO.new
104
+ pstderr = $stderr
105
+ $stderr = StringIO.new
104
106
  yield
105
107
  $stdout.string
106
108
  $stderr.string
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.4
1
+ 1.0.5
@@ -2,12 +2,14 @@ init:
2
2
  - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
3
3
  - SET PATH=C:\MinGW\msys\1.0\bin;%PATH%
4
4
  - SET RAKEOPT=-rdevkit
5
+ - SET TESTOPTS='-v'
5
6
  clone_depth: 5
6
7
  skip_tags: true
7
8
  matrix:
8
9
  fast_finish: true
9
10
  install:
10
11
  - ps: Update-AppveyorBuild -Version "$(Get-Content $env:appveyor_build_folder\VERSION).$env:appveyor_build_number"
12
+ - perl --version
11
13
  - ruby --version
12
14
  - gem --version
13
15
  - bundle install
@@ -20,6 +22,12 @@ test_script:
20
22
  - timeout /t 4 /nobreak > NUL
21
23
  - powershell -File "%APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.ps1"
22
24
  - timeout /t 4 /nobreak > NUL
25
+ - ps: Start-Service 'MSSQL$SQL2016'
26
+ - timeout /t 4 /nobreak > NUL
27
+ - sqlcmd -S ".\SQL2016" -U sa -P Password12! -i %APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.sql
28
+ - bundle exec rake TINYTDS_UNIT_HOST_TEST=localhost TINYTDS_UNIT_DATASERVER="localhost\SQL2016" TINYTDS_SCHEMA=sqlserver_2014 TDSVER=7.1
29
+ - bundle exec rake TINYTDS_UNIT_HOST_TEST=localhost TINYTDS_UNIT_DATASERVER="localhost\SQL2016" TINYTDS_SCHEMA=sqlserver_2014
30
+ - ps: Stop-Service 'MSSQL$SQL2016'
23
31
  - ps: Start-Service 'MSSQL$SQL2014'
24
32
  - timeout /t 4 /nobreak > NUL
25
33
  - sqlcmd -S ".\SQL2014" -U sa -P Password12! -i %APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.sql
@@ -30,22 +38,14 @@ test_script:
30
38
  - timeout /t 4 /nobreak > NUL
31
39
  - sqlcmd -S ".\SQL2012SP1" -U sa -P Password12! -i %APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.sql
32
40
  - bundle exec rake TINYTDS_UNIT_HOST_TEST=localhost TINYTDS_UNIT_DATASERVER="localhost\SQL2012SP1" TINYTDS_SCHEMA=sqlserver_2014
33
- - ps: Stop-Service 'MSSQL$SQL2012SP1'
34
- - ps: Start-Service 'MSSQL$SQL2008R2SP2'
35
- - timeout /t 4 /nobreak > NUL
36
- - sqlcmd -S ".\SQL2008R2SP2" -U sa -P Password12! -i %APPVEYOR_BUILD_FOLDER%\test\appveyor\dbsetup.sql
37
- - bundle exec rake TINYTDS_UNIT_HOST_TEST=localhost TINYTDS_UNIT_DATASERVER="localhost\SQL2008R2SP2" TINYTDS_SCHEMA=sqlserver_2008
38
- - timeout /t 4 /nobreak > NUL
39
- - bundle exec rake TINYTDS_UNIT_HOST_TEST=%CI_AZURE_HOST% TINYTDS_UNIT_HOST=%CI_AZURE_HOST% TINYTDS_SCHEMA=sqlserver_azure
40
41
  environment:
41
42
  CI_AZURE_HOST:
42
43
  secure: 8ydpYysZYKEBKvp6plKlYfepH98/zAuT27FFCaJ9Sss=
43
44
  TINYTDS_UNIT_AZURE_PASS:
44
45
  secure: fYKSKV4v+36OFQp2nZdX4DfUpgmy5cm0wuR73cgdmEk=
45
46
  matrix:
46
- - ruby_version: "200"
47
- - ruby_version: "23"
48
47
  - ruby_version: "23-x64"
48
+ - ruby_version: "23"
49
+ - ruby_version: "200"
49
50
  on_failure:
50
51
  - find -name compile.log | xargs cat
51
-
@@ -3,7 +3,7 @@
3
3
 
4
4
  VALUE cTinyTdsClient;
5
5
  extern VALUE mTinyTds, cTinyTdsError;
6
- static ID sym_username, sym_password, sym_dataserver, sym_database, sym_appname, sym_tds_version, sym_login_timeout, sym_timeout, sym_encoding, sym_azure;
6
+ static ID sym_username, sym_password, sym_dataserver, sym_database, sym_appname, sym_tds_version, sym_login_timeout, sym_timeout, sym_encoding, sym_azure, sym_contained, sym_use_utf16;
7
7
  static ID intern_source_eql, intern_severity_eql, intern_db_error_number_eql, intern_os_error_number_eql;
8
8
  static ID intern_new, intern_dup, intern_transpose_iconv_encoding, intern_local_offset, intern_gsub;
9
9
  VALUE opt_escape_regex, opt_escape_dblquote;
@@ -110,8 +110,8 @@ int tinytds_err_handler(DBPROCESS *dbproc, int severity, int dberr, int oserr, c
110
110
  */
111
111
  if (!userdata->nonblocking_error.is_set) {
112
112
  userdata->nonblocking_error.cancel = cancel;
113
- strcpy(userdata->nonblocking_error.error, dberrstr);
114
- strcpy(userdata->nonblocking_error.source, source);
113
+ strncpy(userdata->nonblocking_error.error, dberrstr, ERROR_MSG_SIZE);
114
+ strncpy(userdata->nonblocking_error.source, source, ERROR_MSG_SIZE);
115
115
  userdata->nonblocking_error.severity = severity;
116
116
  userdata->nonblocking_error.dberr = dberr;
117
117
  userdata->nonblocking_error.oserr = oserr;
@@ -133,8 +133,8 @@ int tinytds_msg_handler(DBPROCESS *dbproc, DBINT msgno, int msgstate, int severi
133
133
  if (userdata && userdata->nonblocking) {
134
134
  if (!userdata->nonblocking_error.is_set) {
135
135
  userdata->nonblocking_error.cancel = 1;
136
- strcpy(userdata->nonblocking_error.error, msgtext);
137
- strcpy(userdata->nonblocking_error.source, source);
136
+ strncpy(userdata->nonblocking_error.error, msgtext, ERROR_MSG_SIZE);
137
+ strncpy(userdata->nonblocking_error.source, source, ERROR_MSG_SIZE);
138
138
  userdata->nonblocking_error.severity = severity;
139
139
  userdata->nonblocking_error.dberr = msgno;
140
140
  userdata->nonblocking_error.oserr = msgstate;
@@ -293,7 +293,7 @@ static VALUE rb_tinytds_identity_sql(VALUE self) {
293
293
 
294
294
  static VALUE rb_tinytds_connect(VALUE self, VALUE opts) {
295
295
  /* Parsing options hash to local vars. */
296
- VALUE user, pass, dataserver, database, app, version, ltimeout, timeout, charset, azure;
296
+ VALUE user, pass, dataserver, database, app, version, ltimeout, timeout, charset, azure, contained, use_utf16;
297
297
  GET_CLIENT_WRAPPER(self);
298
298
 
299
299
  user = rb_hash_aref(opts, sym_username);
@@ -306,6 +306,8 @@ static VALUE rb_tinytds_connect(VALUE self, VALUE opts) {
306
306
  timeout = rb_hash_aref(opts, sym_timeout);
307
307
  charset = rb_hash_aref(opts, sym_encoding);
308
308
  azure = rb_hash_aref(opts, sym_azure);
309
+ contained = rb_hash_aref(opts, sym_contained);
310
+ use_utf16 = rb_hash_aref(opts, sym_use_utf16);
309
311
  /* Dealing with options. */
310
312
  if (dbinit() == FAIL) {
311
313
  rb_raise(cTinyTdsError, "failed dbinit() function");
@@ -328,13 +330,28 @@ static VALUE rb_tinytds_connect(VALUE self, VALUE opts) {
328
330
  dbsettime(NUM2INT(timeout));
329
331
  if (!NIL_P(charset))
330
332
  DBSETLCHARSET(cwrap->login, StringValueCStr(charset));
331
- if (!NIL_P(database) && (azure == Qtrue)) {
332
- #ifdef DBSETLDBNAME
333
- DBSETLDBNAME(cwrap->login, StringValueCStr(database));
334
- #else
335
- rb_warn("TinyTds: Azure connections not supported in this version of FreeTDS.\n");
336
- #endif
333
+ if (!NIL_P(database)) {
334
+ if (azure == Qtrue || contained == Qtrue) {
335
+ #ifdef DBSETLDBNAME
336
+ DBSETLDBNAME(cwrap->login, StringValueCStr(database));
337
+ #else
338
+ if (azure == Qtrue) {
339
+ rb_warn("TinyTds: :azure option is not supported in this version of FreeTDS.\n");
340
+ }
341
+ if (contained == Qtrue) {
342
+ rb_warn("TinyTds: :contained option is not supported in this version of FreeTDS.\n");
343
+ }
344
+ #endif
345
+ }
337
346
  }
347
+ #ifdef DBSETUTF16
348
+ if (use_utf16 == Qtrue) { DBSETLUTF16(cwrap->login, 1); }
349
+ if (use_utf16 == Qfalse) { DBSETLUTF16(cwrap->login, 0); }
350
+ #else
351
+ if (use_utf16 == Qtrue || use_utf16 == Qfalse) {
352
+ rb_warn("TinyTds: :use_utf16 option not supported in this version of FreeTDS.\n");
353
+ }
354
+ #endif
338
355
  cwrap->client = dbopen(cwrap->login, StringValueCStr(dataserver));
339
356
  if (cwrap->client) {
340
357
  VALUE transposed_encoding;
@@ -391,6 +408,7 @@ void init_tinytds_client() {
391
408
  sym_timeout = ID2SYM(rb_intern("timeout"));
392
409
  sym_encoding = ID2SYM(rb_intern("encoding"));
393
410
  sym_azure = ID2SYM(rb_intern("azure"));
411
+ sym_contained = ID2SYM(rb_intern("contained"));
394
412
  /* Intern TinyTds::Error Accessors */
395
413
  intern_source_eql = rb_intern("source=");
396
414
  intern_severity_eql = rb_intern("severity=");
@@ -4,11 +4,13 @@
4
4
 
5
5
  void init_tinytds_client();
6
6
 
7
+ #define ERROR_MSG_SIZE 1024
8
+
7
9
  typedef struct {
8
10
  short int is_set;
9
11
  int cancel;
10
- char error[1024];
11
- char source[1024];
12
+ char error[ERROR_MSG_SIZE];
13
+ char source[ERROR_MSG_SIZE];
12
14
  int severity;
13
15
  int dberr;
14
16
  int oserr;
@@ -5,7 +5,7 @@ ICONV_SOURCE_URI = "http://ftp.gnu.org/pub/gnu/libiconv/libiconv-#{ICONV_VERSION
5
5
  OPENSSL_VERSION = ENV['TINYTDS_OPENSSL_VERSION'] || '1.0.2g'
6
6
  OPENSSL_SOURCE_URI = "https://www.openssl.org/source/openssl-#{OPENSSL_VERSION}.tar.gz"
7
7
 
8
- FREETDS_VERSION = ENV['TINYTDS_FREETDS_VERSION'] || "1.00"
8
+ FREETDS_VERSION = ENV['TINYTDS_FREETDS_VERSION'] || "1.00.15"
9
9
  FREETDS_VERSION_INFO = Hash.new { |h,k|
10
10
  h[k] = {files: "ftp://ftp.freetds.org/pub/freetds/stable/freetds-#{k}.tar.bz2"}
11
11
  }
@@ -10,12 +10,12 @@ require 'tiny_tds/result'
10
10
 
11
11
  # Support multiple ruby versions, fat binaries under Windows.
12
12
  if RUBY_PLATFORM =~ /mingw|mswin/ && RUBY_VERSION =~ /(\d+.\d+)/
13
- ver = $1
13
+ ver = Regexp.last_match(1)
14
14
  # Set the PATH environment variable, so that the DLLs can be found.
15
15
  old_path = ENV['PATH']
16
16
  begin
17
17
  # Do the same host consolidation as in extconf.rb
18
- ports_dir = RbConfig::CONFIG["host"].gsub('i686-pc-mingw32', 'i686-w64-mingw32')
18
+ ports_dir = RbConfig::CONFIG['host'].gsub('i686-pc-mingw32', 'i686-w64-mingw32')
19
19
  ENV['PATH'] = "#{File.expand_path("../../ports/#{ports_dir}/bin", __FILE__)};#{old_path}"
20
20
  require "tiny_tds/#{ver}/tiny_tds"
21
21
  rescue LoadError
@@ -27,9 +27,9 @@ else
27
27
  # Load dependent shared libraries into the process, so that they are already present,
28
28
  # when tiny_tds.so is loaded. This ensures, that shared libraries are loaded even when
29
29
  # the path is different between build and run time (e.g. Heroku).
30
- ports_libs = File.expand_path("../../ports/#{RbConfig::CONFIG["host"]}/lib/*.so", __FILE__)
30
+ ports_libs = File.expand_path("../../ports/#{RbConfig::CONFIG['host']}/lib/*.so", __FILE__)
31
31
  Dir[ports_libs].each do |lib|
32
- require "fiddle"
32
+ require 'fiddle'
33
33
  Fiddle.dlopen(lib)
34
34
  end
35
35
 
@@ -29,19 +29,18 @@ module TinyTds
29
29
  def run(*args)
30
30
  return nil unless path
31
31
  Kernel.system Shellwords.join(args.unshift(path))
32
- $?.to_i
32
+ $CHILD_STATUS.to_i
33
33
  end
34
34
 
35
35
  def path
36
36
  return @path if defined?(@path)
37
- @path = @exefile && File.exists?(@exefile) ? @exefile : which
37
+ @path = @exefile && File.exist?(@exefile) ? @exefile : which
38
38
  end
39
39
 
40
40
  def info
41
41
  "[TinyTds][v#{TinyTds::VERSION}][#{name}]: #{path}"
42
42
  end
43
43
 
44
-
45
44
  private
46
45
 
47
46
  def find_bin
@@ -51,7 +50,7 @@ module TinyTds
51
50
  def find_exe
52
51
  EXTS.each do |ext|
53
52
  f = File.join ROOT, 'exe', "#{name}#{ext}"
54
- return f if File.exists?(f)
53
+ return f if File.exist?(f)
55
54
  end
56
55
  nil
57
56
  end
@@ -61,12 +60,12 @@ module TinyTds
61
60
  EXTS.each do |ext|
62
61
  exe = File.expand_path File.join(path, "#{name}#{ext}"), ROOT
63
62
  next if exe == @binstub
64
- next if !File.executable?(exe)
65
- next if !binary?(exe)
63
+ next unless File.executable?(exe)
64
+ next unless binary?(exe)
66
65
  return exe
67
66
  end
68
67
  end
69
- return nil
68
+ nil
70
69
  end
71
70
 
72
71
  # Implementation directly copied from ptools.
@@ -77,9 +76,9 @@ module TinyTds
77
76
  bytes = File.stat(file).blksize
78
77
  return false unless bytes
79
78
  bytes = 4096 if bytes > 4096
80
- s = (File.read(file, bytes) || "")
81
- s = s.encode('US-ASCII', :undef => :replace).split(//)
82
- ((s.size - s.grep(" ".."~").size) / s.size.to_f) > 0.30
79
+ s = (File.read(file, bytes) || '')
80
+ s = s.encode('US-ASCII', undef: :replace).split(//)
81
+ ((s.size - s.grep(' '..'~').size) / s.size.to_f) > 0.30
83
82
  end
84
83
 
85
84
  end
@@ -1,21 +1,19 @@
1
1
  module TinyTds
2
2
  class Client
3
3
 
4
- @@default_query_options = {
5
- :as => :hash,
6
- :symbolize_keys => false,
7
- :cache_rows => true,
8
- :timezone => :local,
9
- :empty_sets => true
4
+ @default_query_options = {
5
+ as: :hash,
6
+ symbolize_keys: false,
7
+ cache_rows: true,
8
+ timezone: :local,
9
+ empty_sets: true
10
10
  }
11
11
 
12
12
  attr_reader :query_options
13
13
 
14
14
  class << self
15
15
 
16
- def default_query_options
17
- @@default_query_options
18
- end
16
+ attr_reader :default_query_options
19
17
 
20
18
  # Most, if not all, iconv encoding names can be found by ruby. Just in case, you can
21
19
  # overide this method to return a string name that Encoding.find would work with. Default
@@ -25,21 +23,33 @@ module TinyTds
25
23
  encoding
26
24
  end
27
25
 
28
- end
26
+ def local_offset
27
+ ::Time.local(2010).utc_offset.to_r / 86_400
28
+ end
29
29
 
30
+ end
30
31
 
31
- def initialize(opts={})
32
- raise ArgumentError, 'missing :host option if no :dataserver given' if opts[:dataserver].to_s.empty? && opts[:host].to_s.empty?
32
+ # rubocop:disable Metrics/AbcSize
33
+ # rubocop:disable Metrics/MethodLength
34
+ # rubocop:disable Metrics/CyclomaticComplexity
35
+ # rubocop:disable Metrics/PerceivedComplexity
36
+ def initialize(opts = {})
37
+ if opts[:dataserver].to_s.empty? && opts[:host].to_s.empty?
38
+ raise ArgumentError, 'missing :host option if no :dataserver given'
39
+ end
33
40
  opts[:username] = parse_username(opts)
34
- @query_options = @@default_query_options.dup
41
+ @query_options = self.class.default_query_options.dup
35
42
  opts[:password] = opts[:password].to_s if opts[:password] && opts[:password].to_s.strip != ''
36
43
  opts[:appname] ||= 'TinyTds'
37
44
  opts[:tds_version] = tds_versions_setter(opts)
45
+ opts[:use_utf16] ||= true
38
46
  opts[:login_timeout] ||= 60
39
47
  opts[:timeout] ||= 5
40
- opts[:encoding] = (opts[:encoding].nil? || opts[:encoding].downcase == 'utf8') ? 'UTF-8' : opts[:encoding].upcase
48
+ opts[:encoding] = opts[:encoding].nil? || opts[:encoding].casecmp('utf8').zero? ? 'UTF-8' : opts[:encoding].upcase
41
49
  opts[:port] ||= 1433
42
50
  opts[:dataserver] = "#{opts[:host]}:#{opts[:port]}" if opts[:dataserver].to_s.empty?
51
+ forced_integer_keys = [:login_timeout, :port, :timeout]
52
+ forced_integer_keys.each { |k| opts[k] = opts[k].to_i if opts[k] }
43
53
  connect(opts)
44
54
  end
45
55
 
@@ -56,24 +66,19 @@ module TinyTds
56
66
  !closed? && !dead?
57
67
  end
58
68
 
59
-
60
69
  private
61
70
 
62
- def self.local_offset
63
- ::Time.local(2010).utc_offset.to_r / 86400
64
- end
65
-
66
71
  def parse_username(opts)
67
72
  host = opts[:host]
68
73
  username = opts[:username]
69
74
  return username if username.nil? || !opts[:azure]
70
- return username if username.include?("@") && !username.include?("database.windows.net")
71
- user, domain = username.split("@")
75
+ return username if username.include?('@') && !username.include?('database.windows.net')
76
+ user, domain = username.split('@')
72
77
  domain ||= host
73
78
  "#{user}@#{domain.split('.').first}"
74
79
  end
75
80
 
76
- def tds_versions_setter(opts={})
81
+ def tds_versions_setter(opts = {})
77
82
  v = opts[:tds_version] || ENV['TDSVER'] || '7.3'
78
83
  TDS_VERSIONS_SETTERS[v.to_s]
79
84
  end
@@ -105,19 +110,19 @@ module TinyTds
105
110
  # The integer values of the constants are poorly chosen.
106
111
  #
107
112
  TDS_VERSIONS_GETTERS = {
108
- 0 => {:name => 'DBTDS_UNKNOWN', :description => 'Unknown'},
109
- 1 => {:name => 'DBTDS_2_0', :description => 'Pre 4.0 SQL Server'},
110
- 2 => {:name => 'DBTDS_3_4', :description => 'Microsoft SQL Server (3.0)'},
111
- 3 => {:name => 'DBTDS_4_0', :description => '4.0 SQL Server'},
112
- 4 => {:name => 'DBTDS_4_2', :description => '4.2 SQL Server'},
113
- 5 => {:name => 'DBTDS_4_6', :description => '2.0 OpenServer and 4.6 SQL Server.'},
114
- 6 => {:name => 'DBTDS_4_9_5', :description => '4.9.5 (NCR) SQL Server'},
115
- 7 => {:name => 'DBTDS_5_0', :description => '5.0 SQL Server'},
116
- 8 => {:name => 'DBTDS_7_0', :description => 'Microsoft SQL Server 7.0'},
117
- 9 => {:name => 'DBTDS_7_1/DBTDS_8_0', :description => 'Microsoft SQL Server 2000'},
118
- 10 => {:name => 'DBTDS_7_2/DBTDS_9_0', :description => 'Microsoft SQL Server 2005'},
119
- 11 => {:name => 'DBTDS_7_3', :description => 'Microsoft SQL Server 2008'},
120
- 12 => {:name => 'DBTDS_7_4', :description => 'Microsoft SQL Server 2012/2014'}
113
+ 0 => { name: 'DBTDS_UNKNOWN', description: 'Unknown' },
114
+ 1 => { name: 'DBTDS_2_0', description: 'Pre 4.0 SQL Server' },
115
+ 2 => { name: 'DBTDS_3_4', description: 'Microsoft SQL Server (3.0)' },
116
+ 3 => { name: 'DBTDS_4_0', description: '4.0 SQL Server' },
117
+ 4 => { name: 'DBTDS_4_2', description: '4.2 SQL Server' },
118
+ 5 => { name: 'DBTDS_4_6', description: '2.0 OpenServer and 4.6 SQL Server.' },
119
+ 6 => { name: 'DBTDS_4_9_5', description: '4.9.5 (NCR) SQL Server' },
120
+ 7 => { name: 'DBTDS_5_0', description: '5.0 SQL Server' },
121
+ 8 => { name: 'DBTDS_7_0', description: 'Microsoft SQL Server 7.0' },
122
+ 9 => { name: 'DBTDS_7_1/DBTDS_8_0', description: 'Microsoft SQL Server 2000' },
123
+ 10 => { name: 'DBTDS_7_2/DBTDS_9_0', description: 'Microsoft SQL Server 2005' },
124
+ 11 => { name: 'DBTDS_7_3', description: 'Microsoft SQL Server 2008' },
125
+ 12 => { name: 'DBTDS_7_4', description: 'Microsoft SQL Server 2012/2014' }
121
126
  }.freeze
122
127
 
123
128
  end
@@ -10,6 +10,5 @@ module TinyTds
10
10
  @os_error_number = nil
11
11
  end
12
12
 
13
-
14
13
  end
15
14
  end
@@ -1,8 +1,7 @@
1
1
  module TinyTds
2
2
  class Result
3
-
3
+
4
4
  include Enumerable
5
-
6
-
5
+
7
6
  end
8
7
  end
@@ -1,3 +1,3 @@
1
1
  module TinyTds
2
- VERSION = File.read(File.expand_path("../../../VERSION", __FILE__)).chomp
2
+ VERSION = File.read(File.expand_path('../../../VERSION', __FILE__)).chomp
3
3
  end
@@ -5,7 +5,7 @@ Write-Output "Setting up..."
5
5
 
6
6
  Write-Output "Setting variables..."
7
7
  $serverName = $env:COMPUTERNAME
8
- $instances = @('SQL2008R2SP2', 'SQL2012SP1', 'SQL2014')
8
+ $instances = @('SQL2012SP1', 'SQL2014', 'SQL2016')
9
9
  $smo = 'Microsoft.SqlServer.Management.Smo.'
10
10
  $wmi = new-object ($smo + 'Wmi.ManagedComputer')
11
11
 
@@ -46,20 +46,26 @@ class ClientTest < TinyTds::TestCase
46
46
  assert_equal "''hello''", @client.escape("'hello'")
47
47
  end
48
48
 
49
- it 'allows valid iconv character set' do
50
- ['CP850', 'CP1252', 'ISO-8859-1'].each do |encoding|
51
- client = new_connection(:encoding => encoding)
52
- assert_equal encoding, client.charset
53
- assert_equal Encoding.find(encoding), client.encoding
54
- client.close
49
+ ['CP850', 'CP1252', 'ISO-8859-1'].each do |encoding|
50
+ it "allows valid iconv character set - #{encoding}" do
51
+ begin
52
+ client = new_connection(:encoding => encoding)
53
+ assert_equal encoding, client.charset
54
+ assert_equal Encoding.find(encoding), client.encoding
55
+ ensure
56
+ client.close if client
57
+ end
55
58
  end
56
59
  end
57
60
 
58
61
  it 'must be able to use :host/:port connection' do
59
62
  host = ENV['TINYTDS_UNIT_HOST_TEST'] || ENV['TINYTDS_UNIT_HOST']
60
63
  port = ENV['TINYTDS_UNIT_PORT_TEST'] || ENV['TINYTDS_UNIT_PORT'] || 1433
61
- client = new_connection dataserver: nil, host: host, port: port
62
- client.close
64
+ begin
65
+ client = new_connection dataserver: nil, host: host, port: port
66
+ ensure
67
+ client.close if client
68
+ end
63
69
  end unless sqlserver_azure?
64
70
 
65
71
  end
@@ -0,0 +1,140 @@
1
+
2
+ /*
3
+
4
+ * Binary Data - Our test binary data is a 1 pixel gif. The basic (raw) data is below. Quoting this data
5
+ would involve this (encode) method and be (encoded) with the 0x prefix for raw SQL. In other clients the
6
+ (raw_db) value without the 0x prefix would need to be (packed) again yield the original (raw) value.
7
+
8
+ (raw) - "GIF89a\001\000\001\000\221\000\000\377\377\377\377\377\377\376\001\002\000\000\000!\371\004\004\024\000\377\000,\000\000\000\000\001\000\001\000\000\002\002D\001\000;"
9
+ (encode) - "0x#{raw.unpack("H*")[0]}"
10
+ (encoded) - "0x47494638396101000100910000fffffffffffffe010200000021f904041400ff002c00000000010001000002024401003b"
11
+ (raw_db) - "47494638396101000100910000fffffffffffffe010200000021f904041400ff002c00000000010001000002024401003b"
12
+ (packed) - [raw_db].pack('H*')
13
+
14
+ */
15
+
16
+ CREATE TABLE [dbo].[datatypes] (
17
+ [id] [int] NOT NULL IDENTITY(1,1) PRIMARY KEY,
18
+ [bigint] [bigint] NULL,
19
+ [binary_50] [binary](50) NULL,
20
+ [bit] [bit] NULL,
21
+ [char_10] [char](10) NULL,
22
+ [date] [date] NULL,
23
+ [datetime] [datetime] NULL,
24
+ [datetime2_7] [datetime2](7) NULL,
25
+ [datetime2_2] [datetime2](2) NULL,
26
+ [datetimeoffset_2] [datetimeoffset](2) NULL,
27
+ [datetimeoffset_7] [datetimeoffset](7) NULL,
28
+ [decimal_9_2] [decimal](9, 2) NULL,
29
+ [decimal_16_4] [decimal](16, 4) NULL,
30
+ [float] [float] NULL,
31
+ [geography] [geography] NULL,
32
+ [geometry] [geometry] NULL,
33
+ [hierarchyid] [hierarchyid] NULL,
34
+ [image] [image] NULL,
35
+ [int] [int] NULL,
36
+ [money] [money] NULL,
37
+ [nchar_10] [nchar](10) NULL,
38
+ [ntext] [ntext] NULL,
39
+ [numeric_18_0] [numeric](18, 0) NULL,
40
+ [numeric_36_2] [numeric](36, 2) NULL,
41
+ [nvarchar_50] [nvarchar](50) NULL,
42
+ [nvarchar_max] [nvarchar](max) NULL,
43
+ [real] [real] NULL,
44
+ [smalldatetime] [smalldatetime] NULL,
45
+ [smallint] [smallint] NULL,
46
+ [smallmoney] [smallmoney] NULL,
47
+ [text] [text] NULL,
48
+ [time_2] [time](2) NULL,
49
+ [time_7] [time](7) NULL,
50
+ [timestamp] [timestamp] NULL,
51
+ [tinyint] [tinyint] NULL,
52
+ [uniqueidentifier] [uniqueidentifier] NULL,
53
+ [varbinary_50] [varbinary](50) NULL,
54
+ [varbinary_max] [varbinary](max) NULL,
55
+ [varchar_50] [varchar](50) NULL,
56
+ [varchar_max] [varchar](max) NULL,
57
+ [xml] [xml] NULL
58
+ ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
59
+
60
+ SET IDENTITY_INSERT [datatypes] ON
61
+
62
+ INSERT INTO [datatypes] ([id], [bigint]) VALUES ( 11, -9223372036854775807 )
63
+ INSERT INTO [datatypes] ([id], [bigint]) VALUES ( 12, 9223372036854775806 )
64
+ INSERT INTO [datatypes] ([id], [binary_50]) VALUES ( 21, 0x47494638396101000100910000fffffffffffffe010200000021f904041400ff002c00000000010001000002024401003b )
65
+ INSERT INTO [datatypes] ([id], [bit]) VALUES ( 31, 1 )
66
+ INSERT INTO [datatypes] ([id], [bit]) VALUES ( 32, 0 )
67
+ INSERT INTO [datatypes] ([id], [char_10]) VALUES ( 41, '1234567890' )
68
+ INSERT INTO [datatypes] ([id], [char_10]) VALUES ( 42, '12345678' )
69
+ INSERT INTO [datatypes] ([id], [date]) VALUES ( 51, '0001-01-01' )
70
+ INSERT INTO [datatypes] ([id], [date]) VALUES ( 52, '9999-12-31' )
71
+ INSERT INTO [datatypes] ([id], [datetime]) VALUES ( 61, '1753-01-01T00:00:00.000' )
72
+ INSERT INTO [datatypes] ([id], [datetime]) VALUES ( 62, '9999-12-31T23:59:59.997' )
73
+ INSERT INTO [datatypes] ([id], [datetime]) VALUES ( 63, '2010-01-01T12:34:56.123' )
74
+ INSERT INTO [datatypes] ([id], [datetime2_7]) VALUES ( 71, '0001-01-01 00:00:00.0000000' )
75
+ INSERT INTO [datatypes] ([id], [datetime2_7]) VALUES ( 72, '1984-01-24 04:20:00.0000000' )
76
+ INSERT INTO [datatypes] ([id], [datetime2_7]) VALUES ( 73, '9999-12-31 23:59:59.9999999' )
77
+ INSERT INTO [datatypes] ([id], [datetime2_2]) VALUES ( 74, '9999-12-31 23:59:59.123456789' )
78
+ INSERT INTO [datatypes] ([id], [datetimeoffset_2]) VALUES ( 81, '1984-01-24T04:20:00.1234567-08:00' ) -- 1984-01-24 04:20:00.00 -08:00
79
+ INSERT INTO [datatypes] ([id], [datetimeoffset_2]) VALUES ( 82, '1984-01-24T04:20:00.0000000Z' ) -- 1984-01-24 04:20:00.00 +00:00
80
+ INSERT INTO [datatypes] ([id], [datetimeoffset_2]) VALUES ( 83, '9999-12-31T23:59:59.9999999Z' ) -- 9999-12-31 23:59:59.99 +00:00
81
+ INSERT INTO [datatypes] ([id], [datetimeoffset_7]) VALUES ( 84, '1984-01-24T04:20:59.1234567-08:00' ) -- 1984-01-24 04:20:59.1234567 -08:00
82
+ INSERT INTO [datatypes] ([id], [datetimeoffset_7]) VALUES ( 85, '1984-01-24T04:20:00.0000000Z' ) -- 1984-01-24 04:20:00.0000000 +00:00
83
+ INSERT INTO [datatypes] ([id], [datetimeoffset_7]) VALUES ( 86, '9999-12-31T23:59:59.9999999Z' ) -- 9999-12-31 23:59:59.9999999 +00:00
84
+ INSERT INTO [datatypes] ([id], [decimal_9_2]) VALUES ( 91, 12345.01 )
85
+ INSERT INTO [datatypes] ([id], [decimal_9_2]) VALUES ( 92, 1234567.89 )
86
+ INSERT INTO [datatypes] ([id], [decimal_16_4]) VALUES ( 93, 0.0 )
87
+ INSERT INTO [datatypes] ([id], [decimal_16_4]) VALUES ( 94, 123456789012.3456 )
88
+ INSERT INTO [datatypes] ([id], [float]) VALUES ( 101, 123.00000001 )
89
+ INSERT INTO [datatypes] ([id], [float]) VALUES ( 102, 0.0 )
90
+ INSERT INTO [datatypes] ([id], [float]) VALUES ( 103, 123.45 )
91
+ INSERT INTO [datatypes] ([id], [geography]) VALUES ( 111, geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326) ) -- 0xE610000001148716D9CEF7D34740D7A3703D0A975EC08716D9CEF7D34740CBA145B6F3955EC0
92
+ INSERT INTO [datatypes] ([id], [geometry]) VALUES ( 121, geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0) ) -- 0x0000000001040300000000000000000059400000000000005940000000000000344000000000008066400000000000806640000000000080664001000000010000000001000000FFFFFFFF0000000002
93
+ INSERT INTO [datatypes] ([id], [hierarchyid]) VALUES ( 131, CAST('/1/' AS hierarchyid) ) -- 0x58
94
+ INSERT INTO [datatypes] ([id], [hierarchyid]) VALUES ( 132, CAST('/2/' AS hierarchyid) ) -- 0x68
95
+ INSERT INTO [datatypes] ([id], [image]) VALUES ( 141, 0x47494638396101000100910000fffffffffffffe010200000021f904041400ff002c00000000010001000002024401003b )
96
+ INSERT INTO [datatypes] ([id], [int]) VALUES ( 151, -2147483647 )
97
+ INSERT INTO [datatypes] ([id], [int]) VALUES ( 152, 2147483646 )
98
+ INSERT INTO [datatypes] ([id], [money]) VALUES ( 161, 4.20 )
99
+ INSERT INTO [datatypes] ([id], [money]) VALUES ( 162, -922337203685477.5807 )
100
+ INSERT INTO [datatypes] ([id], [money]) VALUES ( 163, 922337203685477.5806 )
101
+ INSERT INTO [datatypes] ([id], [nchar_10]) VALUES ( 171, N'1234567890' )
102
+ INSERT INTO [datatypes] ([id], [nchar_10]) VALUES ( 172, N'123456åå' )
103
+ INSERT INTO [datatypes] ([id], [nchar_10]) VALUES ( 173, N'abc123' )
104
+ INSERT INTO [datatypes] ([id], [ntext]) VALUES ( 181, N'test ntext' )
105
+ INSERT INTO [datatypes] ([id], [ntext]) VALUES ( 182, N'test ntext åå' )
106
+ INSERT INTO [datatypes] ([id], [numeric_18_0]) VALUES ( 191, 191 )
107
+ INSERT INTO [datatypes] ([id], [numeric_18_0]) VALUES ( 192, 123456789012345678 )
108
+ INSERT INTO [datatypes] ([id], [numeric_36_2]) VALUES ( 193, 12345678901234567890.01 )
109
+ INSERT INTO [datatypes] ([id], [numeric_36_2]) VALUES ( 194, 123.46 )
110
+ INSERT INTO [datatypes] ([id], [nvarchar_50]) VALUES ( 201, N'test nvarchar_50' )
111
+ INSERT INTO [datatypes] ([id], [nvarchar_50]) VALUES ( 202, N'test nvarchar_50 åå' )
112
+ INSERT INTO [datatypes] ([id], [nvarchar_max]) VALUES ( 211, N'test nvarchar_max' )
113
+ INSERT INTO [datatypes] ([id], [nvarchar_max]) VALUES ( 212, N'test nvarchar_max åå' )
114
+ INSERT INTO [datatypes] ([id], [real]) VALUES ( 221, 123.45 )
115
+ INSERT INTO [datatypes] ([id], [real]) VALUES ( 222, 0.0 )
116
+ INSERT INTO [datatypes] ([id], [real]) VALUES ( 223, 0.00001 )
117
+ INSERT INTO [datatypes] ([id], [smalldatetime]) VALUES ( 231, '1901-01-01T15:45:00.000Z' ) -- 1901-01-01 15:45:00
118
+ INSERT INTO [datatypes] ([id], [smalldatetime]) VALUES ( 232, '2078-06-05T04:20:00.000Z' ) -- 2078-06-05 04:20:00
119
+ INSERT INTO [datatypes] ([id], [smallint]) VALUES ( 241, -32767 )
120
+ INSERT INTO [datatypes] ([id], [smallint]) VALUES ( 242, 32766 )
121
+ INSERT INTO [datatypes] ([id], [smallmoney]) VALUES ( 251, 4.20 )
122
+ INSERT INTO [datatypes] ([id], [smallmoney]) VALUES ( 252, -214748.3647 )
123
+ INSERT INTO [datatypes] ([id], [smallmoney]) VALUES ( 253, 214748.3646 )
124
+ INSERT INTO [datatypes] ([id], [text]) VALUES ( 271, 'test text' )
125
+ INSERT INTO [datatypes] ([id], [time_2]) VALUES ( 281, '15:45:00.709714966' ) -- 15:45:00.71
126
+ INSERT INTO [datatypes] ([id], [time_2]) VALUES ( 282, '04:20:00.288321545' ) -- 04:20:00.29
127
+ INSERT INTO [datatypes] ([id], [time_7]) VALUES ( 283, '15:45:00.709714966' ) -- 15:45:00.709714900
128
+ INSERT INTO [datatypes] ([id], [time_7]) VALUES ( 284, '04:20:00.288321545' ) -- 04:20:00.288321500
129
+ INSERT INTO [datatypes] ([id], [tinyint]) VALUES ( 301, 0 )
130
+ INSERT INTO [datatypes] ([id], [tinyint]) VALUES ( 302, 255 )
131
+ INSERT INTO [datatypes] ([id], [uniqueidentifier]) VALUES ( 311, NEWID() )
132
+ INSERT INTO [datatypes] ([id], [varbinary_50]) VALUES ( 321, 0x47494638396101000100910000fffffffffffffe010200000021f904041400ff002c00000000010001000002024401003b )
133
+ INSERT INTO [datatypes] ([id], [varbinary_max]) VALUES ( 331, 0x47494638396101000100910000fffffffffffffe010200000021f904041400ff002c00000000010001000002024401003b )
134
+ INSERT INTO [datatypes] ([id], [varchar_50]) VALUES ( 341, 'test varchar_50' )
135
+ INSERT INTO [datatypes] ([id], [varchar_max]) VALUES ( 351, 'test varchar_max' )
136
+ INSERT INTO [datatypes] ([id], [xml]) VALUES ( 361, '<foo><bar>batz</bar></foo>' )
137
+
138
+ SET IDENTITY_INSERT [datatypes] OFF
139
+
140
+
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "tiny_tds/version"
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'tiny_tds/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'tiny_tds'
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.description = 'TinyTDS - A modern, simple and fast FreeTDS library for Ruby using DB-Library. Developed for the ActiveRecord SQL Server adapter.'
14
14
  s.files = `git ls-files`.split("\n") + Dir.glob('exe/*')
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
17
17
  s.require_paths = ['lib']
18
18
  s.rdoc_options = ['--charset=UTF-8']
19
19
  s.extensions = ['ext/tiny_tds/extconf.rb']
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_tds
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: x86-mingw32
6
6
  authors:
7
7
  - Ken Collins
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-05-15 00:00:00.000000000 Z
13
+ date: 2016-10-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: mini_portile2
@@ -107,7 +107,9 @@ executables:
107
107
  extensions: []
108
108
  extra_rdoc_files: []
109
109
  files:
110
+ - ".codeclimate.yml"
110
111
  - ".gitignore"
112
+ - ".rubocop.yml"
111
113
  - CHANGELOG
112
114
  - CODE_OF_CONDUCT.md
113
115
  - Gemfile
@@ -144,7 +146,7 @@ files:
144
146
  - ports/i686-w64-mingw32/bin/libiconv-2.dll
145
147
  - ports/i686-w64-mingw32/bin/libsybdb-5.dll
146
148
  - ports/i686-w64-mingw32/bin/ssleay32-1.0.2g-i686-w64-mingw32.dll
147
- - ports/patches/freetds/1.00/0001-mingw_missing_inet_pton.diff
149
+ - ports/patches/freetds/1.00.15/0001-mingw_missing_inet_pton.diff
148
150
  - test/appveyor/dbsetup.ps1
149
151
  - test/appveyor/dbsetup.sql
150
152
  - test/benchmark/query.rb
@@ -157,6 +159,7 @@ files:
157
159
  - test/schema/sqlserver_2005.sql
158
160
  - test/schema/sqlserver_2008.sql
159
161
  - test/schema/sqlserver_2014.sql
162
+ - test/schema/sqlserver_2016.sql
160
163
  - test/schema/sqlserver_azure.sql
161
164
  - test/schema/sybase_ase.sql
162
165
  - test/schema_test.rb