amalgalite 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,86 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
4
+ $: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
5
+ require 'amalgalite'
6
+ require 'amalgalite/database'
7
+
8
+ describe "Scalar SQL Functions" do
9
+
10
+ before(:each) do
11
+ @schema = IO.read( SpecInfo.test_schema_file )
12
+ @iso_db_file = SpecInfo.make_iso_db
13
+ @iso_db = Amalgalite::Database.new( SpecInfo.make_iso_db )
14
+ end
15
+
16
+ after(:each) do
17
+ File.unlink SpecInfo.test_db if File.exist?( SpecInfo.test_db )
18
+ @iso_db.close
19
+ File.unlink @iso_db_file if File.exist?( @iso_db_file )
20
+ end
21
+
22
+ it "can define a custom SQL function as a block with 0 params" do
23
+ @iso_db.define_function("foo") do
24
+ "foo"
25
+ end
26
+ r = @iso_db.execute("SELECT foo() AS f");
27
+ r.first['f'].should == "foo"
28
+ end
29
+
30
+ it "has a signature" do
31
+ ::Amalgalite::Function.new( "testing_name", 42 ).signature.should == "testing_name/42"
32
+ end
33
+
34
+ it "can define a custom SQL function as a lambda with 2 param" do
35
+ @iso_db.define_function("foo2", lambda{ |x,y| "foo2 -> #{x} #{y}" } )
36
+ r = @iso_db.execute("SELECT foo2( 'bar', 'baz' ) as f")
37
+ r.first['f'].should == "foo2 -> bar baz"
38
+ end
39
+
40
+ it "can define a custom SQL function as a class with N params" do
41
+ class FunctionTest1 < ::Amalgalite::Function
42
+ def initialize
43
+ super('ftest', -1)
44
+ end
45
+ def call( *args )
46
+ "#{args.length} args #{args.join(', ')}"
47
+ end
48
+ end
49
+
50
+ @iso_db.define_function("ftest1", FunctionTest1.new )
51
+ r = @iso_db.execute("SELECT ftest1(1,2,3,'baz') as f")
52
+ r.first['f'].should == "4 args 1, 2, 3, baz"
53
+ end
54
+
55
+ [ [ 1, lambda { true } ],
56
+ [ 0, lambda { false } ],
57
+ [ nil, lambda { nil } ],
58
+ [ "foo", lambda { "foo" } ],
59
+ [ 42, lambda { 42 } ],
60
+ [ 42.2 , lambda { 42.2 } ], ].each do |expected, func|
61
+ it "returns the appropriate class #{expected.class} " do
62
+ @iso_db.define_function("ctest", func )
63
+ r = @iso_db.execute( "SELECT ctest() AS c" )
64
+ r.first['c'].should == expected
65
+ end
66
+ end
67
+
68
+ it "raises an error if the function returns a complex Ruby object" do
69
+ l = lambda { Hash.new }
70
+ @iso_db.define_function("htest", l)
71
+ begin
72
+ @iso_db.execute( "SELECT htest() AS h" )
73
+ rescue => e
74
+ e.should be_instance_of( ::Amalgalite::SQLite3::Error )
75
+ e.message.should =~ /Unable to convert ruby object to an SQL function result/
76
+ end
77
+ end
78
+
79
+ it "an error raised during the sql function is handled correctly" do
80
+ @iso_db.define_function( "etest" ) do
81
+ raise "error from within an sql function"
82
+ end
83
+ lambda { @iso_db.execute( "SELECT etest() AS e" ) }.should raise_error( ::Amalgalite::SQLite3::Error, /error from within an sql function/ )
84
+ end
85
+ end
86
+
@@ -0,0 +1,103 @@
1
+ require 'rubygems'
2
+ require 'spec'
3
+
4
+ $: << File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
5
+ require 'amalgalite'
6
+ require 'amalgalite/database'
7
+ class PH < ::Amalgalite::ProgressHandler
8
+ attr_reader :call_count
9
+ def initialize( max = nil )
10
+ @call_count = 0
11
+ @max = max
12
+ end
13
+
14
+ def call
15
+ @call_count += 1
16
+ if @max && ( @call_count >= @max ) then
17
+ return false
18
+ end
19
+ return true
20
+ end
21
+ end
22
+
23
+ def query_thread( db )
24
+ Thread.new( db ) do |db|
25
+ begin
26
+ db.execute("select count(id) from country")
27
+ rescue => e
28
+ had_error = e
29
+ Thread.current[:exception] = e
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "Progress Handlers" do
35
+ before(:each) do
36
+ @db_name = SpecInfo.make_iso_db
37
+ @iso_db = Amalgalite::Database.new( @db_name )
38
+ end
39
+
40
+ after(:each) do
41
+ @iso_db.close
42
+ File.unlink @db_name if File.exist?( @db_name )
43
+ end
44
+
45
+ it "raises NotImplemented if #call is not overwritten" do
46
+ bh = ::Amalgalite::ProgressHandler.new
47
+ lambda { bh.call }.should raise_error( ::NotImplementedError, /The progress handler call\(\) method must be implemented/ )
48
+ end
49
+
50
+ it "can be registered as block" do
51
+ call_count = 0
52
+ @iso_db.progress_handler( 50 ) do ||
53
+ call_count += 1
54
+ true
55
+ end
56
+ qt = query_thread( @iso_db )
57
+ qt.join
58
+ call_count.should > 10
59
+ end
60
+
61
+ it "can be registered as lambda" do
62
+ call_count = 0
63
+ callable = lambda { || call_count += 1; true }
64
+ @iso_db.progress_handler( 42, callable )
65
+ qt = query_thread( @iso_db )
66
+ qt.join
67
+ call_count.should > 10
68
+ end
69
+
70
+ it "can be registered as a class" do
71
+ ph = PH.new
72
+ @iso_db.progress_handler( 5, ph )
73
+ qt = query_thread( @iso_db )
74
+ qt.join
75
+ ph.call_count.should > 100
76
+ end
77
+
78
+ it "behaves like #interrupt! if returning a false value" do
79
+ ph = PH.new( 25 )
80
+ @iso_db.progress_handler( 5, ph )
81
+ qt = query_thread( @iso_db )
82
+ qt.join
83
+ ph.call_count.should == 25
84
+ qt[:exception].should be_instance_of( ::Amalgalite::SQLite3::Error )
85
+ qt[:exception].message.should =~ /interrupted/
86
+ end
87
+
88
+ it "cannot register a block with the wrong arity" do
89
+ lambda do
90
+ @iso_db.define_progress_handler { |x,y| puts "What!" }
91
+ end.should raise_error( ::Amalgalite::Database::ProgressHandlerError, /A progress handler expects 0 arguments, not 2/)
92
+ end
93
+
94
+ it "can remove a progress handler" do
95
+ ph = PH.new
96
+ @iso_db.progress_handler( 5, ph )
97
+ @iso_db.remove_progress_handler
98
+ qt = query_thread( @iso_db )
99
+ qt.join
100
+ ph.call_count.should == 0
101
+ qt[:exception].should be_nil
102
+ end
103
+ end
@@ -20,6 +20,7 @@ class SpecInfo
20
20
  FileUtils.cp @iso_db, @new_is_db
21
21
  return @new_is_db
22
22
  end
23
+
23
24
  end
24
25
  end
25
26
 
@@ -5,10 +5,10 @@ describe "Amalgalite::SQLite3::Version" do
5
5
  it "should have the sqlite3 version" do
6
6
  Amalgalite::SQLite3::VERSION.should =~ /\d\.\d\.\d/
7
7
  Amalgalite::SQLite3::Version.to_s.should =~ /\d\.\d\.\d/
8
- Amalgalite::SQLite3::Version.to_i.should == 3006006
8
+ Amalgalite::SQLite3::Version.to_i.should == 3006007
9
9
  Amalgalite::SQLite3::Version::MAJOR.should == 3
10
10
  Amalgalite::SQLite3::Version::MINOR.should == 6
11
- Amalgalite::SQLite3::Version::RELEASE.should == 6
11
+ Amalgalite::SQLite3::Version::RELEASE.should == 7
12
12
  Amalgalite::SQLite3::Version.to_a.should have(3).items
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amalgalite
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Hinegardner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-30 00:00:00 -07:00
12
+ date: 2009-01-10 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,7 +32,7 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: 4.5.0
34
34
  version:
35
- description: Amalgalite embeds the SQLite database engine in a ruby extension. There is no need to install SQLite separately. Look in the examples/ directory to see * general usage * blob io * schema information Also Scroll through Amalgalite::Database for a quick example, and a general overview of the API.
35
+ description: Amalgalite embeds the SQLite database engine in a ruby extension. There is no need to install SQLite separately. Look in the examples/ directory to see * general usage * blob io * schema information * custom functions * custom aggregates * requiring ruby code from a database Also Scroll through Amalgalite::Database for a quick example, and a general overview of the API.
36
36
  email: jeremy@hinegardner.org
37
37
  executables:
38
38
  - amalgalite-pack
@@ -42,18 +42,23 @@ extra_rdoc_files:
42
42
  - README
43
43
  - HISTORY
44
44
  - LICENSE
45
+ - lib/amalgalite/aggregate.rb
45
46
  - lib/amalgalite/blob.rb
46
47
  - lib/amalgalite/boolean.rb
48
+ - lib/amalgalite/busy_timeout.rb
47
49
  - lib/amalgalite/column.rb
48
50
  - lib/amalgalite/core_ext/kernel/require.rb
49
51
  - lib/amalgalite/database.rb
52
+ - lib/amalgalite/function.rb
50
53
  - lib/amalgalite/index.rb
51
54
  - lib/amalgalite/packer.rb
52
55
  - lib/amalgalite/paths.rb
53
56
  - lib/amalgalite/profile_tap.rb
57
+ - lib/amalgalite/progress_handler.rb
54
58
  - lib/amalgalite/requires.rb
55
59
  - lib/amalgalite/schema.rb
56
60
  - lib/amalgalite/sqlite3/constants.rb
61
+ - lib/amalgalite/sqlite3/database/function.rb
57
62
  - lib/amalgalite/sqlite3/database/status.rb
58
63
  - lib/amalgalite/sqlite3/status.rb
59
64
  - lib/amalgalite/sqlite3/version.rb
@@ -86,6 +91,7 @@ files:
86
91
  - ext/amalgalite3_requires_bootstrap.c
87
92
  - ext/amalgalite3_statement.c
88
93
  - ext/sqlite3.c
94
+ - ext/test_error.c
89
95
  - ext/amalgalite3.h
90
96
  - ext/sqlite3.h
91
97
  - ext/sqlite3_options.h
@@ -95,22 +101,30 @@ files:
95
101
  - examples/a.rb
96
102
  - examples/blob.rb
97
103
  - examples/bootstrap.rb
104
+ - examples/define_aggregate.rb
105
+ - examples/define_function.rb
98
106
  - examples/gem-db.rb
107
+ - examples/gems.db
99
108
  - examples/require_me.rb
100
109
  - examples/requires.rb
101
110
  - examples/schema-info.rb
111
+ - lib/amalgalite/aggregate.rb
102
112
  - lib/amalgalite/blob.rb
103
113
  - lib/amalgalite/boolean.rb
114
+ - lib/amalgalite/busy_timeout.rb
104
115
  - lib/amalgalite/column.rb
105
116
  - lib/amalgalite/core_ext/kernel/require.rb
106
117
  - lib/amalgalite/database.rb
118
+ - lib/amalgalite/function.rb
107
119
  - lib/amalgalite/index.rb
108
120
  - lib/amalgalite/packer.rb
109
121
  - lib/amalgalite/paths.rb
110
122
  - lib/amalgalite/profile_tap.rb
123
+ - lib/amalgalite/progress_handler.rb
111
124
  - lib/amalgalite/requires.rb
112
125
  - lib/amalgalite/schema.rb
113
126
  - lib/amalgalite/sqlite3/constants.rb
127
+ - lib/amalgalite/sqlite3/database/function.rb
114
128
  - lib/amalgalite/sqlite3/database/status.rb
115
129
  - lib/amalgalite/sqlite3/status.rb
116
130
  - lib/amalgalite/sqlite3/version.rb
@@ -128,14 +142,18 @@ files:
128
142
  - lib/amalgalite/version.rb
129
143
  - lib/amalgalite/view.rb
130
144
  - lib/amalgalite.rb
145
+ - spec/aggregate_spec.rb
131
146
  - spec/amalgalite_spec.rb
132
147
  - spec/blob_spec.rb
133
148
  - spec/boolean_spec.rb
149
+ - spec/busy_handler.rb
134
150
  - spec/database_spec.rb
135
151
  - spec/default_map_spec.rb
152
+ - spec/function_spec.rb
136
153
  - spec/integeration_spec.rb
137
154
  - spec/packer_spec.rb
138
155
  - spec/paths_spec.rb
156
+ - spec/progress_handler_spec.rb
139
157
  - spec/requires_spec.rb
140
158
  - spec/schema_spec.rb
141
159
  - spec/spec_helper.rb