Sha256: 61b8d25ed166ee56ca71c8ce2421103599b0425c3a816491703413d75a1aee52

Contents?: true

Size: 1.36 KB

Versions: 5

Compression:

Stored size: 1.36 KB

Contents

module SQLite3
  class Database
    def initialize(filename)
      @handle = Pointer.new(::Sqlite3.type)
      @logging = false

      result = sqlite3_open(filename, @handle)
      raise SQLite3Error, sqlite3_errmsg(@handle.value) if result != SQLITE_OK
    end

    def execute(sql, params = nil, &block)
      raise ArgumentError if sql.nil?

      if @logging
        puts "   SQL: #{sql}"
        puts "Params: #{params}" if params && ! params.empty?
      end

      prepare(sql, params) do |statement|
        results = statement.execute

        if block_given?
          results.each do |result|
            yield result
          end
        else
          rows = []

          results.each do |result|
            rows << result
          end

          rows
        end
      end
    end

    def execute_scalar(*args)
      execute(*args).first.values.first
    end

    attr_accessor :logging

    def transaction(&block)
      execute("BEGIN TRANSACTION")

      begin
        result = yield
      rescue
        execute("ROLLBACK TRANSACTION")
        raise
      end

      execute("COMMIT TRANSACTION")

      result
    end

    private

    def prepare(sql, params, &block)
      statement = Statement.new(@handle, sql, params)
      result = nil

      begin
        result = yield statement

      ensure
        statement.finalize
      end

      result
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
motion-sqlite3-1.0.0 lib/motion-sqlite3/database.rb
motion-sqlite3-0.5.3 lib/motion-sqlite3/database.rb
motion-sqlite3-0.5.2 lib/motion-sqlite3/database.rb
motion-sqlite3-0.5.1 lib/motion-sqlite3/database.rb
motion-sqlite3-0.5.0 lib/motion-sqlite3/database.rb