Arch — Design Técnico
Gerado pelo Writer (Reversa) em 2026-05-11
Inicialização do Banco (Singleton)
Banco.instance()
→ database !== undefined → retorna diretamente
→ initializingPromise !== undefined → aguarda Promise
→ initializingPromise = initialize()
→ AssetDatabasePreparator.prepare('cantaIgreja.db')
→ moveAssetsDatabase (native) / copia (web)
→ openAsync(nome, { location: strategy.databasePath })
→ MigrationsRepository.runMigrations(db)
→ PRAGMA user_version
→ para v em pending: executa SQL + fn opcional + PRAGMA user_version = v
→ BibliotecaSugestoesRepertorioRepository.popularSugestoesIniciais()
→ Banco.database = db
BancoHooks — ATTACH/DETACH por Plataforma
Native (MobileBancoHooks)
attach(instancia, dbFileName, alias, path?) {
instancia.attach({ secondaryDbFileName, alias, location? })
}
detach(instancia, alias) {
instancia.detach(alias)
}
Web (WebBancoHooks) — com validação de segurança
attach(instancia, dbFileName, alias) {
assertSafeSqliteIdentifier(alias) // /^[A-Za-z_][A-Za-z0-9_]*$/
assertSafeSqliteFileName(dbFileName) // /^[A-Za-z0-9._-]+$/
await Banco.execute(`ATTACH DATABASE 'file:${escaped}?vfs=opfs' AS ${alias}`)
}
detach(instancia, alias) {
assertSafeSqliteIdentifier(alias)
await Banco.execute(`DETACH DATABASE ${alias}`)
}
Pipeline de Migrations
MigrationsRepository.runMigrations(db):
versaoAtual = PRAGMA user_version
para cada migration (v) em ordem crescente:
se versaoAtual < v:
execute SQL da migration
se migration.fn: await migration.fn(db)
PRAGMA user_version = v
versaoAtual = v
API Pública do Banco
| Método | Assinatura | Observação |
|---|---|---|
execute |
(query, params?) → QueryResult |
Uso geral |
executeBatch |
(queries: SQLBatchTuple[]) → BatchQueryResult |
Múltiplas queries |
prepareStatement |
(query) → PreparedStatement |
Reutilização |
attachFromCache |
(path, alias) → void |
Download cache |
attachFromAssets |
(dbName, alias) → void |
Asset local |
detach |
(alias) → void |
Cleanup obrigatório |
Segurança
- Web: regex impede SQL injection em
ATTACH DATABASEvia alias e filename - Native:
instancia.attach()usa API tipada — sem interpolação de string WebBancoHooks.escapeSqliteStringLiteralescapa'→''no filename
Riscos e Lacunas
- 🟡 Migrations v12 e v14 não lidas completamente — SQL não documentado aqui
- 🟡
AssetDatabasePreparatornão lido — lógica de cópia do asset não confirmada - 🟡 Web OPFS:
cachePathvirtual — comportamento deattachFromCachena web não totalmente mapeado (ver repo memoryop-sqlite-web-attach-workaround.md) - 🔴 Singleton sem reset — testes unitários podem ter contaminação de estado entre testes