# 機能設計書 16-SQLite アダプター

## 概要

本ドキュメントは、Payload CMSにおけるSQLite アダプター（`@payloadcms/db-sqlite`）の設計を定義する。SQLiteデータベースとの接続、CRUD操作、スキーマ管理をDrizzle ORMを通じて提供する。

### 本機能の処理概要

SQLite アダプターは、Payload CMSとSQLiteデータベース間のインターフェースを提供するデータベースアダプターである。Drizzle ORMを使用してSQLiteへの接続とスキーマ管理を行い、軽量で高速なローカルデータベースソリューションを提供する。

**業務上の目的・背景**：SQLiteはサーバーレスで動作する軽量データベースであり、別途データベースサーバーの構築が不要。開発環境での迅速なセットアップ、エッジ環境での利用、モバイルアプリのローカルストレージなど、シンプルなデプロイメントが求められるケースに適している。

**機能の利用シーン**：
- 開発・テスト環境での迅速なセットアップ
- 小〜中規模サイトのプロダクション利用
- エッジコンピューティング環境での利用
- Turso（libSQL）との統合
- シングルユーザー/低トラフィックアプリケーション

**主要な処理内容**：
1. 接続管理：SQLiteファイル接続、インメモリDB対応
2. WALモード：Write-Ahead Loggingによる並行処理改善
3. CRUD操作：Drizzle ORM経由のデータ操作
4. マイグレーション：スキーマ変更のマイグレーション生成・実行

**関連システム・外部連携**：
- better-sqlite3 / libSQL
- Turso（エッジSQLite）
- Drizzle ORM

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | （該当なし） | - | データベース層のため画面連携なし |

## 機能種別

データベースアダプター / ORM統合

## 入力仕様

### アダプター設定パラメータ

| パラメータ名 | 型 | 必須 | 説明 | デフォルト |
|-------------|-----|-----|------|-----------|
| client | ClientConfig | Yes | SQLiteクライアント設定 | - |
| idType | 'number' / 'uuid' | No | ID生成タイプ | 'number' |
| allowIDOnCreate | boolean | No | create時にカスタムIDを許可 | false |
| autoIncrement | boolean | No | 自動インクリメントID | false |
| blocksAsJSON | boolean | No | ブロックをJSON列で保存 | false |
| wal | boolean / WalConfig | No | WALモード設定 | false |
| busyTimeout | number | No | ビジー状態のタイムアウト（ms） | 0 |
| localesSuffix | string | No | ロケールテーブルの接尾辞 | '_locales' |
| relationshipsSuffix | string | No | リレーションテーブルの接尾辞 | '_rels' |
| versionsSuffix | string | No | バージョンテーブルの接尾辞 | '_v' |
| transactionOptions | TransactionConfig / false | No | トランザクションオプション | undefined |
| logger | DrizzleConfig['logger'] | No | ロガー設定 | false |

### WAL設定（WalConfig）

| パラメータ名 | 型 | 説明 | デフォルト |
|-------------|-----|------|-----------|
| journalSizeLimit | number | WALファイルサイズ上限 | 64MB |
| synchronous | 'FULL' / 'NORMAL' / 'OFF' | 同期モード | 'FULL' |

## 出力仕様

PayloadのドキュメントフォーマットでJSON形式のデータを返却。

## 処理フロー

### 初期化処理

```
1. sqliteAdapter()呼び出し
   └─ アダプター設定オブジェクトを受け取る

2. WALモード判定
   └─ インメモリDB/TCPの場合はWAL無効化警告

3. 演算子オーバーライド
   └─ SQLiteのlikeは大文字小文字区別なし

4. createDatabaseAdapter()
   └─ 共通アダプターインターフェースでラップ

5. connect()実行
   └─ better-sqlite3でクライアント接続
   └─ WAL設定適用
   └─ drizzle()でDrizzleインスタンス生成
```

## ビジネスルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | IDタイプデフォルト | idType='number'がデフォルト | 全コレクション |
| BR-02 | WAL制限 | インメモリ/TCP接続ではWAL無効 | file:以外のURL |
| BR-03 | like演算子 | SQLiteのlikeは大文字小文字を区別しない | contains、like操作 |
| BR-04 | WALデフォルト | journalSizeLimit=64MB、synchronous='FULL' | wal=true時 |

## パフォーマンス要件

- WALモードによる読み取り/書き込み並行処理
- busyTimeoutによるロック待機制御
- ファイルベースI/Oのため、SSD推奨

## セキュリティ考慮事項

- ファイルシステム権限によるアクセス制御
- データベースファイルの物理的保護

---

## コードリーディングガイド

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `packages/db-sqlite/src/index.ts` | ソース | アダプターエントリーポイント |
| types.ts | `packages/db-sqlite/src/types.ts` | ソース | 型定義 |
| connect.ts | `packages/db-sqlite/src/connect.ts` | ソース | SQLite接続処理 |

### 主要処理フロー

- **68-69行目**: idType、payloadIDType初期化（'number'/'uuid'→'number'/'text'）
- **82-88行目**: SQLite用演算子オーバーライド（like、contains、not_like）
- **90-110行目**: WALモード設定の処理
- **125-228行目**: createDatabaseAdapterでアダプター生成
- **216行目**: packageNameは'@payloadcms/db-sqlite'
