package aceboot::orm.sqlite

import aceboot::orm.common.*

/** SQLite 方言:占位 "?",自增 `INTEGER PRIMARY KEY AUTOINCREMENT`。 */
public class SqliteDialect <: Dialect {
    public func placeholder(_: Int64): String {
        "?"
    }
    public func usesReturning(): Bool {
        false
    }
    public func sqlType(t: DbType): String {
        match (t) {
            case TInt => "INTEGER"
            case TBool => "INTEGER"
            case TReal => "REAL"
            case TText => "TEXT"
            case TDateTime => "INTEGER"
            case TDate => "INTEGER"
            case TJson => "TEXT"
            case TBlob => "BLOB"
            case TDecimal => "TEXT"
        }
    }
    public func createTable(table: String, cols: Array<ColumnSpec>, checks: Array<CheckSpec>): String {
        buildCreateTable(table, cols, {name => name + " INTEGER PRIMARY KEY AUTOINCREMENT"}, {t => sqlType(t)},
            checks: checks)
    }
    public func createIndex(table: String, idx: IndexSpec): String {
        buildCreateIndex(table, idx, true)
    }
    public func upsertClause(conflictColumns: Array<String>, updateColumns: Array<String>): String {
        onConflictClause(conflictColumns, updateColumns)
    }
    public func introspectTableExists(table: String): (String, Array<DbValue>) {
        ("SELECT name FROM sqlite_master WHERE type='table' AND name = " + placeholder(0), [DbText(table)])
    }
    public func introspectColumns(table: String): (String, Array<DbValue>) {
        ("PRAGMA table_info(" + table + ")", [])
    }
    public func introspectColumnTypes(table: String): (String, Array<DbValue>) {
        // PRAGMA table_info 每行天然含 name/type 列。
        ("PRAGMA table_info(" + table + ")", [])
    }
    // SQLite 不支持原地改列类型 → 沿用默认 None / columnTypeMatches=true(best-effort 跳过)。
    // DROP COLUMN 沿用默认(SQLite 3.35+ 支持)。
    // SQLite 无行级锁(库级锁),悲观锁子句退化为空。
    public func lockClause(_: String): String {
        ""
    }
}