Baffled by error


#1

I am playing around… I am a ruby newbie. I am encountering an error
I can’t figure out. Probably something very silly I am doing wrong…

I have a class called “Artist” (I’ll attach it below) that tries to
open an SQLite3 database and load a row into itself.

As I code I keep a “test.rb” around to try things out. In the test.rb
I require, open and execute a query successfully. I add a reference to
my class and try its load method and get this:

Mitchs-iMac-G5:~/Desktop/Projects/ArtManagerRuby mike$ ruby test.rb
1
Painting
Landscape
Oil
Canvas
Farmlands
This is a comment
3
Painting
Landscape
Watercolor
Paper
She kicks ASS!
Not only is her artwork the best, she is my wife!
4
Sketch
Landscape
Crayon
Paper
Loves the beach!
This guy can color with crayola crayons like nobody I have ever seen!
“stuff”
“done!”
“nope”
true
“yah baby!”
“this is a catenated string”
/opt/local/lib/ruby/vendor_ruby/1.8/sqlite3/database.rb:619:in
const_get': uninitialized constant SQLite3::Driver::Native (NameError) from /opt/local/lib/ruby/vendor_ruby/1.8/sqlite3/database.rb:619:inload_driver’
from
/opt/local/lib/ruby/vendor_ruby/1.8/sqlite3/database.rb:616:in each' from /opt/local/lib/ruby/vendor_ruby/1.8/sqlite3/database.rb:616:inload_driver’
from
/opt/local/lib/ruby/vendor_ruby/1.8/sqlite3/database.rb:107:in
initialize' from ./artist.rb:100:innew’
from ./artist.rb:100:in `load’
from test.rb:41


(The output at first is the successful accessing of the database, the
error is when I call the load method of my class)

Here is the test.rb file:

require ‘sqlite3’
require ‘db_base’
require ‘artist’

db = SQLite3::Database.new( DB_Base::DB_DATA )

db.execute( “select * from artists” ) do |row|
puts row
end

db.close

class Foo
def bar(gibberish=nil)
p gibberish
rescue
p ‘Ppppffftt!’
ensure
p ‘done!’
end
end

foo = Foo.new
foo.bar(‘stuff’)

some_val = nil
if !some_val
p “nope”
else
p “yep!”
end

some_val = “y”
some_other_val = “y”
p (some_val == some_other_val)
p “yah baby!” if some_val == some_other_val
p 'this is a ’ +
‘catenated string’

a = Artist.new()
a.load(1)
puts a.to_s


Here is the Artist class in artist.rb:

require ‘sqlite3’
require ‘db_base’

class Artist
# Define our class constants here. Class constants are
# immutable variables accessible by every instance of this
# class.

QRY_SELECT = 'select form, category, media, mediasupport,' +
             'topic, comments from artists were id = ?'

QRY_INSERT = 'insert into artists(form, category, media,' +
             'mediasupport, topic, comments) ' +
             'values(?, ?, ?, ?, ?, ?)'

QRY_UPDATE = 'update artists set form = ?, category = ?, ' +
             'media = ?, mediasupport = ?, topic = ?, comments = ? ' 
  •            'where id = ?'
    

    QRY_DELETE = ‘delete from artists where id = ?’

    These are our accessors. They define our

    class data and their visibility. In this

    case we are declaring the ability of these

    items to be read.

    attr_reader :id, :form, :category, :media
    attr_reader :media_support, :topic, :comments
    attr_accessor :dirty, :added

    Only the class itself can reference these.

    protected :dirty, :added

    Our constructor takes all arguments. It also

    determines whether or not this item is new or

    existing.

    def initialize(id=nil, form=nil, category=nil, media=nil,
    media_support=nil, topic=nil, comments=nil)
    @dirty = false
    @added = false

      @form = form
      @category = category
      @media = media
      @media_support = media_support
      @topic = topic
      @comments = comments
    
      @added = true if !id
    

    end

    We manually program our writers (class values)

    because we need to check whether or not our values

    have actually changed. If they do, we mark our

    class object as “dirty”.

    def id=(id)
    @dirty = true if id != @id
    @id = id
    end

    def form=(form)
    @dirty = true if form != @form
    @form = form
    end

    def category=(category)
    @dirty = true if category != @category
    @category = category
    end

    def media=(media)
    @dirty = true if media != @media
    @media = media
    end

    def media_support=(media_support)
    @dirty = true if media_support != @media_support
    @media_support = media_support
    end

    def topic=(topic)
    @dirty = true if topic != @topic
    @topic = topic
    end

    def comments=(comments)
    @dirty = true if comments != @comments
    @comments = comments
    end

    The rest of these are our methods for loading,

    saving and clearing out our object.

    def load(id)
    db = SQLite3::Database.new(DB_Base::DB_DATA)
    db.execute(QRY_SELECT, id) do |row|
    @form = row[0]
    @category = row[1]
    @media = row[2]
    @media_support = row[3]
    @topic = row[4]
    @comments = row[5]
    end
    @id = id
    @dirty = false
    @added = false
    db.close
    end

    def store
    if @dirty or @added
    db = SQLite3::Database.new(DB_Base::DB_DATA)

          if @added
              db.execute(QRY_INSERT,
                         @form, @category, @media, @media_support,
                         @topic, @comments )
              @id = db.last_insert_row_id
              @added = false
          elsif @dirty
              db.execute(QRY_UPDATE,
                         @form, @category, @media, @media_support,
                         @topic, @comments, @id )
              @dirty = false
          end
      end
    

    ensure
    db.close unless db.closed?
    end

    def kill
    db = SQLite3::Database.new(DB_Base::DB_DATA)
    db.execute(QRY_DELETE, @id)
    ensure
    db.close unless db.closed?
    end

    def to_s
    “Form : #{@form}\nMedia: #{@media}/#{@media_support}”
    end
    end


This is db_base.rb…

module DB_Base
# Base database info. Keeps constants that identify
# our databases.

DB_DATA = '/Library/Application Support/ArtManager/ArtManager.db'
DB_IMAGES = '/Library/Application Support/ArtManager/Images.db'

end


#2

Nevermind. I did a little Googling and found another example of the
error, and the solution was to upgrade my version of ruby-sqlite3 from
…9 to 1.1.