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 {
""
}
}