[ANN] SQLite-Ruby 1.2.0

SQLite-Ruby is a module for accessing SQLite (http://www.sqlite.org) databases from Ruby.

   http://rubyforge.org/projects/sqlite-ruby

This release adds support for Ara Howard's "arrayfields" module. If that module is installed, each row of a result set will be returned as an Array, instead of a Hash. SQLite-Ruby will function without arrayfields, however, in which case each row is returned as a Hash (as before).

The most significant change in this release is that columns in result sets are numbered starting at 0, instead of 1. This may cause existing SQLite-Ruby programs to fail if you upgrade, so proceed with caution! Caveat emptor!

Other minor changes: the install script has been modified so that any parameters you give to it are passed through to the extconf.rb script. This allows you to (for instance) specify a custom location for the sqlite libraries and header files. (Thanks, Ara and Ludo!)

As before, this is available as a gem, so you can just type "gem -i sqlite" and have it installed for you. Additionally, you can use "gem --gen-rdoc --run-tests -i sqlite" to generate the documentation and run the test suite at the same time.

For those that are "gem-challenged", the library is available in bz2, gz, and zip format as well. :slight_smile:

···

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl -e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/../).map{|n|n.to_i(16).chr}.join))'

awesome! thanks alot jamis! stay tuned for my clustering software based on
your sqlite project - ruby queue (rq).

cheers.

-a

···

On Fri, 2 Jul 2004, Jamis Buck wrote:

SQLite-Ruby is a module for accessing SQLite (http://www.sqlite.org)
databases from Ruby.

  http://rubyforge.org/projects/sqlite-ruby

This release adds support for Ara Howard's "arrayfields" module. If that
module is installed, each row of a result set will be returned as an
Array, instead of a Hash. SQLite-Ruby will function without arrayfields,
however, in which case each row is returned as a Hash (as before).

The most significant change in this release is that columns in result
sets are numbered starting at 0, instead of 1. This may cause existing
SQLite-Ruby programs to fail if you upgrade, so proceed with caution!
Caveat emptor!

Other minor changes: the install script has been modified so that any
parameters you give to it are passed through to the extconf.rb script.
This allows you to (for instance) specify a custom location for the
sqlite libraries and header files. (Thanks, Ara and Ludo!)

As before, this is available as a gem, so you can just type "gem -i
sqlite" and have it installed for you. Additionally, you can use "gem
--gen-rdoc --run-tests -i sqlite" to generate the documentation and run
the test suite at the same time.

For those that are "gem-challenged", the library is available in bz2,
gz, and zip format as well. :slight_smile:

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl
-e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/../).map{|n|n.to_i(16).chr}.join))'

--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================

jamis-

anyway to force hash usage even if arrayfields is installed? i want to do a
speed comparison...

-a

···

On Fri, 2 Jul 2004, Jamis Buck wrote:

SQLite-Ruby is a module for accessing SQLite (http://www.sqlite.org)
databases from Ruby.

  http://rubyforge.org/projects/sqlite-ruby

This release adds support for Ara Howard's "arrayfields" module. If that
module is installed, each row of a result set will be returned as an
Array, instead of a Hash. SQLite-Ruby will function without arrayfields,
however, in which case each row is returned as a Hash (as before).

The most significant change in this release is that columns in result
sets are numbered starting at 0, instead of 1. This may cause existing
SQLite-Ruby programs to fail if you upgrade, so proceed with caution!
Caveat emptor!

Other minor changes: the install script has been modified so that any
parameters you give to it are passed through to the extconf.rb script.
This allows you to (for instance) specify a custom location for the
sqlite libraries and header files. (Thanks, Ara and Ludo!)

As before, this is available as a gem, so you can just type "gem -i
sqlite" and have it installed for you. Additionally, you can use "gem
--gen-rdoc --run-tests -i sqlite" to generate the documentation and run
the test suite at the same time.

For those that are "gem-challenged", the library is available in bz2,
gz, and zip format as well. :slight_smile:

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl
-e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/../).map{|n|n.to_i(16).chr}.join))'

--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================

could anyone help me to make sqlite 1.2.0 ?

----------------------8<----------------------------------------------------

···

-
D:\temp\sqlite-ruby-1.2.0>ver
Microsoft Windows 2000 [Version 5.00.2195]

D:\temp\sqlite-ruby-1.2.0>ruby -v
ruby 1.8.2 (2004-06-04) [i386-mswin32]

D:\temp\sqlite-ruby-1.2.0>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

D:\temp\sqlite-ruby-1.2.0>ruby install.rb
cp ext/extconf.rb ext/sqlite.c build
cp -r lib build
cd build
checking for main() in sqlite.lib... no
checking for sqlite.h... yes
checking for sqlite_open() in sqlite.lib... no
make: *** No targets specified and no makefile found. Stop.
could not build sqlite module

D:\temp\sqlite-ruby-1.2.0\build>type mkmf.log
have_library: checking for main() in sqlite.lib... -------------------- no

"cl -nologo -Feconftest -ID:/temp/sqlite-ruby-1.2.0/build -Id:/ruby/lib/ruby
/1.8/i386-mswin32 -I. -I./.. -I./../missing -MD -Zi -O2b
2xg- -G5 conftest.c msvcrt-ruby18-static.lib sqlite.lib oldnames.lib
user32.lib advapi32.lib wsock32.lib -link -libpath:"d:/
ruby/lib" -stack:0x2000000"
conftest.c
LINK : fatal error LNK1104: cannot open file "sqlite.lib"
checked program was:
/* begin */

/*top*/
int main() { return 0; }
int t() { main(); return 0; }
/* end */

"cl -nologo -Feconftest -ID:/temp/sqlite-ruby-1.2.0/build -Id:/ruby/lib/ruby
/1.8/i386-mswin32 -I. -I./.. -I./../missing -MD -Zi -O2b
2xg- -G5 conftest.c msvcrt-ruby18-static.lib sqlite.lib oldnames.lib
user32.lib advapi32.lib wsock32.lib -link -libpath:"d:/
ruby/lib" -stack:0x2000000"
conftest.c
LINK : fatal error LNK1104: cannot open file "sqlite.lib"
checked program was:
/* begin */
#include <winsock2.h>
#include <windows.h>

/*top*/
int main() { return 0; }
int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; }
/* end */

--------------------

have_header: checking for sqlite.h... -------------------- yes

"cl -ID:/temp/sqlite-ruby-1.2.0/build -Id:/ruby/lib/ruby/1.8/i386-mswin32 -I
-I./.. -I./../missing -MD -Zi -O2b2xg- -G5 conftest.c
-P"
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

conftest.c
checked program was:
/* begin */
#include <sqlite.h>
/* end */

--------------------

have_library: checking for sqlite_open() in
sqlite.lib... -------------------- no

"cl -nologo -Feconftest -ID:/temp/sqlite-ruby-1.2.0/build -Id:/ruby/lib/ruby
/1.8/i386-mswin32 -I. -I./.. -I./../missing -MD -Zi -O2b
2xg- -G5 conftest.c msvcrt-ruby18-static.lib sqlite.lib oldnames.lib
user32.lib advapi32.lib wsock32.lib -link -libpath:"d:/
ruby/lib" -stack:0x2000000"
conftest.c
LINK : fatal error LNK1104: cannot open file "sqlite.lib"
checked program was:
/* begin */

/*top*/
int main() { return 0; }
int t() { sqlite_open(); return 0; }
/* end */

"cl -nologo -Feconftest -ID:/temp/sqlite-ruby-1.2.0/build -Id:/ruby/lib/ruby
/1.8/i386-mswin32 -I. -I./.. -I./../missing -MD -Zi -O2b
2xg- -G5 conftest.c msvcrt-ruby18-static.lib sqlite.lib oldnames.lib
user32.lib advapi32.lib wsock32.lib -link -libpath:"d:/
ruby/lib" -stack:0x2000000"
conftest.c
conftest.c(6) : error C2065: 'sqlite_open' : undeclared identifier
checked program was:
/* begin */
#include <winsock2.h>
#include <windows.h>

/*top*/
int main() { return 0; }
int t() { void ((*volatile p)()); p = (void ((*)()))sqlite_open; return 0; }
/* end */

--------------------

D:\temp\sqlite-ruby-1.2.0\build>
----------------------8<----------------------------------------------------
-

thanks,

--.Pinelo.

----- Original Message -----
From: "Jamis Buck" <jgb3@email.byu.edu>
To: "ruby-talk ML" <ruby-talk@ruby-lang.org>
Sent: Thursday, July 01, 2004 11:56 AM
Subject: [ANN] SQLite-Ruby 1.2.0

SQLite-Ruby is a module for accessing SQLite (http://www.sqlite.org)
databases from Ruby.

   http://rubyforge.org/projects/sqlite-ruby

This release adds support for Ara Howard's "arrayfields" module. If that
module is installed, each row of a result set will be returned as an
Array, instead of a Hash. SQLite-Ruby will function without arrayfields,
however, in which case each row is returned as a Hash (as before).

The most significant change in this release is that columns in result
sets are numbered starting at 0, instead of 1. This may cause existing
SQLite-Ruby programs to fail if you upgrade, so proceed with caution!
Caveat emptor!

Other minor changes: the install script has been modified so that any
parameters you give to it are passed through to the extconf.rb script.
This allows you to (for instance) specify a custom location for the
sqlite libraries and header files. (Thanks, Ara and Ludo!)

As before, this is available as a gem, so you can just type "gem -i
sqlite" and have it installed for you. Additionally, you can use "gem
--gen-rdoc --run-tests -i sqlite" to generate the documentation and run
the test suite at the same time.

For those that are "gem-challenged", the library is available in bz2,
gz, and zip format as well. :slight_smile:

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl
-e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)

[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/
./).map{|n|n.to_i(16).chr}.join))'

Ara.T.Howard wrote:

jamis-

anyway to force hash usage even if arrayfields is installed? i want to do a
speed comparison...

Yup. Just do

   db.use_arrayfields = false

Where 'db' is your open database instance.

···

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl -e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/../).map{|n|n.to_i(16).chr}.join))'

William Pinelo Marin wrote:

could anyone help me to make sqlite 1.2.0 ?

[snip]

Well, I no expert on building Ruby modules for Windows, but it looks like it can't find the library for SQLite. You can tell the build system where to look for that file, with the --with-sqlite-lib option. Just do something like:

   ruby install.rb --with-sqlite-lib=c:\directory\containing\sqlite\lib

See if that works for you. Good luck! Let me know if you get it working.

···

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl -e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/../).map{|n|n.to_i(16).chr}.join))'

very cool. my tests show about 2/3 the memusage by using arrayfields on a
table with 50000 rows. the access is slower since there are two method calls
instead of one, of course, but it's not significant. and of course code like
this:

   tuples.each do |t|
     puts t.join(',')
   end

is much faster since otherwise you'd be doing something like:

   ikeys = tuples.first.keys.select{|k| Numeric === k}.sort

   tuples.each do |t|
     puts(t.values_at(*ikeys).join(','))
   end

which invloves an extra object creation, array explosion, and method call per
tuple.

if i re-wrote arrayfields in C it'd probably be better/same for all aspects
including lookup speed...

thanks for effort and quick turn-around jamis!

-a

···

On Fri, 2 Jul 2004, Jamis Buck wrote:

Yup. Just do

  db.use_arrayfields = false

Where 'db' is your open database instance.

--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================

[...]

Yup. Just do

    db.use_arrayfields = false

Shouldn't that be off by default? I don't like the idea of the SQLite
interface suddenly breaking just because somebody is using arrayfields
somewhere else in an application.

      Reimer Behrends

···

Jamis Buck (jgb3@email.byu.edu) wrote:

Reimer Behrends wrote:

[...]

Yup. Just do

   db.use_arrayfields = false

Shouldn't that be off by default? I don't like the idea of the SQLite
interface suddenly breaking just because somebody is using arrayfields
somewhere else in an application.

      Reimer Behrends

.

Using arrayfields will not break your application. In fact, from a client's perspective, really can't tell which is being used, unless you actually ask what the type of the row object is.

Well, I take that back. If you are using some method of Hash on the row object (like "keys" or "values"), your code will break...

I don't mind making the use of arrayfields false by default. Anyone else have a strong opinion?

···

Jamis Buck (jgb3@email.byu.edu) wrote:

--
Jamis Buck
jgb3@email.byu.edu
http://www.jamisbuck.org/jamis

ruby -ropenssl -e'k="01234567";p((c,c.padding,c.iv,c.key=OpenSSL::Cipher::BF.new,0,k,k*2)[0].decrypt.update("1A81803C452C324619D319F980D5B84DBB45FC0FE2BAA045".scan(/../).map{|n|n.to_i(16).chr}.join))'

Using arrayfields will not break your application. In fact, from a
client's perspective, really can't tell which is being used, unless you
actually ask what the type of the row object is.

Well, I take that back. If you are using some method of Hash on the row
object (like "keys" or "values"), your code will break...

funny you should mention that - i can't see any reason why ArrayFields
shouldn't have

   def keys
     fields
   end
   def values
     self
   end

an it would __really__ behave in a hashlike fashion... thoughts?

I don't mind making the use of arrayfields false by default. Anyone else
have a strong opinion?

i think off is good for reasons metioned by OP. i am really liking the new
interface - i just updated my code, which consisted of removing about 100
lines AND it runs faster - nice.

cheers.

-a

···

On Fri, 2 Jul 2004, Jamis Buck wrote:
--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================

Personally, what I would do is simply provide an array that arrayfields is
happy with as a fields descriptor, and provide your rows as plain arrays,
also something arrayfields is happy with. Use arrayfields in your
documentation examples, but don't actually depend on its existence, just
provide the arrays and let the developers decide whether to use arrayfields
or rows as plain arrays.

  Sean O'Dell

···

On Thursday 01 July 2004 13:17, Jamis Buck wrote:

Reimer Behrends wrote:
> Jamis Buck (jgb3@email.byu.edu) wrote:
> [...]
>
>> Yup. Just do
>>
>> db.use_arrayfields = false
>
> Shouldn't that be off by default? I don't like the idea of the SQLite
> interface suddenly breaking just because somebody is using arrayfields
> somewhere else in an application.
>
> Reimer Behrends
>
> .

Using arrayfields will not break your application. In fact, from a
client's perspective, really can't tell which is being used, unless you
actually ask what the type of the row object is.

Well, I take that back. If you are using some method of Hash on the row
object (like "keys" or "values"), your code will break...

I don't mind making the use of arrayfields false by default. Anyone else
have a strong opinion?

I was going to suggest that the hash methods be added. I don't see a
downside to doing that.

Kirk

···

On Fri, 2 Jul 2004 05:52:49 +0900, Ara.T.Howard wrote

funny you should mention that - i can't see any reason why
ArrayFields shouldn't have

   def keys
     fields
   end
   def values
     self
   end

an it would __really__ behave in a hashlike fashion... thoughts?

some of them are out, like each, since the impl for Array and Hash are
different, but some methods like

   #fetch
   #keys
   #values

would be a nice ducktype facet. i'll look into this for the next release
which, i hope, will include a C impl as well.

cheers.

-a

···

On Fri, 2 Jul 2004, Kirk Haines wrote:

I was going to suggest that the hash methods be added. I don't see a
downside to doing that.

--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================

Isn't it a unique object now? For some reason, I thought you made ArrayFields
its own class. If you did that, you could add each because ArrayFields is a
hash interface to arrays; it's hash-like.

  Sean O'Dell

···

On Thursday 01 July 2004 15:03, Ara.T.Howard wrote:

On Fri, 2 Jul 2004, Kirk Haines wrote:
> I was going to suggest that the hash methods be added. I don't see a
> downside to doing that.

some of them are out, like each, since the impl for Array and Hash are
different, but some methods like

How about checking the arity of the block given to #each:

  row.each {|x| } # Array
  row.each {|k,v| } # Hash

Adding #each_pair would work nicely also.

···

On Fri, 2 Jul 2004, Ara.T.Howard wrote:

On Fri, 2 Jul 2004, Kirk Haines wrote:

> I was going to suggest that the hash methods be added. I don't see a
> downside to doing that.

some of them are out, like each, since the impl for Array and Hash are
different, but some methods like

   #fetch
   #keys
   #values

would be a nice ducktype facet. i'll look into this for the next release
which, i hope, will include a C impl as well.

--
Relm

ArrayFields is a Module used to extend only those Array instances that use the
#fields= method. the Array class itself is never modified.

FieldedArray is a class which wraps an array and which also includes
ArrayFields. by defining method_missing to use it's wrapped array it can
leveage the ArrayFields module w/o extend the actual array object.

summary:

   - class Array never has anything added to it other than #fields=

   - if, and only if, #fields= is called then that instance will auto-extend
     it's singleton class to have the methods of ArrayFields

   - FieldedArray behaves just like an Array whose singleton class has been
     extended, but w/o actually extending it. this is accompished by both
     extending the FieldedArray object with ArrayFields AND delgating missing
     methods (in this case all the calls to super in ArrayFields) to this
     array.

cheers.

-a

···

On Fri, 2 Jul 2004, Sean O'Dell wrote:

On Thursday 01 July 2004 15:03, Ara.T.Howard wrote:

On Fri, 2 Jul 2004, Kirk Haines wrote:

I was going to suggest that the hash methods be added. I don't see a
downside to doing that.

some of them are out, like each, since the impl for Array and Hash are
different, but some methods like

Isn't it a unique object now? For some reason, I thought you made ArrayFields
its own class. If you did that, you could add each because ArrayFields is a
hash interface to arrays; it's hash-like.

  Sean O'Dell

--

EMAIL :: Ara [dot] T [dot] Howard [at] noaa [dot] gov
PHONE :: 303.497.6469
A flower falls, even though we love it;
and a weed grows, even though we do not love it. --Dogen

===============================================================================