amalgalite 0.10.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY +201 -0
- data/LICENSE +29 -0
- data/README +51 -0
- data/bin/amalgalite-pack +126 -0
- data/examples/a.rb +9 -0
- data/examples/blob.rb +88 -0
- data/examples/bootstrap.rb +36 -0
- data/examples/define_aggregate.rb +75 -0
- data/examples/define_function.rb +104 -0
- data/examples/gem-db.rb +94 -0
- data/examples/gems.db +0 -0
- data/examples/require_me.rb +11 -0
- data/examples/requires.rb +42 -0
- data/examples/schema-info.rb +34 -0
- data/ext/amalgalite/amalgalite3.c +290 -0
- data/ext/amalgalite/amalgalite3.h +151 -0
- data/ext/amalgalite/amalgalite3_blob.c +240 -0
- data/ext/amalgalite/amalgalite3_constants.c +221 -0
- data/ext/amalgalite/amalgalite3_database.c +1148 -0
- data/ext/amalgalite/amalgalite3_requires_bootstrap.c +210 -0
- data/ext/amalgalite/amalgalite3_statement.c +639 -0
- data/ext/amalgalite/extconf.rb +36 -0
- data/ext/amalgalite/gen_constants.rb +130 -0
- data/ext/amalgalite/sqlite3.c +106729 -0
- data/ext/amalgalite/sqlite3.h +5626 -0
- data/ext/amalgalite/sqlite3_options.h +4 -0
- data/ext/amalgalite/sqlite3ext.h +380 -0
- data/gemspec.rb +60 -0
- data/lib/amalgalite.rb +43 -0
- data/lib/amalgalite/1.8/amalgalite3.so +0 -0
- data/lib/amalgalite/1.9/amalgalite3.so +0 -0
- data/lib/amalgalite/aggregate.rb +67 -0
- data/lib/amalgalite/blob.rb +186 -0
- data/lib/amalgalite/boolean.rb +42 -0
- data/lib/amalgalite/busy_timeout.rb +47 -0
- data/lib/amalgalite/column.rb +97 -0
- data/lib/amalgalite/core_ext/kernel/require.rb +21 -0
- data/lib/amalgalite/database.rb +947 -0
- data/lib/amalgalite/function.rb +61 -0
- data/lib/amalgalite/index.rb +43 -0
- data/lib/amalgalite/packer.rb +226 -0
- data/lib/amalgalite/paths.rb +70 -0
- data/lib/amalgalite/profile_tap.rb +131 -0
- data/lib/amalgalite/progress_handler.rb +21 -0
- data/lib/amalgalite/requires.rb +120 -0
- data/lib/amalgalite/schema.rb +191 -0
- data/lib/amalgalite/sqlite3.rb +6 -0
- data/lib/amalgalite/sqlite3/constants.rb +80 -0
- data/lib/amalgalite/sqlite3/database/function.rb +48 -0
- data/lib/amalgalite/sqlite3/database/status.rb +68 -0
- data/lib/amalgalite/sqlite3/status.rb +60 -0
- data/lib/amalgalite/sqlite3/version.rb +37 -0
- data/lib/amalgalite/statement.rb +414 -0
- data/lib/amalgalite/table.rb +90 -0
- data/lib/amalgalite/taps.rb +2 -0
- data/lib/amalgalite/taps/console.rb +27 -0
- data/lib/amalgalite/taps/io.rb +71 -0
- data/lib/amalgalite/trace_tap.rb +35 -0
- data/lib/amalgalite/type_map.rb +63 -0
- data/lib/amalgalite/type_maps/default_map.rb +167 -0
- data/lib/amalgalite/type_maps/storage_map.rb +40 -0
- data/lib/amalgalite/type_maps/text_map.rb +22 -0
- data/lib/amalgalite/version.rb +37 -0
- data/lib/amalgalite/view.rb +26 -0
- data/spec/aggregate_spec.rb +169 -0
- data/spec/amalgalite_spec.rb +4 -0
- data/spec/blob_spec.rb +81 -0
- data/spec/boolean_spec.rb +23 -0
- data/spec/busy_handler.rb +165 -0
- data/spec/database_spec.rb +494 -0
- data/spec/default_map_spec.rb +87 -0
- data/spec/function_spec.rb +94 -0
- data/spec/integeration_spec.rb +111 -0
- data/spec/packer_spec.rb +60 -0
- data/spec/paths_spec.rb +28 -0
- data/spec/progress_handler_spec.rb +105 -0
- data/spec/requires_spec.rb +23 -0
- data/spec/rtree_spec.rb +71 -0
- data/spec/schema_spec.rb +120 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/sqlite3/constants_spec.rb +65 -0
- data/spec/sqlite3/database_status_spec.rb +36 -0
- data/spec/sqlite3/status_spec.rb +18 -0
- data/spec/sqlite3/version_spec.rb +14 -0
- data/spec/sqlite3_spec.rb +53 -0
- data/spec/statement_spec.rb +161 -0
- data/spec/storage_map_spec.rb +41 -0
- data/spec/tap_spec.rb +59 -0
- data/spec/text_map_spec.rb +23 -0
- data/spec/type_map_spec.rb +17 -0
- data/spec/version_spec.rb +15 -0
- data/tasks/announce.rake +43 -0
- data/tasks/config.rb +107 -0
- data/tasks/distribution.rake +77 -0
- data/tasks/documentation.rake +32 -0
- data/tasks/extension.rake +141 -0
- data/tasks/rspec.rake +33 -0
- data/tasks/rubyforge.rake +59 -0
- data/tasks/utils.rb +80 -0
- metadata +237 -0
data/HISTORY
ADDED
@@ -0,0 +1,201 @@
|
|
1
|
+
= Amalgalite Changelog
|
2
|
+
== Version 0.10.1 - 2009-08-01
|
3
|
+
|
4
|
+
* Add version subdirectory for extension on all platforms for building locally
|
5
|
+
on gem install.
|
6
|
+
* Small documentation change for Amalgalite::Database#new
|
7
|
+
* Add gem for x86-ming32 platform
|
8
|
+
* Add specs to validate the R*Tree index is compiled correctly
|
9
|
+
|
10
|
+
== Version 0.10.0 - 2009-06-28
|
11
|
+
|
12
|
+
=== Enhancements
|
13
|
+
|
14
|
+
* windows gem is now a fat binary to support installing into ruby 1.8 and 1.9
|
15
|
+
from the same gem
|
16
|
+
* Update to Sqlite 3.6.16 and fix errors returned by define_aggregate and
|
17
|
+
define_function based upon update
|
18
|
+
|
19
|
+
== Version 0.9.0 - 2009-04-05
|
20
|
+
|
21
|
+
=== Enhancements
|
22
|
+
|
23
|
+
* Ruby 1.9 compatibility
|
24
|
+
* Update to SQLite 3.6.12
|
25
|
+
* Added support for the new SQLite Backup API, see Amalgalite::Database#replicate_to
|
26
|
+
* Added exclusive/immediate/deferred transaction helpers
|
27
|
+
|
28
|
+
== Version 0.8.0 - 2009-03-23
|
29
|
+
|
30
|
+
=== Enhancements
|
31
|
+
|
32
|
+
* Add in support for obtaining limited schema information on temporary tables
|
33
|
+
and indexes
|
34
|
+
* Add support for returning the primary key columns of a table
|
35
|
+
* Other miscellaneous items to support the ActiveRecord adapter
|
36
|
+
|
37
|
+
== Version 0.7.7 - 2009-03-03
|
38
|
+
|
39
|
+
=== Bug Fixes
|
40
|
+
|
41
|
+
* roll back to SQLite 3.6.10 because of substr() bug in 3.6.11
|
42
|
+
|
43
|
+
== Version 0.7.6 - 2009-03-02
|
44
|
+
|
45
|
+
=== Enhancements
|
46
|
+
|
47
|
+
* Update to SQLite 3.6.11
|
48
|
+
|
49
|
+
=== Bug Fixes
|
50
|
+
|
51
|
+
* fix issues with the wrong error message appearing in statement closing
|
52
|
+
* incorrectly raise an exception if a transaction is started when rescuing an
|
53
|
+
exception [reported by James Edwared Gray II]
|
54
|
+
|
55
|
+
== Version 0.7.5 - 2009-02-12
|
56
|
+
|
57
|
+
=== Bug Fixes
|
58
|
+
|
59
|
+
* another ruby -w pass to clear up warnings
|
60
|
+
* force all tests to run with -w turned on
|
61
|
+
|
62
|
+
== Version 0.7.4 - 2009-02-08
|
63
|
+
|
64
|
+
=== Bug Fixes
|
65
|
+
|
66
|
+
* fix Database#first_row_from not behaving the same as Database#execute() when
|
67
|
+
there are no results. [reported by James Edward Gray II]
|
68
|
+
|
69
|
+
== Version 0.7.3 - 2009-02-08
|
70
|
+
|
71
|
+
=== Enhancements
|
72
|
+
|
73
|
+
* added Database#first_row_from
|
74
|
+
* added Database#first_value_from
|
75
|
+
|
76
|
+
=== Bug Fixes
|
77
|
+
|
78
|
+
* clean up ruby warnings when run with -w
|
79
|
+
* fix documenation on Database#execute
|
80
|
+
|
81
|
+
== Version 0.7.2 - 2009-01-24
|
82
|
+
=== Enhancements
|
83
|
+
|
84
|
+
* added quoting and escaping of text support, used for database drivers
|
85
|
+
* added ability to access columns of the schame in original definition order
|
86
|
+
|
87
|
+
== Version 0.7.1 - 2009-01-18
|
88
|
+
|
89
|
+
=== Enhancements
|
90
|
+
|
91
|
+
* added support for sqlite's nexted transactions which appeared in sqlite
|
92
|
+
* update to SQLite version 3.6.10
|
93
|
+
* added ability to set the SQLite temporary directory
|
94
|
+
* added amalgalite-pack --require-order
|
95
|
+
|
96
|
+
=== Bug Fixes
|
97
|
+
|
98
|
+
* fix exception when accessing the special 'rowid' column
|
99
|
+
* fix internal require order list for use in packing
|
100
|
+
|
101
|
+
== Version 0.6.0 - 2009-01-10
|
102
|
+
|
103
|
+
=== Enhancements
|
104
|
+
|
105
|
+
* Added ability to define custom SQL functions implemented in Ruby
|
106
|
+
* Added ability to define custom SQL aggregates implemented in Ruby
|
107
|
+
* Added support for Ruby busy handlers
|
108
|
+
* Added database 'interrupt' support
|
109
|
+
* Added support for Ruby progress handlers
|
110
|
+
* update to SQLite version 3.6.7
|
111
|
+
|
112
|
+
== Version 0.5.1 - 2008-11-30
|
113
|
+
|
114
|
+
=== Enhancements
|
115
|
+
|
116
|
+
* update to SQLite version 3.6.6.2
|
117
|
+
|
118
|
+
== Version 0.5.0 - 2008-11-16
|
119
|
+
|
120
|
+
=== Enhancements
|
121
|
+
|
122
|
+
* amalgalite-pack-into-db has been reworked into amalgalite-pack
|
123
|
+
* ruby code that is packed into a database for later requiring can now be
|
124
|
+
compressed
|
125
|
+
* update to SQLite version 3.6.5
|
126
|
+
|
127
|
+
== Version 0.4.2 - 2008-10-12
|
128
|
+
|
129
|
+
=== Enhancements
|
130
|
+
|
131
|
+
* release of windows gem
|
132
|
+
|
133
|
+
== Version 0.4.1 - 2008-09-28
|
134
|
+
|
135
|
+
=== Enhancements
|
136
|
+
|
137
|
+
* update to SQLite3 version 3.6.3
|
138
|
+
* change rdoc template to darkfish
|
139
|
+
|
140
|
+
== Version 0.4.0 - 2008-09-14
|
141
|
+
|
142
|
+
=== Enhancements
|
143
|
+
* update to SQLite3 version 3.6.2 and enable the RTree option by default
|
144
|
+
* Amalgalite::Requires module allowing ruby code to be 'required' from columns in an SQLite database
|
145
|
+
* Amagalite::Requires::Bootstrap extension module enabling low level boot
|
146
|
+
strapping of the pure ruby Amalgalite code from an sqlite database
|
147
|
+
* more indepth information about indexes is available via the Index class
|
148
|
+
* add support for sqlite3_status and sqlite3_db_status information
|
149
|
+
|
150
|
+
=== Bugfixes
|
151
|
+
|
152
|
+
* fix nil exception when using a declared_data_type on primary key column that
|
153
|
+
has no declared_data_type
|
154
|
+
* when Database#transaction is passed a block, the return value is the return
|
155
|
+
value of the block
|
156
|
+
* nested transactions are 'faked'. Calling Database#transaction while
|
157
|
+
Databased#in_transaction? is true does not result in an exception, but
|
158
|
+
continues on in the current transaction.
|
159
|
+
* raise LoadError if required in the same program as sqlite3-ruby. These
|
160
|
+
libraries conflict with each other.
|
161
|
+
|
162
|
+
== Version 0.2.4 - 2008-07-13
|
163
|
+
|
164
|
+
=== Bugfixes
|
165
|
+
* fix compilation when ruby is compiled without pthreads using
|
166
|
+
|
167
|
+
== Version 0.2.3 - 2008-07-12
|
168
|
+
|
169
|
+
=== Bugfixes
|
170
|
+
* make sure file permissions are all read before shipping gem
|
171
|
+
|
172
|
+
== Version 0.2.2 - 2008-07-12
|
173
|
+
|
174
|
+
=== Bugfixes
|
175
|
+
* Database#pragma should accept a block just like Database#execute does
|
176
|
+
* convert to using extconf.rb instead of mkrf to enable compilation as a
|
177
|
+
direct ruby extension in the ruby source tree
|
178
|
+
|
179
|
+
== Version 0.2.1 - 2008-07-05
|
180
|
+
|
181
|
+
=== Bugfixes
|
182
|
+
* make sure that the pthread support in sqlite3 matches that of ruby
|
183
|
+
* fix schema reloading in the example scripts
|
184
|
+
|
185
|
+
== Version 0.2.0 - 2008-07-04
|
186
|
+
|
187
|
+
=== Enhancements
|
188
|
+
* blob support, both incremental access and normal access
|
189
|
+
* added examples/gem_db.rb script demonstrating taps and prepared statements
|
190
|
+
* added examples/schema-info.rb script demonstrating meta information
|
191
|
+
* added examples/blob.rb demonstrating incremental blob IO
|
192
|
+
* added access to the SQLite3 errcode and errmsg api
|
193
|
+
|
194
|
+
=== Bugfixes
|
195
|
+
* added taps.rb for requiring
|
196
|
+
* fixed prepared statement reset
|
197
|
+
* caught an error in executing prepared statements earlier in the process so the correct error is reported
|
198
|
+
|
199
|
+
== Version 0.1.0 - 2008-06-21
|
200
|
+
|
201
|
+
* Initial public release
|
data/LICENSE
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Copyright (c) 2008, Jeremy Hinegardner
|
2
|
+
|
3
|
+
All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without
|
6
|
+
modification, are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
* Redistributions of source code must retain the above copyright notice,
|
9
|
+
this list of conditions and the following disclaimer.
|
10
|
+
|
11
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
12
|
+
this list of conditions and the following disclaimer in the documentation
|
13
|
+
and/or other materials provided with the distribution.
|
14
|
+
|
15
|
+
* Neither the name of Jeremy Hinegardner nor the names of its contributors
|
16
|
+
may be used to endorse or promote products derived from this software without
|
17
|
+
specific prior written permission.
|
18
|
+
|
19
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
20
|
+
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
21
|
+
TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
22
|
+
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
23
|
+
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
24
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
25
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
26
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
27
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
28
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
29
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
== Amalgalite
|
2
|
+
|
3
|
+
* Homepage[http://copiousfreetime.rubyforge.org/amalgalite]
|
4
|
+
* {Rubyforge Project}[http://rubyforge.org/projects/copiousfreetime/]
|
5
|
+
* email jeremy at copiousfreetime dot org
|
6
|
+
* git clone url git://github.com/copiousfreetime/amalgalite.git
|
7
|
+
|
8
|
+
== Articles
|
9
|
+
|
10
|
+
* {Writing SQL Functions in Ruby}[http://copiousfreetime.org/articles/2009/01/10/writing-sql-functions-in-ruby.html]
|
11
|
+
|
12
|
+
== INSTALL
|
13
|
+
|
14
|
+
* gem install amalgalite
|
15
|
+
|
16
|
+
== DESCRIPTION
|
17
|
+
|
18
|
+
Amalgalite embeds the SQLite database engine in a ruby extension. There is no
|
19
|
+
need to install SQLite separately.
|
20
|
+
|
21
|
+
Look in the examples/ directory to see
|
22
|
+
|
23
|
+
* general usage
|
24
|
+
* blob io
|
25
|
+
* schema information
|
26
|
+
* custom functions
|
27
|
+
* custom aggregates
|
28
|
+
* requiring ruby code from a database
|
29
|
+
|
30
|
+
Also Scroll through Amalgalite::Database for a quick example, and a general
|
31
|
+
overview of the API.
|
32
|
+
|
33
|
+
Amalgalite adds in the following additional non-default SQLite extension(s):
|
34
|
+
|
35
|
+
* {R*Tree index extension}[http://sqlite.org/rtree.html]
|
36
|
+
|
37
|
+
== CREDITS
|
38
|
+
|
39
|
+
* Jamis Buck for the first {ruby sqlite implementation}[http://www.rubyforge.org/projects/sqlite-ruby]
|
40
|
+
|
41
|
+
== CHANGES
|
42
|
+
|
43
|
+
Read the HISTORY file.
|
44
|
+
|
45
|
+
== LICENSE
|
46
|
+
|
47
|
+
Copyright (c) 2008 Jeremy Hinegardner
|
48
|
+
|
49
|
+
All rights reserved.
|
50
|
+
|
51
|
+
See LICENSE and/or COPYING for details.
|
data/bin/amalgalite-pack
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'optparse'
|
3
|
+
require 'pathname'
|
4
|
+
require 'rubygems'
|
5
|
+
|
6
|
+
#
|
7
|
+
# add relative paths to the load path if we are not a gem and calculate what the
|
8
|
+
# strip path will be if we decide to pack --self
|
9
|
+
#
|
10
|
+
this_path = Pathname.new( File.expand_path( __FILE__ ) )
|
11
|
+
gem_path = Pathname.new( Gem.dir )
|
12
|
+
rel_path = this_path.relative_path_from( gem_path )
|
13
|
+
if ".." == rel_path.to_s.split( File::SEPARATOR ).first then
|
14
|
+
lib_path = File.join( File.dirname( __FILE__ ), "../lib" )
|
15
|
+
$:.unshift lib_path
|
16
|
+
$:.unshift File.join( File.dirname( __FILE__ ), "../ext" )
|
17
|
+
end
|
18
|
+
|
19
|
+
#
|
20
|
+
# snapshot of what is needed for amalgalite requires, this info may only be used
|
21
|
+
# when packing amalgalite itself
|
22
|
+
#
|
23
|
+
loaded_features_before = $LOADED_FEATURES.dup
|
24
|
+
require 'amalgalite/packer'
|
25
|
+
loaded_features_after = $LOADED_FEATURES.dup
|
26
|
+
amalgalite_needs = loaded_features_after - loaded_features_before
|
27
|
+
|
28
|
+
#
|
29
|
+
# Commandline parser
|
30
|
+
#
|
31
|
+
options = {}
|
32
|
+
begin
|
33
|
+
parser = OptionParser.new do |op|
|
34
|
+
op.banner = "Usage: #{op.program_name} [options] <files>"
|
35
|
+
op.separator ""
|
36
|
+
|
37
|
+
op.on("--dbfile DB", "The Database file in which to pack files") do |d|
|
38
|
+
options[:dbfile] = d
|
39
|
+
end
|
40
|
+
|
41
|
+
op.on("--drop-table", "Drop the table before inserting rows") do |t|
|
42
|
+
options[:drop_table] = t
|
43
|
+
end
|
44
|
+
|
45
|
+
op.on("-m", "--merge", "Merge these files into the existing table overwriting rows that conflict") do |m|
|
46
|
+
options[:merge] = true
|
47
|
+
end
|
48
|
+
|
49
|
+
op.on("--require-order", "Dump Amalgalite's require order" ) do |m|
|
50
|
+
puts amalgalite_needs
|
51
|
+
exit 0
|
52
|
+
end
|
53
|
+
|
54
|
+
op.on("--self", "pack amalgalite itself into the database") do |d|
|
55
|
+
options[:self] = true
|
56
|
+
end
|
57
|
+
|
58
|
+
op.on("--strip-prefix PREFIX", "strip this path prefix off the front of each file") do |p|
|
59
|
+
options[:strip_prefix] = File.expand_path( p )
|
60
|
+
end
|
61
|
+
|
62
|
+
op.on("-t", "--table TABLE", "the table name to pack into") do |t|
|
63
|
+
options[:table_name] = t
|
64
|
+
end
|
65
|
+
|
66
|
+
op.on("--verbose", "Be verbose about output") do |v|
|
67
|
+
options[:verbose] = v
|
68
|
+
end
|
69
|
+
|
70
|
+
op.on("-z", "--compressed", "compress the file contents on storage") do |z|
|
71
|
+
options[:compressed] = true
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
parser.parse!
|
77
|
+
require 'amalgalite/packer'
|
78
|
+
file_list = ARGV.dup
|
79
|
+
|
80
|
+
|
81
|
+
if options[:self] then
|
82
|
+
options[:table_name] = Amalgalite::Requires::Bootstrap::DEFAULT_BOOTSTRAP_TABLE
|
83
|
+
core_libs = (amalgalite_needs - Amalgalite::Packer.amalgalite_require_order).delete_if { |l| l.index(".rb").nil? }
|
84
|
+
|
85
|
+
#
|
86
|
+
# check and make sure nothing is missed
|
87
|
+
#
|
88
|
+
core_libs.each do |l|
|
89
|
+
if l.index("malgalite") then
|
90
|
+
STDERR.puts "ERROR! require_order needs an update #{l}"
|
91
|
+
exit 2
|
92
|
+
end
|
93
|
+
end
|
94
|
+
file_list = core_libs.concat( Amalgalite::Packer.amalgalite_require_order )
|
95
|
+
if options[:compressed] then
|
96
|
+
STDERR.puts "Compressing --self is not allowed, reverting to uncompressed"
|
97
|
+
options[:compressed] = false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
STDERR.puts parser if file_list.empty?
|
101
|
+
|
102
|
+
packer = Amalgalite::Packer.new( options )
|
103
|
+
packer.pack( file_list )
|
104
|
+
|
105
|
+
rescue OptionParser::ParseError => pe
|
106
|
+
STDERR.puts "ERROR : #{pe}"
|
107
|
+
STDERR.puts parser
|
108
|
+
exit 1
|
109
|
+
end
|
110
|
+
|
111
|
+
__END__
|
112
|
+
|
113
|
+
puts <<-text
|
114
|
+
|
115
|
+
Packing complete. To utilize the bootstrapping in #{dbfile} you must do
|
116
|
+
one of the following:
|
117
|
+
|
118
|
+
* statically compile the amalgalite C extension into your application
|
119
|
+
* require 'amalgalite/amalgalite3'
|
120
|
+
|
121
|
+
Once one of those is working you can boostrap the Amalgalite library with
|
122
|
+
this line in your code:
|
123
|
+
|
124
|
+
Amalgalite::Requries::Boostrap.lift( 'dbfile' => '#{dbfile}' )
|
125
|
+
|
126
|
+
text
|
data/examples/a.rb
ADDED
data/examples/blob.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# An Amalgalite example showing how Blob's can be utilized
|
5
|
+
#
|
6
|
+
# We'll make a database with one table, that we store files in. We'll use the
|
7
|
+
# Blob incremental IO to store the files and retrieve them from the database
|
8
|
+
#
|
9
|
+
# This little program will store 1 or more files in the sqlite3 database when
|
10
|
+
# the 'store' action is given, and cat a file to stdout on 'retrieve'
|
11
|
+
#
|
12
|
+
# e.g.
|
13
|
+
#
|
14
|
+
# ruby blob.rb store a.rb b.rb c.rb # => stores a.rb b.rb and c.rb in the db
|
15
|
+
#
|
16
|
+
# ruby blob.rb retrieve a.rb # => dumps a.rb to stdout
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
$: << "../lib"
|
21
|
+
$: << "../ext"
|
22
|
+
require 'amalgalite'
|
23
|
+
require 'amalgalite/packer'
|
24
|
+
VALID_ACTIONS = %w[ list retrieve store ]
|
25
|
+
def usage
|
26
|
+
STDERR.puts "Usage: #{File.basename($0)} ( #{VALID_ACTIONS.join(' | ')} ) file(s)"
|
27
|
+
exit 1
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# This does the basic command line parsing
|
32
|
+
#
|
33
|
+
usage if ARGV.size < 1
|
34
|
+
action = ARGV.shift
|
35
|
+
usage unless VALID_ACTIONS.include? action
|
36
|
+
file_list = ARGV
|
37
|
+
|
38
|
+
#
|
39
|
+
# create the database if it doesn't exist
|
40
|
+
#
|
41
|
+
db = Amalgalite::Database.new( "filestore.db" )
|
42
|
+
|
43
|
+
case action
|
44
|
+
#
|
45
|
+
# list all the files that are stored in the database
|
46
|
+
#
|
47
|
+
when 'list'
|
48
|
+
db.execute("SELECT filename FROM rubylibs") do |row|
|
49
|
+
puts row['filename']
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# if we are doing the store action, then loop over the files and store them in
|
54
|
+
# the database. This will use incremental IO to store the files directly from
|
55
|
+
# the file names.
|
56
|
+
#
|
57
|
+
# It is slightly strange in that you have to tell the Blob object what column
|
58
|
+
# it is going to, but that is necessary at this point to be able to hook
|
59
|
+
# automatically into the lower level incremental blob IO api.
|
60
|
+
#
|
61
|
+
# This also shows using the $var syntax for binding name sql values in a
|
62
|
+
# prepared statement.
|
63
|
+
#
|
64
|
+
when 'store'
|
65
|
+
usage if file_list.empty?
|
66
|
+
require 'amalgalite/packer'
|
67
|
+
|
68
|
+
packer = Amalgalite::Packer.new( :dbfile => 'filestore.db',
|
69
|
+
:compressed => false )
|
70
|
+
packer.pack( file_list )
|
71
|
+
|
72
|
+
#
|
73
|
+
# dump the file that matches the right path to stdout. This also shows
|
74
|
+
# positional sql varible binding using the '?' syntax.
|
75
|
+
#
|
76
|
+
when 'retrieve'
|
77
|
+
usage if file_list.empty?
|
78
|
+
db.execute("SELECT id, compressed, filename, contents FROM rubylibs WHERE filename = ?", file_list.first) do |row|
|
79
|
+
STDERR.puts "Dumping #{row['filename']} to stdout"
|
80
|
+
if row['compressed'] then
|
81
|
+
s = row['contents'].to_s
|
82
|
+
STDOUT.puts Amalgalite::Packer.gunzip( s )
|
83
|
+
else
|
84
|
+
row['contents'].write_to_io( STDOUT )
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
db.close
|