module Backup
  module Database
    class SQLite < Base
      class Error < Backup::Error; end

      ##
      # Path to the sqlite3 file
      attr_accessor :path

      ##
      # Path to sqlite utility (optional)
      attr_accessor :sqlitedump_utility

      ##
      # Creates a new instance of the SQLite adapter object
      def initialize(model, database_id = nil, &block)
        super
        instance_eval(&block) if block_given?

        @sqlitedump_utility ||= utility(:sqlitedump)
      end

      ##
      # Performs the sqlitedump command and outputs the
      # data to the specified path based on the 'trigger'
      def perform!
        super

        dump = "echo '.dump' | #{sqlitedump_utility} #{path}"

        pipeline = Pipeline.new
        dump_ext = "sql"

        pipeline << dump
        if model.compressor
          model.compressor.compress_with do |command, ext|
            pipeline << command
            dump_ext << ext
          end
        end

        pipeline << "cat > '#{File.join(dump_path, dump_filename)}.#{dump_ext}'"

        pipeline.run

        if pipeline.success?
          log!(:finished)
        else
          raise Error,
            "#{database_name} Dump Failed!\n" + pipeline.error_messages
        end
      end
    end
  end
end
