do_mysql 0.9.11 → 0.9.12

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.
Files changed (44) hide show
  1. data/LICENSE +1 -1
  2. data/Manifest.txt +15 -4
  3. data/Rakefile +7 -122
  4. data/ext/do_mysql_ext/do_mysql_ext.c +154 -99
  5. data/ext/do_mysql_ext/extconf.rb +1 -0
  6. data/lib/do_mysql.rb +5 -2
  7. data/lib/do_mysql/version.rb +1 -1
  8. data/spec/command_spec.rb +9 -0
  9. data/spec/connection_spec.rb +19 -0
  10. data/spec/encoding_spec.rb +8 -0
  11. data/spec/lib/rspec_immediate_feedback_formatter.rb +3 -0
  12. data/spec/reader_spec.rb +8 -0
  13. data/spec/result_spec.rb +9 -0
  14. data/spec/spec_helper.rb +38 -47
  15. data/spec/typecast/array_spec.rb +8 -0
  16. data/spec/typecast/bigdecimal_spec.rb +9 -0
  17. data/spec/typecast/boolean_spec.rb +9 -0
  18. data/spec/typecast/byte_array_spec.rb +8 -0
  19. data/spec/typecast/class_spec.rb +8 -0
  20. data/spec/typecast/date_spec.rb +9 -0
  21. data/spec/typecast/datetime_spec.rb +9 -0
  22. data/spec/typecast/float_spec.rb +9 -0
  23. data/spec/typecast/integer_spec.rb +8 -0
  24. data/spec/typecast/nil_spec.rb +10 -0
  25. data/spec/typecast/range_spec.rb +8 -0
  26. data/spec/typecast/string_spec.rb +8 -0
  27. data/spec/typecast/time_spec.rb +8 -0
  28. data/tasks/gem.rake +60 -0
  29. data/tasks/install.rake +15 -0
  30. data/tasks/native.rake +31 -0
  31. data/tasks/release.rake +75 -0
  32. data/tasks/retrieve.rake +67 -0
  33. data/tasks/spec.rake +18 -0
  34. metadata +72 -40
  35. data/.gitignore +0 -0
  36. data/buildfile +0 -27
  37. data/ext-java/src/main/java/DoMysqlExtService.java +0 -23
  38. data/ext-java/src/main/java/do_mysql/MySqlDriverDefinition.java +0 -22
  39. data/ext/.gitignore +0 -2
  40. data/spec/integration/do_mysql_spec.rb +0 -341
  41. data/spec/integration/logging_spec.rb +0 -52
  42. data/spec/integration/quoting_spec.rb +0 -45
  43. data/spec/spec.opts +0 -2
  44. data/spec/unit/transaction_spec.rb +0 -35
@@ -0,0 +1,31 @@
1
+ begin
2
+ gem('rake-compiler')
3
+ require 'rake/extensiontask'
4
+
5
+ Rake::ExtensionTask.new('do_mysql_ext', GEM_SPEC) do |ext|
6
+
7
+ mysql_lib = File.expand_path(File.join(File.dirname(__FILE__), '..', 'vendor', "mysql-#{BINARY_VERSION}-win32"))
8
+
9
+ # automatically add build options to avoid need of manual input
10
+ if RUBY_PLATFORM =~ /mswin|mingw/ then
11
+ ext.config_options << "--with-mysql-include=#{mysql_lib}/include"
12
+ ext.config_options << "--with-mysql-lib=#{mysql_lib}/lib/opt"
13
+ else
14
+ ext.cross_compile = true
15
+ ext.cross_platform = ['x86-mingw32', 'x86-mswin32-60']
16
+ ext.cross_config_options << "--with-mysql-include=#{mysql_lib}/include"
17
+ ext.cross_config_options << "--with-mysql-lib=#{mysql_lib}/lib/opt"
18
+ end
19
+
20
+ end
21
+ rescue LoadError
22
+ warn "To cross-compile, install rake-compiler (gem install rake-compiler)"
23
+
24
+ if (tasks_dir = ROOT.parent + 'tasks').directory?
25
+ require tasks_dir + 'ext_helper'
26
+ require tasks_dir + 'ext_helper_java'
27
+
28
+ setup_c_extension("#{GEM_SPEC.name}_ext", GEM_SPEC)
29
+ setup_java_extension("#{GEM_SPEC.name}_ext", GEM_SPEC)
30
+ end
31
+ end
@@ -0,0 +1,75 @@
1
+ begin
2
+ gem 'rubyforge', '~> 1.0.1'
3
+ require 'rubyforge'
4
+ rescue Exception
5
+ nil
6
+ end
7
+
8
+ if defined?(RubyForge) then
9
+ if defined?(GEM_SPEC) then
10
+ desc 'Package and upload to RubyForge'
11
+ task :release => [:package] do |t|
12
+ ver = ENV['VERSION'] or fail "Must supply VERSION (rake release VERSION=x.y.z)."
13
+
14
+ # compare versions to avoid mistakes
15
+ unless ver == GEM_SPEC.version.to_s then
16
+ fail "Version mismatch (supplied and specification versions differ)."
17
+ end
18
+
19
+ # no rubyforge project? no release for you!
20
+ if GEM_SPEC.rubyforge_project == 'TODO' or GEM_SPEC.rubyforge_project.nil? then
21
+ fail "Must define rubyforge_project in your gem specification."
22
+ end
23
+
24
+ # instantiate a RubyForge object
25
+ rf = RubyForge.new
26
+
27
+ # read project info and overview
28
+ notes = begin
29
+ r = File.read("README.rdoc")
30
+ r.split(/^(=+ .*)/)[1..4].join.strip
31
+ rescue
32
+ warn "Missing README.rdoc"
33
+ ''
34
+ end
35
+
36
+ # read changes
37
+ changes = begin
38
+ h = File.read("History.txt")
39
+ h.split(/^(==+ .*)/)[1..2].join.strip
40
+ rescue
41
+ warn "Missing History.txt"
42
+ ''
43
+ end
44
+
45
+ # build the configuration for the release
46
+ config = Hash.new
47
+ config["release_notes"] = notes
48
+ config["release_changes"] = changes
49
+ config["preformatted"] = true
50
+
51
+ # prepare configuration
52
+ rf.configure config
53
+
54
+ files = FileList["pkg/#{GEM_SPEC.name}-#{GEM_SPEC.version}*.*"].to_a
55
+ fail "No files found for the release." if files.empty?
56
+
57
+ puts "Logging in RubyForge..."
58
+ rf.login
59
+
60
+ puts "Files to upload:"
61
+ files.each do |f|
62
+ puts " * #{f}"
63
+ end
64
+
65
+ puts "Releasing #{GEM_SPEC.name} version #{GEM_SPEC.version}..."
66
+ rf.add_release GEM_SPEC.rubyforge_project, GEM_SPEC.name, GEM_SPEC.version, *files
67
+ puts "Done."
68
+ end
69
+ #Rake::Task['release'].prerequisites.unshift('clean', 'cross', 'native')
70
+ else
71
+ warn "no GEM_SPEC is found or defined. 'release' task cannot work without it."
72
+ end
73
+ else
74
+ warn "rubyforge gem is required to generate releases, please install it (gem install rubyforge)."
75
+ end
@@ -0,0 +1,67 @@
1
+ begin
2
+ gem('rake-compiler')
3
+ require 'rake/clean'
4
+ require 'rake/extensioncompiler'
5
+
6
+ # download mysql library and headers
7
+ directory "vendor"
8
+
9
+ # only on Windows or cross platform compilation
10
+ def dlltool(dllname, deffile, libfile)
11
+ # define if we are using GCC or not
12
+ if Rake::ExtensionCompiler.mingw_gcc_executable then
13
+ dir = File.dirname(Rake::ExtensionCompiler.mingw_gcc_executable)
14
+ tool = case RUBY_PLATFORM
15
+ when /mingw/
16
+ File.join(dir, 'dlltool.exe')
17
+ when /linux|darwin/
18
+ File.join(dir, "#{Rake::ExtensionCompiler.mingw_host}-dlltool")
19
+ end
20
+ return "#{tool} --dllname #{dllname} --def #{deffile} --output-lib #{libfile}"
21
+ else
22
+ if RUBY_PLATFORM =~ /mswin/ then
23
+ tool = 'lib.exe'
24
+ else
25
+ fail "Unsupported platform for cross-compilation (please, contribute some patches)."
26
+ end
27
+ return "#{tool} /DEF:#{deffile} /OUT:#{libfile}"
28
+ end
29
+ end
30
+
31
+ file "vendor/mysql-noinstall-#{BINARY_VERSION}-win32.zip" => ['vendor'] do |t|
32
+ base_version = BINARY_VERSION.gsub(/\.[0-9]+$/, '')
33
+ url = "http://mysql.proserve.nl/Downloads/MySQL-#{base_version}/#{File.basename(t.name)}"
34
+ when_writing "downloading #{t.name}" do
35
+ cd File.dirname(t.name) do
36
+ sh "wget -c #{url} || curl -C - -O #{url}"
37
+ end
38
+ end
39
+ end
40
+
41
+ file "vendor/mysql-#{BINARY_VERSION}-win32/include/mysql.h" => ["vendor/mysql-noinstall-#{BINARY_VERSION}-win32.zip"] do |t|
42
+ full_file = File.expand_path(t.prerequisites.last)
43
+ when_writing "creating #{t.name}" do
44
+ cd "vendor" do
45
+ sh "unzip #{full_file} mysql-#{BINARY_VERSION}-win32/bin/** mysql-#{BINARY_VERSION}-win32/include/** mysql-#{BINARY_VERSION}-win32/lib/**"
46
+ end
47
+ # update file timestamp to avoid Rake perform this extraction again.
48
+ touch t.name
49
+ end
50
+ end
51
+
52
+ # clobber vendored packages
53
+ CLOBBER.include('vendor')
54
+
55
+ # vendor:mysql
56
+ task 'vendor:mysql' => ["vendor/mysql-#{BINARY_VERSION}-win32/include/mysql.h"]
57
+
58
+ # hook into cross compilation vendored mysql dependency
59
+ if RUBY_PLATFORM =~ /mingw|mswin/ then
60
+ Rake::Task['compile'].prerequisites.unshift 'vendor:mysql'
61
+ else
62
+ if Rake::Task.tasks.map {|t| t.name }.include? 'cross'
63
+ Rake::Task['cross'].prerequisites.unshift 'vendor:mysql'
64
+ end
65
+ end
66
+ rescue LoadError
67
+ end
@@ -0,0 +1,18 @@
1
+ # Specs
2
+ require 'spec/rake/spectask'
3
+
4
+ desc 'Run specifications'
5
+ Spec::Rake::SpecTask.new(:spec => [ :clean, :compile ]) do |t|
6
+ t.spec_opts << '--options' << ROOT + 'spec/spec.opts'
7
+ t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb').map { |f| f.to_s }
8
+
9
+ begin
10
+ # RCov is run by default, except on the JRuby platform
11
+ t.rcov = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)
12
+ t.rcov_opts << '--exclude' << 'spec'
13
+ t.rcov_opts << '--text-summary'
14
+ t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
15
+ rescue Exception
16
+ # rcov not installed
17
+ end
18
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: do_mysql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.11
4
+ version: 0.9.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dirkjan Bussink
@@ -9,9 +9,29 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-01-19 00:00:00 +01:00
12
+ date: 2009-05-17 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: addressable
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 2.0.0
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: extlib
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.12
34
+ version:
15
35
  - !ruby/object:Gem::Dependency
16
36
  name: data_objects
17
37
  type: :runtime
@@ -20,60 +40,72 @@ dependencies:
20
40
  requirements:
21
41
  - - "="
22
42
  - !ruby/object:Gem::Version
23
- version: 0.9.11
43
+ version: 0.9.12
24
44
  version:
25
45
  - !ruby/object:Gem::Dependency
26
- name: hoe
46
+ name: rspec
27
47
  type: :development
28
48
  version_requirement:
29
49
  version_requirements: !ruby/object:Gem::Requirement
30
50
  requirements:
31
- - - ">="
51
+ - - ~>
32
52
  - !ruby/object:Gem::Version
33
- version: 1.8.2
53
+ version: 1.2.0
34
54
  version:
35
- description: A DataObject.rb driver for MySQL
36
- email:
37
- - d.bussink@gmail.com
55
+ description: Implements the DataObjects API for MySQL
56
+ email: d.bussink@gmail.com
38
57
  executables: []
39
58
 
40
59
  extensions:
41
60
  - ext/do_mysql_ext/extconf.rb
42
- extra_rdoc_files:
43
- - History.txt
44
- - Manifest.txt
45
- - README.txt
61
+ extra_rdoc_files: []
62
+
46
63
  files:
47
- - .gitignore
48
- - History.txt
49
- - LICENSE
50
- - Manifest.txt
51
- - README.txt
52
- - Rakefile
53
- - buildfile
54
- - ext-java/src/main/java/DoMysqlExtService.java
55
- - ext-java/src/main/java/do_mysql/MySqlDriverDefinition.java
56
- - ext/.gitignore
57
- - ext/do_mysql_ext/do_mysql_ext.c
58
- - ext/do_mysql_ext/extconf.rb
59
- - lib/do_mysql.rb
60
64
  - lib/do_mysql/transaction.rb
61
65
  - lib/do_mysql/version.rb
62
- - spec/integration/do_mysql_spec.rb
63
- - spec/integration/logging_spec.rb
64
- - spec/integration/quoting_spec.rb
65
- - spec/spec.opts
66
+ - lib/do_mysql.rb
67
+ - spec/command_spec.rb
68
+ - spec/connection_spec.rb
69
+ - spec/encoding_spec.rb
70
+ - spec/lib/rspec_immediate_feedback_formatter.rb
71
+ - spec/reader_spec.rb
72
+ - spec/result_spec.rb
66
73
  - spec/spec_helper.rb
67
- - spec/unit/transaction_spec.rb
68
- has_rdoc: false
69
- homepage: http://rubyforge.org/projects/dorb
70
- post_install_message:
71
- rdoc_options:
72
- - --main
74
+ - spec/typecast/array_spec.rb
75
+ - spec/typecast/bigdecimal_spec.rb
76
+ - spec/typecast/boolean_spec.rb
77
+ - spec/typecast/byte_array_spec.rb
78
+ - spec/typecast/class_spec.rb
79
+ - spec/typecast/date_spec.rb
80
+ - spec/typecast/datetime_spec.rb
81
+ - spec/typecast/float_spec.rb
82
+ - spec/typecast/integer_spec.rb
83
+ - spec/typecast/nil_spec.rb
84
+ - spec/typecast/range_spec.rb
85
+ - spec/typecast/string_spec.rb
86
+ - spec/typecast/time_spec.rb
87
+ - tasks/gem.rake
88
+ - tasks/install.rake
89
+ - tasks/native.rake
90
+ - tasks/release.rake
91
+ - tasks/retrieve.rake
92
+ - tasks/spec.rake
93
+ - ext/do_mysql_ext/extconf.rb
94
+ - ext/do_mysql_ext/do_mysql_ext.c
95
+ - LICENSE
96
+ - Rakefile
97
+ - History.txt
98
+ - Manifest.txt
73
99
  - README.txt
100
+ has_rdoc: true
101
+ homepage: http://github.com/datamapper/do
102
+ licenses: []
103
+
104
+ post_install_message:
105
+ rdoc_options: []
106
+
74
107
  require_paths:
75
108
  - lib
76
- - ext
77
109
  required_ruby_version: !ruby/object:Gem::Requirement
78
110
  requirements:
79
111
  - - ">="
@@ -89,9 +121,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
121
  requirements: []
90
122
 
91
123
  rubyforge_project: dorb
92
- rubygems_version: 1.3.1
124
+ rubygems_version: 1.3.3
93
125
  signing_key:
94
- specification_version: 2
95
- summary: A DataObject.rb driver for MySQL
126
+ specification_version: 3
127
+ summary: DataObjects MySQL Driver
96
128
  test_files: []
97
129
 
data/.gitignore DELETED
File without changes
data/buildfile DELETED
@@ -1,27 +0,0 @@
1
- # Apache Buildr buildfile for do_mysql
2
- # see http://incubator.apache.org/buildr/ for more information on Apache Buildr
3
- require 'buildr'
4
- require 'pathname'
5
-
6
- VERSION_NUMBER = '1.0'
7
- JDBC_SUPPORT = ['data_objects:jdbc:jar:1.0']
8
- TARGET_DIR = 'pkg/classes'
9
- repositories.remote << 'http://www.ibiblio.org/maven2/'
10
-
11
- define 'do_mysql' do
12
- project.version = VERSION_NUMBER
13
- project.group = 'data_objects.rb'
14
-
15
- manifest['Copyright'] = 'Alex Coles (C) 2008-2009'
16
-
17
- compile.using :target => '1.5', :lint => 'all', :deprecation => 'true'
18
-
19
- define 'ext-java' do
20
- package(:jar).clean.include(TARGET_DIR)
21
-
22
- jdbc_support_jar = file('../../do_jdbc/lib/do_jdbc_internal.jar')
23
- jdbc_support = artifact('data_objects:jdbc:jar:1.0').from(jdbc_support_jar)
24
-
25
- compile.into(TARGET_DIR).with(JDBC_SUPPORT)
26
- end
27
- end
@@ -1,23 +0,0 @@
1
- import data_objects.drivers.DriverDefinition;
2
- import do_mysql.MySqlDriverDefinition;
3
-
4
- public class DoMysqlExtService extends AbstractDataObjectsExtService {
5
-
6
- private final static DriverDefinition driver = new MySqlDriverDefinition();
7
- public final static String RUBY_MODULE_NAME = "Mysql";
8
- public final static String RUBY_ERROR_NAME = "MysqlError";
9
-
10
- public String getModuleName() {
11
- return RUBY_MODULE_NAME;
12
- }
13
-
14
- @Override
15
- public String getErrorName() {
16
- return RUBY_ERROR_NAME;
17
- }
18
-
19
- public DriverDefinition getDriverDefinition() {
20
- return driver;
21
- }
22
-
23
- }
@@ -1,22 +0,0 @@
1
- package do_mysql;
2
-
3
- import data_objects.drivers.AbstractDriverDefinition;
4
-
5
- public class MySqlDriverDefinition extends AbstractDriverDefinition {
6
-
7
- public boolean supportsJdbcGeneratedKeys()
8
- {
9
- return true;
10
- }
11
-
12
- //@Override
13
- public String quoteString(String str) {
14
- StringBuffer quotedValue = new StringBuffer(str.length() + 2);
15
- quotedValue.append("\'");
16
- quotedValue.append(str.replaceAll("'", "\\\\'"));
17
- // TODO: handle backslashes
18
- quotedValue.append("\'");
19
- return quotedValue.toString();
20
- }
21
-
22
- }
@@ -1,2 +0,0 @@
1
- Makefile
2
- mkmf.log
@@ -1,341 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'pathname'
4
- require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
5
-
6
- describe DataObjects::Mysql do
7
- include MysqlSpecHelpers
8
-
9
- before :each do
10
- setup_test_environment
11
- end
12
-
13
- after :each do
14
- teardown_test_environment
15
- end
16
-
17
- it "should expose the proper DataObjects classes" do
18
- DataObjects::Mysql.const_get('Connection').should_not be_nil
19
- DataObjects::Mysql.const_get('Command').should_not be_nil
20
- DataObjects::Mysql.const_get('Result').should_not be_nil
21
- DataObjects::Mysql.const_get('Reader').should_not be_nil
22
- end
23
-
24
- it "should connect successfully via TCP" do
25
- connection = DataObjects::Connection.new("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.host}:#{MYSQL.port}/#{MYSQL.database}")
26
- connection.should_not be_using_socket
27
- connection.close
28
- end
29
-
30
- it "should be able to send queries asynchronously in parallel" do
31
- threads = []
32
-
33
- start = Time.now
34
- 4.times do |i|
35
- threads << Thread.new do
36
- connection = DataObjects::Connection.new("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.host}:#{MYSQL.port}/#{MYSQL.database}")
37
- command = connection.create_command("SELECT sleep(1)")
38
- result = command.execute_non_query
39
- end
40
- end
41
-
42
- threads.each{|t| t.join }
43
- finish = Time.now
44
- (finish - start).should < 2
45
- end
46
-
47
- #
48
- # I comment this out partly to raise the issue for discussion. Socket files are afaik not supported under windows. Does this
49
- # mean that we should test for it on unix boxes but not on windows boxes? Or does it mean that it should not be speced at all?
50
- # It's not really a requirement, since all architectures that support MySQL also supports TCP connectsion, ne?
51
- #
52
- # it "should connect successfully via the socket file" do
53
- # @connection = DataObjects::Mysql::Connection.new("mysql://#{MYSQL.user}@#{MYSQL.hostname}:#{MYSQL.port}/#{MYSQL.database}/?socket=#{SOCKET_PATH}")
54
- # @connection.should be_using_socket
55
- # end
56
-
57
- it "should return the current character set" do
58
- connection = DataObjects::Connection.new("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.hostname}:#{MYSQL.port}/#{MYSQL.database}")
59
- connection.character_set.should == "utf8"
60
- connection.close
61
- end
62
-
63
- it "should support changing the character set" do
64
- pending "JDBC API does not provide an easy way to get the current character set" if JRUBY
65
- # current character set can be retrieved with the following query:
66
- # "SHOW VARIABLES LIKE character_set_database"
67
-
68
- connection = DataObjects::Connection.new("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.hostname}:#{MYSQL.port}/#{MYSQL.database}?charset=latin1")
69
- # N.B. query parameter after forward slash causes problems with JDBC
70
- connection.character_set.should == "latin1"
71
- connection.close
72
-
73
- connection = DataObjects::Connection.new("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.hostname}:#{MYSQL.port}/#{MYSQL.database}?charset=utf8")
74
- connection.character_set.should == "utf8"
75
- connection.close
76
- end
77
-
78
- it "should raise an error when opened with an invalid server uri" do
79
- def connecting_with(uri)
80
- lambda { DataObjects::Connection.new(uri) }
81
- end
82
-
83
- unless JRUBY ## FIXME in JRuby
84
- # Missing database name
85
- connecting_with("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.hostname}:#{MYSQL.port}/").should raise_error(MysqlError)
86
- end
87
-
88
- # Wrong port
89
- connecting_with("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.hostname}:666/").should raise_error(MysqlError)
90
-
91
- unless JRUBY ## FIXME in JRuby
92
- # Bad Username
93
- connecting_with("mysql://baduser@#{MYSQL.hostname}:#{MYSQL.port}/").should raise_error(MysqlError)
94
- end
95
-
96
- # Bad Password
97
- connecting_with("mysql://#{MYSQL.user}:wrongpassword@#{MYSQL.hostname}:#{MYSQL.port}/").should raise_error(MysqlError)
98
-
99
- # Bad Database Name
100
- connecting_with("mysql://#{MYSQL.user}:#{MYSQL.pass}@#{MYSQL.hostname}:#{MYSQL.port}/bad_database").should raise_error(MysqlError)
101
-
102
- #
103
- # Again, should socket even be speced if we don't support it across all platforms?
104
- #
105
- # Invalid Socket Path
106
- #connecting_with("mysql://#{MYSQL.user}@#{MYSQL.hostname}:#{MYSQL.port}/MYSQL.database/?socket=/invalid/path/mysql.sock").should raise_error(MysqlError)
107
- end
108
- end
109
-
110
- describe DataObjects::Mysql::Connection do
111
- include MysqlSpecHelpers
112
-
113
- before :each do
114
- setup_test_environment
115
- end
116
-
117
- after :each do
118
- teardown_test_environment
119
- end
120
-
121
- it "should raise an error when attempting to execute a bad query" do
122
- lambda { @connection.create_command("INSERT INTO non_existant_table (tester) VALUES (1)").execute_non_query }.should raise_error(MysqlError)
123
- end
124
-
125
- it "should raise an error when executing a bad reader" do
126
- lambda { @connection.create_command("SELECT * FROM non_existant_table").execute_reader }.should raise_error(MysqlError)
127
- end
128
-
129
- it "should not raise a connection closed error after an incorrect query" do
130
- lambda { @connection.create_command("INSERT INTO non_existant_table (tester) VALUES (1)").execute_non_query }.should raise_error(MysqlError)
131
- lambda { @connection.create_command("INSERT INTO non_existant_table (tester) VALUES (1)").execute_non_query }.should_not raise_error(MysqlError, "This connection has already been closed.")
132
- end
133
-
134
- it "should not raise a connection closed error after an incorrect reader" do
135
- lambda { @connection.create_command("SELECT * FROM non_existant_table").execute_reader }.should raise_error(MysqlError)
136
- lambda { @connection.create_command("SELECT * FROM non_existant_table").execute_reader }.should_not raise_error(MysqlError, "This connection has already been closed.")
137
- end
138
-
139
- end
140
-
141
- describe DataObjects::Mysql::Reader do
142
- include MysqlSpecHelpers
143
-
144
- before :each do
145
- setup_test_environment
146
- end
147
-
148
- after :each do
149
- teardown_test_environment
150
- end
151
-
152
- it "should raise an error when you pass too many or too few types for the expected result set" do
153
- lambda { select("SELECT name, fired_at FROM users", [String, DateTime, Integer]) }.should raise_error(MysqlError)
154
- end
155
-
156
- it "shouldn't raise an error when you pass NO types for the expected result set" do
157
- lambda { select("SELECT name, fired_at FROM users", nil) }.should_not raise_error(MysqlError)
158
- end
159
-
160
- it "should return the proper number of fields" do
161
- id = insert("INSERT INTO users (name) VALUES ('Billy Bob')")
162
-
163
- select("SELECT id, name, fired_at FROM users WHERE id = ?", nil, id) do |reader|
164
- reader.fields.size.should == 3
165
- end
166
- end
167
-
168
- it "should return proper number of rows and fields using row_count and field_count" do
169
- pending "Neither do_jdbc nor C-extension return row_count correctly at the moment"
170
- command = @connection.create_command("SELECT * FROM widgets WHERE id = (SELECT max(id) FROM widgets)")
171
- reader = command.execute_reader
172
- reader.field_count.should == 21
173
- reader.row_count.should == 1
174
- reader.close
175
- end
176
-
177
- it "should raise an exception if .values is called after reading all available rows" do
178
-
179
- select("SELECT * FROM widgets LIMIT 2") do |reader|
180
- # select already calls next once for us
181
- reader.next!
182
- reader.next!
183
-
184
- lambda { reader.values }.should raise_error(MysqlError)
185
- end
186
- end
187
-
188
- it "should fetch the proper number of rows" do
189
- ids = [
190
- insert("INSERT INTO users (name) VALUES ('Slappy Wilson')"),
191
- insert("INSERT INTO users (name) VALUES ('Jumpy Jones')")
192
- ]
193
- # do_jdbc rewrites "?" as "(?,?)"
194
- # to correspond to the JDBC API
195
-
196
- select("SELECT * FROM users WHERE id IN ?", nil, ids) do |reader|
197
- # select already calls next once for us
198
- reader.next!.should == true
199
- reader.next!.should be_nil
200
- end
201
- end
202
-
203
- it "should contain tainted strings" do
204
- id = insert("INSERT INTO users (name) VALUES ('Cuppy Canes')")
205
-
206
- select("SELECT name FROM users WHERE id = ?", nil, id) do |reader|
207
- reader.values.first.should be_tainted
208
- end
209
-
210
- end
211
-
212
- it "should return DB nulls as nil" do
213
- id = insert("INSERT INTO users (name) VALUES (NULL)")
214
- select("SELECT name from users WHERE name is null") do |reader|
215
- reader.values[0].should == nil
216
- end
217
- end
218
-
219
- it "should not convert empty strings to null" do
220
- id = insert("INSERT INTO users (name) VALUES ('')")
221
- select("SELECT name FROM users WHERE id = ?", [String], id) do |reader|
222
- reader.values.first.should == ''
223
- end
224
- end
225
-
226
- it "should correctly work with default utf8 character set" do
227
- name = "Билли Боб"
228
- id = insert("INSERT INTO users (name) VALUES ('#{name}')")
229
-
230
- select("SELECT name from users WHERE id = ?", [String], id) do |reader|
231
- reader.values[0].should == name
232
- end
233
- end
234
-
235
- describe "Date, Time, and DateTime" do
236
-
237
- it "should return nil when the time is 0" do
238
- pending "We need to introduce something like Proxy for typeasting where each SQL type will have _rules_ of casting" if JRUBY
239
- # skip the test if the strict dates/times setting is turned on
240
- strict_time = select("SHOW VARIABLES LIKE 'sql_mode'") do |reader|
241
- reader.values.last.split(',').any? do |mode|
242
- %w[ NO_ZERO_IN_DATE NO_ZERO_DATE ].include?(mode.strip.upcase)
243
- end
244
- end
245
-
246
- unless strict_time
247
- id = insert("INSERT INTO users (name, fired_at) VALUES ('James', 0);")
248
- select("SELECT fired_at FROM users WHERE id = ?", [Time], id) do |reader|
249
- reader.values.last.should be_nil
250
- end
251
- exec("DELETE FROM users WHERE id = ?", id)
252
- end
253
- end
254
-
255
- it "should return DateTimes using the current locale's Time Zone" do
256
- date = DateTime.now
257
- id = insert("INSERT INTO users (name, fired_at) VALUES (?, ?)", 'Sam', date)
258
-
259
- select("SELECT fired_at FROM users WHERE id = ?", [DateTime], id) do |reader|
260
- reader.values.last.to_s.should == date.to_s
261
- end
262
-
263
- exec("DELETE FROM users WHERE id = ?", id)
264
- end
265
-
266
- now = DateTime.now
267
-
268
- dates = [
269
- now.new_offset( (-11 * 3600).to_r / 86400), # GMT -11:00
270
- now.new_offset( (-9 * 3600 + 10 * 60).to_r / 86400), # GMT -9:10, contrived
271
- now.new_offset( (-8 * 3600).to_r / 86400), # GMT -08:00
272
- now.new_offset( (+3 * 3600).to_r / 86400), # GMT +03:00
273
- now.new_offset( (+5 * 3600 + 30 * 60).to_r / 86400) # GMT +05:30 (New Delhi)
274
- ]
275
-
276
- dates.each do |date|
277
- it "should return #{date.to_s} offset to the current locale's Time Zone if they were inserted using a different timezone" do
278
- pending "We don't support non-local date input yet"
279
-
280
- dates.each do |date|
281
- id = insert("INSERT INTO users (name, fired_at) VALUES (?, ?)", 'Sam', date)
282
-
283
- select("SELECT fired_at FROM users WHERE id = ?", [DateTime], id) do |reader|
284
- reader.values.last.to_s.should == now.to_s
285
- end
286
-
287
- exec("DELETE FROM users WHERE id = ?", id)
288
- end
289
- end
290
- end
291
-
292
- end
293
-
294
- describe "executing a non-query" do
295
- it "should return a Result" do
296
- command = @connection.create_command("INSERT INTO invoices (invoice_number) VALUES ('1234')")
297
- result = command.execute_non_query
298
- result.should be_kind_of(DataObjects::Mysql::Result)
299
- end
300
-
301
- it "should be able to determine the affected_rows" do
302
- command = @connection.create_command("INSERT INTO invoices (invoice_number) VALUES ('1234')")
303
- result = command.execute_non_query
304
- result.to_i.should == 1
305
- end
306
-
307
- it "should yield the last inserted id" do
308
- @connection.create_command("TRUNCATE TABLE invoices").execute_non_query
309
-
310
- result = @connection.create_command("INSERT INTO invoices (invoice_number) VALUES ('1234')").execute_non_query
311
- result.insert_id.should == 1
312
-
313
- result = @connection.create_command("INSERT INTO invoices (invoice_number) VALUES ('3456')").execute_non_query
314
- result.insert_id.should == 2
315
- end
316
-
317
- it "should be able to determine the affected_rows" do
318
- [
319
- "TRUNCATE TABLE invoices",
320
- "INSERT INTO invoices (invoice_number) VALUES ('1234')",
321
- "INSERT INTO invoices (invoice_number) VALUES ('1234')"
322
- ].each { |q| @connection.create_command(q).execute_non_query }
323
-
324
- result = @connection.create_command("UPDATE invoices SET invoice_number = '3456'").execute_non_query
325
- result.to_i.should == 2
326
- end
327
-
328
- it "should raise an error when executing an invalid query" do
329
- command = @connection.create_command("UPDwhoopsATE invoices SET invoice_number = '3456'")
330
-
331
- lambda { command.execute_non_query }.should raise_error(Exception)
332
- end
333
-
334
- # it "should raise an error when inserting the wrong typed data" do
335
- # command = @connection.create_command("UPDATE invoices SET invoice_number = ?")
336
- # command.execute_non_query(1)
337
- # end
338
-
339
- end
340
-
341
- end