# ER図

## 概要

Doom Emacs は従来のリレーショナルデータベースを使用していないため、厳密な意味での ER 図（Entity-Relationship Diagram）は適用されません。

本ドキュメントでは、Doom Emacs で使用されているデータストレージの構造を、概念的なエンティティ関係として Mermaid 形式で表現します。

## データストア構造図

```mermaid
erDiagram
    DOOM_STORE {
        any key PK "エントリを識別するキー"
        any value "保存される値"
        time_or_int_or_func ttl "有効期限（nil可）"
    }

    DOOM_STORE_LOCATION {
        string location PK "ストアの論理名"
        string file_path "実際のファイルパス"
    }

    DOOM_STORE_PERSIST_ALIST {
        symbol location PK "永続化対象のロケーション"
        list variables "永続化する変数のリスト"
    }

    SESSION_STORE {
        string session_file PK "セッションファイルパス"
        string backend "バックエンド種別（persp/desktop）"
    }

    PERSPECTIVE {
        string name PK "パースペクティブ名"
        list buffers "所属バッファリスト"
        list windows "ウィンドウ配置"
    }

    DESKTOP_STATE {
        string file PK "デスクトップファイル"
        frameset frames "フレーム状態"
        list buffers "バッファリスト"
    }

    DOOM_STORE_LOCATION ||--o{ DOOM_STORE : "contains"
    DOOM_STORE_PERSIST_ALIST ||--o{ DOOM_STORE : "references"
    SESSION_STORE ||--o| PERSPECTIVE : "uses (persp-mode)"
    SESSION_STORE ||--o| DESKTOP_STATE : "uses (desktop-mode)"
```

## データフロー図

```mermaid
flowchart TB
    subgraph "Doom Store System"
        A[doom-store-put] --> B[doom--store-init]
        B --> C{Hash Table Exists?}
        C -->|No| D[Load from file or create new]
        C -->|Yes| E[Use existing table]
        D --> E
        E --> F[puthash key/value]
        F --> G{noflush?}
        G -->|No| H[doom--store-flush]
        G -->|Yes| I[Skip flush]
        H --> J[Write to file]
    end

    subgraph "Session System"
        K[doom-save-session] --> L{Backend?}
        L -->|persp-mode| M[persp-save-state-to-file]
        L -->|desktop| N[desktop-save]

        O[doom-load-session] --> P{Backend?}
        P -->|persp-mode| Q[persp-load-state-from-file]
        P -->|desktop| R[desktop-read]
    end

    subgraph "Persistence Lifecycle"
        S[Emacs Startup] --> T[Load stores on demand]
        U[doom-store-put/get] --> V[Automatic flush]
        W[Emacs Exit] --> X[doom-save-persistent-store-h]
        X --> Y[Persist all registered variables]
        X --> Z[Clean expired entries]
    end
```

## ストレージ階層図

```mermaid
graph TB
    subgraph "File System Layer"
        F1["doom-profile-data-dir/store/"]
        F2["doom-profile-data-dir/store/default"]
        F3["doom-profile-data-dir/store/{location}"]
        F4["persp-save-dir/{session-file}"]
        F5["desktop-dirname/{desktop-file}"]
    end

    subgraph "Memory Layer"
        M1["doom--store-table (hash-table)"]
        M2["location -> hash-table mapping"]
        M3["key -> (ttl . value) mapping"]
    end

    subgraph "API Layer"
        A1["doom-store-get"]
        A2["doom-store-put"]
        A3["doom-store-rem"]
        A4["doom-store-persist"]
    end

    A1 --> M1
    A2 --> M1
    A3 --> M1
    A4 --> M1

    M1 --> M2
    M2 --> M3

    M2 -.->|serialize| F2
    M2 -.->|serialize| F3

    F1 --> F2
    F1 --> F3
```

## 備考

- 上記の ER 図は概念的なものであり、実際には Emacs Lisp のハッシュテーブルとリストで実装されている
- `doom-store` のキーは `equal` で比較可能な任意の Lisp オブジェクト（文字列、シンボル、リスト等）
- セッションストアは persp-mode と desktop モードの2つのバックエンドをサポートしており、インストール状況に応じて自動選択される
