[ANN] Ackbar - ActiveRecord Adapter for KirbyBase

= About Ackbar

Ackbar is an adapter for ActiveRecord (the Rails ORM layer) to the
KirbyBase
pure-ruby plain-text DBMS. Because KirbyBase does not support SQL, joins
or
transactions, this is not a 100% fit. There are some changes to the
ActiveRecord
interface (see below), but it may still be useful in some cases.

= URIs

Ackbar: http://ackbar.rubyforge.org
KirbyBase: netpromi.com
Rails: http://www.rubyonrails.com
Pimki: http://pimki.rubyforge.org

= Goals

Ackbar’s project goals, in order of importance, are:

  1. Support Pimki with a pure-ruby, cross-platform hassle-less install
    DBMS
  2. An exercise for me to learn ActiveRecord inside out
  3. Support other “shrink-wrapped” Rails projects with similar needs

As can be seen, the main reason I need Ackbar is so I distribute Pimki
across
multiple platforms without requiring non-Ruby 3rd party libraries.
KirbyBase will
work wherever Ruby works, and so will Pimki. That alleviates the need
to repackage
other bits, end users will not have to install extra software, I have
full control
on the storage, the storage is in plain text. Just what I need to
“shrink wrap”
a Rails project for end-user distribution.

= What’s Covered

Ackbar currently passes through a small bootstrap test suite, and
through about
80% of the ActiveRecord test suite. I will never pass 100% of the tests
because
KirbyBase does not support all required functionality.

Ackbar includes a SQL fragment translator, so that simple cross-database
code
should be maintainable. For example the following will work as expected,
Book.find :all, :conditions => “name = ‘Pickaxe’”
Book.find :all, :conditions => [“name = ?”, ‘Pickaxe’]
Additionally, you can also provide blocks:
Book.find :all, :conditions => lambda{|rec| rec.name == ‘Pickaxe’}
or even:
Book.find(:all) {|rec| rec.name == ‘Pickaxe’}

Most of these changes are around the #find method, bit some apply to
#update and
associations. Basic SQL translation should work the same, but you can
always
provide custom code to be used. See the CHANGELOG and the tests for
examples.

= What’s Not Covered

  • Transactions
  • Joins, and therefore Eager Associations
  • Mixins
  • Other plugins

On the todo list is support for mixins. It might even be possible to
rig something
to simulate joins and eager associations, but that is for a later
stage. Transactions
will obviously only be supported once they are supported by KirbyBase.

Additionally, there are numerous little changes to the standard
behaviour. See
the CHANGELOG and the tests for more details. These may cause little
heart attacks
if you expect a standard SQL database.

It is also worth noting that other plugins that write SQL will not
work. You will
need to get a copy of them to your /vendors dir and modify the relevant
parts.

= Installation

Simply:
gem install ackbar
or download the zip file from http://rubyforge.org/projects/ackbar and
just stick
kirbybase_adapter.rb in the Rails lib dir.

You will then need to add
require ‘kirbybase_adapter’
in the config/environment.rb file of your project.

If you plan on multi-database development / deployment, you must
require the adapter
only if necessary:
require ‘kirbybase_adapter’ if
ActiveRecord::Base.configurations[RAILS_ENV][‘adapter’] == ‘kirbybase’

This is because Ackbar overrides certain methods in ActiveRecord::Base
and others.
These methods translate the standard SQL generation to method calls on
KirbyBase,
and obviously should not be overridden for regular DBs.

Please do not hesitate to contact me for questions, comments, whacks
on the head with a clue stick :slight_smile:

Cheers,
Assaph

Wow, best news in a while!

I can’t wait to dig into this. A lot of Ruby love this Valentine Day.

Thank you,
-Harold

Assaph-

This is freaking great! I have been eagerly awaiting to see what you

come up with for the kirbybase adapter. I love kirbybase and the
prospect of a pure ruby db layer is very attractive for some projects
i am working on. I will use this heavily in a project I am working on
so i will get back to you with some feedback and maybe even some
patches :wink:

Thanks for writing this

Cheers-
-Ezra

On Feb 14, 2006, at 4:44 PM, Assaph M. wrote:

= URIs
install DBMS
full control
KirbyBase does not support all required functionality.
Book.find(:all) {|rec| rec.name == ‘Pickaxe’}

in the config/environment.rb file of your project.
KirbyBase,
[email protected]
http://lists.rubyonrails.org/mailman/listinfo/rails

-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper
[email protected]
509-577-7732

Good job, Assaph! I was the one who posted about talking to kirbybase
the other day.

I’m defninitely looking forward to checking this out, though it’s a
little disappointing
that you faced so much trouble because of kirbybase. I guess I can’t
blame the guy for
making his embedded db the way he wanted, but it troubles me to have to
make concesions to
get an embedded db. I think you understand me when I pine for a simple
self-contained db
that one can distribute with their app, ready to go.

You know that strikes me as especially funny given DHH’s recital of the
application db vs.
integration db thing. If we’re making dedicated databases, why even
bother with a server
process at all? Rails should come with an embedded db of some type,
ready to roll. Then we
could just define plain old ruby objects (POROs) and run generators to
whip up some
scaffolding. This would create the tables as needed in the db and we’d
be up and running
after merely writing some dead-simple ruby classes.

It’ll happen… some day. Who knows? Maybe I’ll do it. :slight_smile:

b

Hi Ezra,

On 2/15/06, Ezra Z. [email protected] wrote:

Oh, one more question. Is it possible to use this outside of rails?
Or is it tied in somehow?

It’s tied to ActiveRecord… :slight_smile:
But you can use it in a “console” mode. In fact I used this to play
around with it while developing. Just define the model as you normally
would and call something similar to Rails’ script/console (or write
your own IRB wrapper). But I must say I really don’t see the big
advantage - if you’re not tied to Rails you might as well use KB
directly, or use an ORM layer like Og which wouldn’t have all those
caveats and dark corners.

Cheers,
Assaph

Hi Ben,

Thanks for the kind words.

I’m defninitely looking forward to checking this out, though it’s a little disappointing
that you faced so much trouble because of kirbybase.

Let me just state that Jamey C. was wonderful - he gave me
excellent advise and support and even implemented a few changes I
asked for make this possible. KirbyBase is an excellent piece of
software. It is the way it is because it is the best way for a
pure-Ruby DBMS which doesn’t need SQL. There is an unavoidable
paradigm gap between the two, and any shortcoming is purely on the
side of ackbar, not KirbyBase or Rails.

Cheers,
Assaph

Oh, one more question. Is it possible to use this outside of rails?
Or is it tied in somehow?

-Ezra

On Feb 14, 2006, at 4:44 PM, Assaph M. wrote:

= URIs
install DBMS
full control
KirbyBase does not support all required functionality.
Book.find(:all) {|rec| rec.name == ‘Pickaxe’}

in the config/environment.rb file of your project.
KirbyBase,
[email protected]
http://lists.rubyonrails.org/mailman/listinfo/rails

-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper
[email protected]
509-577-7732

Assaph M. wrote:

= About Ackbar

Ackbar is an adapter for ActiveRecord (the Rails ORM layer) to the KirbyBase
pure-ruby plain-text DBMS. Because KirbyBase does not support SQL, joins or
transactions, this is not a 100% fit. There are some changes to the ActiveRecord
interface (see below), but it may still be useful in some cases.

Congratulations, Assaph! I know you’ve put a lot of hard work into
this.

Jamey C.

I used SqlLite to work through the Nitro+Og tutorial the other day, but
didn’t stop to
read the details. I’ll have to check it out some more. Thanks!

I guess ultimately I’m trying to move all my comfy Java furniture into
my new Ruby
apartment… having an embedded db like HSQLDB to include “in process”
is just sweet.

b

Assaph-

I am trying to play with ackbar right now. What is the syntax for

database.yml in order to use the kirbybase adapter? Can you give me a
sample please?

Thanks-
-Ezra

I only just found out myself that this is the space that Sqlite fills

  • it’s a single file DB that’s perfect for a specific set of uses
    (notably embedded apps, but that’s not all). I’d seen info about
    others using Sqlite with Rails, but I’d just pushed that info to one
    side on the incorrect assumption that Sqlite was yet another
    MySQL/Postgres/Firebird/…-like FOSS database with no real compelling
    reason for me personally to switch from my favorite Postgres.

If you aren’t already across Sqlite, give it a look and see what you
think.

Regards

Dave M.

    I am trying to play with ackbar right now. What is the syntax for

database.yml in order to use the kirbybase adapter? Can you give me a
sample please?

That’s a simple one to answer:

development:
adapter: kirbybase
database: db/dev_db

Te database should point to a directory, in which KirbyBase will store
the .tbl files. There are a few other options that can be passed to
KB, but essentially this is what I used for testing.

Cheers,
Assaph

On Feb 15, 2006, at 4:14 PM, Assaph M. wrote:

Te database should point to a directory, in which KirbyBase will store
the .tbl files. There are a few other options that can be passed to
KB, but essentially this is what I used for testing.

Cheers,
Assaph

Thats what I thought and i already have that but I still get this
stack trace when i try to do anything with the db:

ezra:~/book/kirby ez$ script/generate migration initial_schema
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/
connection_adapters/abstract/connection_specification.rb:79:in
establish_connection': database configuration specifies nonexistent kirbybase adapter (ActiveRecord::AdapterNotFound) from /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/ active_record/connection_adapters/abstract/ connection_specification.rb:71:inestablish_connection’
from /usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/
active_record/connection_adapters/abstract/
connection_specification.rb:66:in establish_connection' from /usr/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/ initializer.rb:169:ininitialize_database’
from /usr/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/
initializer.rb:83:in process' from /usr/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/ initializer.rb:42:insend’
from /usr/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/
initializer.rb:42:in run' from ./script/../config/../config/environment.rb:10 from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb: 18:inrequire
_’
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
18:in require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.2.5/lib/ active_support/dependencies.rb:214:inrequire’
from /usr/lib/ruby/gems/1.8/gems/rails-1.0.0/lib/commands/
generate.rb:1
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
18:in require__' from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb: 18:inrequire’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.2.5/lib/
active_support/dependencies.rb:214:in `require’
from script/generate:3

Clues? Do i need to bootstrap the db somehow before I just make an
intial schema or what?

Thanks
-Ezra

ezra:~/_book/kirby ez$ script/generate migration initial_schema
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/
connection_adapters/abstract/connection_specification.rb:79:in
`establish_connection’: database configuration specifies nonexistent
kirbybase adapter (ActiveRecord::AdapterNotFound)

Have you require’d kirbybase_adapter? You need to add the require in
the config/environment.rb.

On Feb 15, 2006, at 5:09 PM, Assaph M. wrote:

ezra:~/_book/kirby ez$ script/generate migration initial_schema
/usr/lib/ruby/gems/1.8/gems/activerecord-1.13.2/lib/active_record/
connection_adapters/abstract/connection_specification.rb:79:in
`establish_connection’: database configuration specifies nonexistent
kirbybase adapter (ActiveRecord::AdapterNotFound)

Have you require’d kirbybase_adapter? You need to add the require in
the config/environment.rb.

Yeah I tried that. I have the gem installed and I even tried putting
the kirbybase_adapter.rb in lib and it still didn’t work same trace.
Anyway, I’ll keep playing with it, I’m sure I’ll figure it out.

Cheers-
-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper

[email protected]
blog: http://brainspl.at

Have you require’d kirbybase_adapter? You need to add the require in
the config/environment.rb.

Yeah I tried that. I have the gem installed and I even tried putting
the kirbybase_adapter.rb in lib and it still didn’t work same trace.
Anyway, I’ll keep playing with it, I’m sure I’ll figure it out.

D’oh! My bad - forgot to mention you should require the file before
the Rails::Initializer.run is called, or inside the config section.
When I was testing it was a slightly different configuration. Mode
docos and updates soon.

HTH,
Assaph