Module: Aidp::Database

Defined in:
lib/aidp/database.rb,
lib/aidp/database/schema.rb,
lib/aidp/database/migrations.rb,
lib/aidp/database/repository.rb,
lib/aidp/database/storage_migrator.rb,
lib/aidp/database/repositories/job_repository.rb,
lib/aidp/database/repositories/task_repository.rb,
lib/aidp/database/repositories/secrets_repository.rb,
lib/aidp/database/repositories/progress_repository.rb,
lib/aidp/database/repositories/worktree_repository.rb,
lib/aidp/database/repositories/checkpoint_repository.rb,
lib/aidp/database/repositories/evaluation_repository.rb,
lib/aidp/database/repositories/workstream_repository.rb,
lib/aidp/database/repositories/model_cache_repository.rb,
lib/aidp/database/repositories/watch_state_repository.rb,
lib/aidp/database/repositories/harness_state_repository.rb,
lib/aidp/database/repositories/prompt_archive_repository.rb,
lib/aidp/database/repositories/prompt_feedback_repository.rb,
lib/aidp/database/repositories/provider_metrics_repository.rb,
lib/aidp/database/repositories/template_version_repository.rb,
lib/aidp/database/repositories/deprecated_models_repository.rb,
lib/aidp/database/repositories/provider_info_cache_repository.rb

Overview

Database module for SQLite-based storage Provides connection management, schema migrations, and base repository functionality

Defined Under Namespace

Modules: Migrations, Repositories, Schema Classes: ConnectionError, Error, MigrationError, Repository, StorageMigrator

Class Method Summary collapse

Class Method Details

.close(project_dir = Dir.pwd) ⇒ Object

Close connection for a specific project

Parameters:

  • project_dir (String) (defaults to: Dir.pwd)

    Project directory path



82
83
84
85
86
87
88
89
90
91
92
# File 'lib/aidp/database.rb', line 82

def close(project_dir = Dir.pwd)
  db_path = ConfigPaths.database_file(project_dir)

  @mutex.synchronize do
    if @connections[db_path] && !@connections[db_path].closed?
      @connections[db_path].close
      Aidp.log_debug("database", "connection_closed", path: db_path)
    end
    @connections.delete(db_path)
  end
end

.close_allObject

Close all open connections



95
96
97
98
99
100
101
102
103
# File 'lib/aidp/database.rb', line 95

def close_all
  @mutex.synchronize do
    @connections.each do |path, db|
      db.close unless db.closed?
      Aidp.log_debug("database", "connection_closed", path: path)
    end
    @connections.clear
  end
end

.connection(project_dir = Dir.pwd) ⇒ SQLite3::Database

Get or create a database connection for the given project directory Connections are cached per project_dir and are thread-safe

Parameters:

  • project_dir (String) (defaults to: Dir.pwd)

    Project directory path

Returns:

  • (SQLite3::Database)

    Database connection



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/aidp/database.rb', line 25

def connection(project_dir = Dir.pwd)
  db_path = ConfigPaths.database_file(project_dir)

  @mutex.synchronize do
    # Return cached connection if valid
    if @connections[db_path]&.closed? == false
      return @connections[db_path]
    end

    # Ensure directory exists
    FileUtils.mkdir_p(File.dirname(db_path))

    # Create new connection with optimal settings
    db = SQLite3::Database.new(db_path)
    configure_connection(db)

    @connections[db_path] = db
    Aidp.log_debug("database", "connection_opened", path: db_path)
    db
  end
end

.exists?(project_dir = Dir.pwd) ⇒ Boolean

Check if database exists and is initialized

Parameters:

  • project_dir (String) (defaults to: Dir.pwd)

    Project directory path

Returns:

  • (Boolean)

    True if database exists



60
61
62
# File 'lib/aidp/database.rb', line 60

def exists?(project_dir = Dir.pwd)
  File.exist?(ConfigPaths.database_file(project_dir))
end

.migrate!(project_dir = Dir.pwd) ⇒ Array<Integer>

Run pending migrations for the given project

Parameters:

  • project_dir (String) (defaults to: Dir.pwd)

    Project directory path

Returns:

  • (Array<Integer>)

    List of applied migration versions



51
52
53
54
# File 'lib/aidp/database.rb', line 51

def migrate!(project_dir = Dir.pwd)
  require_relative "database/migrations"
  Migrations.run!(project_dir)
end

.schema_version(project_dir = Dir.pwd) ⇒ Integer

Get current schema version

Parameters:

  • project_dir (String) (defaults to: Dir.pwd)

    Project directory path

Returns:

  • (Integer)

    Current schema version (0 if not initialized)



68
69
70
71
72
73
74
75
76
77
# File 'lib/aidp/database.rb', line 68

def schema_version(project_dir = Dir.pwd)
  return 0 unless exists?(project_dir)

  db = connection(project_dir)
  result = db.get_first_value("SELECT MAX(version) FROM schema_migrations")
  result || 0
rescue SQLite3::SQLException
  # Table doesn't exist yet
  0
end

.transaction(project_dir = Dir.pwd) {|db| ... } ⇒ Object

Execute a block within a transaction

Parameters:

  • project_dir (String) (defaults to: Dir.pwd)

    Project directory path

Yields:

  • (db)

    Block to execute within transaction

Returns:

  • (Object)

    Result of the block



110
111
112
113
114
115
# File 'lib/aidp/database.rb', line 110

def transaction(project_dir = Dir.pwd)
  db = connection(project_dir)
  db.transaction do
    yield db
  end
end