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/strategy_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/experience_run_repository.rb,
lib/aidp/database/repositories/prompt_archive_repository.rb,
lib/aidp/database/repositories/experience_task_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/experience_artifact_repository.rb,
lib/aidp/database/repositories/provider_info_cache_repository.rb,
lib/aidp/database/repositories/experience_evaluation_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



104
105
106
107
108
109
110
111
112
113
114
# File 'lib/aidp/database.rb', line 104

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



117
118
119
120
121
122
123
124
125
# File 'lib/aidp/database.rb', line 117

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



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/aidp/database.rb', line 28

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

  @mutex.synchronize do
    invalidate_missing_connection!(db_path)

    # 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



82
83
84
# File 'lib/aidp/database.rb', line 82

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



56
57
58
59
# File 'lib/aidp/database.rb', line 56

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

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

Run pending migrations at most once per process for each project directory.

Parameters:

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

    Project directory path

Returns:

  • (Array<Integer>)

    List of applied migration versions



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

def migrate_once!(project_dir = Dir.pwd)
  expanded_project_dir = File.expand_path(project_dir)
  require_relative "database/migrations"

  @migration_mutex.synchronize do
    return [] if migration_current?(expanded_project_dir)

    migrate!(expanded_project_dir).tap do
      @migrated_projects << expanded_project_dir
    end
  end
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)



90
91
92
93
94
95
96
97
98
99
# File 'lib/aidp/database.rb', line 90

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



132
133
134
135
136
137
# File 'lib/aidp/database.rb', line 132

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