SofiaDB#
La base de datos SQL propia de Sofía: embebida, privada por app, sin dependencias de terceros. Esta es la entrada única; los diseños de cada hito se citan al final.
Consejo
En corto: un archivo de datos más su diario (WAL), páginas de 8 KiB con suma de verificación, transacciones serializables con reintento, copia en caliente y cifrado por página. Lo confirmado sobrevive a un corte de luz. La app la usa con datos.* y transaccion { }; quien opera, con sofia datos ….
1. Hecho en main#
| Hito | Qué trae | Commit |
|---|---|---|
| D1 | Motor embebido: páginas, árbol B+, WAL, SQL básico, pruebas de corte de luz | e16f97c |
| D2a–D2b | Índices, restricciones (UNIQUE, CHECK), varias tablas y JOIN | 68f3168, 32bcd8f |
| D2c–D2d | Varios escritores a la vez (MVCC serializable con reintento), claves foráneas, bloque transaccion { } | 98f963f |
| Grupo | Confirmación en grupo con un solo fsync | e933395 |
| Autoincremental | Clave INTEGER sin valor toma la siguiente; INSERT OR REPLACE y OR IGNORE | e6a2fa8 |
| Copia en caliente | datos.copiar y sofia datos copiar | 1c45fad |
| R0 | Acceso remoto de solo lectura para personas con permiso | d4a41c6 |
| D3a | Formato 4: cifrado por página con clave maestra | a9d1c24 |
| D3b | Claves por inquilino con envolturas en el prólogo, cifrar una base existente, rotación y borrado de claves | ec9a55d |
2. Formato en disco#
- Versiones 1 a 4: la 1 es la de D1; la 2 guarda índices y restricciones; la 3 guarda claves foráneas; la 4 es cifrada. Un archivo nuevo usa la mínima que necesita.
- Páginas de 8 192 bytes, cada una con una suma de verificación CRC-32C: una página dañada se detecta, no se interpreta.
- Formato 4: cada página va sellada con cifrado autenticado y una clave maestra; leer con otra clave, o una base cifrada sin clave, da
CLAVE_INVALIDAoCLAVE_REQUERIDA. - Un archivo de datos y su diario (
base.sdbybase.sdb-wal). El diario tiene puntos de control que lo mantienen acotado.
3. Garantías#
- Durabilidad: al terminar una confirmación, el diario ya está en el disco físico. Las pruebas cortan la corriente en un disco simulado en cada escritura y sincronización posible y exigen que la base abra, pase su verificación y tenga exactamente lo confirmado.
- Aislamiento: transacciones serializables sobre instantáneas (MVCC); los lectores no esperan a los escritores. Si dos transacciones chocan, una falla con
CONFLICTO_SERIALIZACIONy el bloquetransaccion { }se repite solo. - Copia:
Base::copiarentrega exactamente lo confirmado al empezar, entera y verificada, o nada. - Privacidad: cada app abre solo su propia base; el acceso remoto exige persona, permiso explícito y vencimiento, y queda auditado.
4. Uso desde un programa#
permiso datos
fn reservar(prof: texto, hora: entero) -> texto {
var r = "RESERVADA"
intentar {
transaccion {
let choca = datos.entero($"SELECT count(*) FROM cita WHERE profesional = {prof} AND inicio = {hora}")
si choca > 0 { fallar("HORA_OCUPADA") }
datos.ejecutar($"INSERT INTO cita (profesional, inicio) VALUES ({prof}, {hora})")
}
} si falla e {
r = e
}
devolver r
}
| Función | Para qué |
|---|---|
datos.ejecutar(sql) | Sentencias que cambian datos; devuelve las filas afectadas |
datos.consultar(Registro, sql) | Filas como registros tipados |
datos.entero(sql) · datos.texto(sql) | Un valor suelto |
datos.copiar(nombre) | Copia en caliente a la carpeta privada |
transaccion { } | Todo junto o nada; se repite ante un conflicto |
Los valores van siempre entre { } y viajan aparte como parámetros. Referencia completa: SofiaDB desde el lenguaje; tutorial: capítulo 21.
5. Línea de órdenes#
| Orden | Qué hace |
|---|---|
sofia datos copiar <base o id de app> <destino> | Copia en caliente de una base libre; si la sirve Atrio, se pide a la app |
sofia datos claves iniciar|estado|rotar|exportar|importar | Maestra del nodo: crearla, ver su estado, cambiarla, exportarla y recuperarla |
sofia datos cifrar <base> [--sin-cifrar] | Cifra una base (o la deja sin cifrar) |
sofia datos rotar <base> | Cambia la clave de datos de una base, en caliente |
sofia datos borrar <base> | Borrado criptográfico, sin vuelta atrás |
sofia datos alta --persona <n> --vence 90d | Da de alta a una persona para el acceso remoto |
sofia datos permiso --persona <n> leer <base>.* --vence 30d | Concede lectura acotada |
sofia datos revocar --persona <n> | Revoca a una persona o a un dispositivo y cierra sus sesiones |
sofia datos personas | Lista personas y permisos |
sofia datos auditoria | Muestra las consultas hechas |
Detalle de cada orden: SOFIADB-CLI. Acceso remoto: SOFIADB-REMOTO.
6. SQL de esta versión#
Es un subconjunto del SQL estándar, en inglés, sin NULL.
| Grupo | Qué hay |
|---|---|
| Tablas | CREATE TABLE [IF NOT EXISTS] con PRIMARY KEY, NOT NULL, DEFAULT, UNIQUE, CHECK; DROP TABLE; ALTER TABLE … ADD COLUMN … DEFAULT …; CREATE [UNIQUE] INDEX |
| Cambios | INSERT (varias filas), INSERT OR REPLACE, INSERT OR IGNORE, UPDATE, DELETE |
| Consultas | SELECT con WHERE, ORDER BY, LIMIT/OFFSET, GROUP BY/HAVING; count, sum, min, max; JOIN y LEFT JOIN; subconsultas, IN, EXISTS; EXPLAIN |
| Claves foráneas | REFERENCES con RESTRICT o NO ACTION; no hay ON DELETE CASCADE |
| Tipos | INTEGER, TEXT, BOOLEAN, BYTEA, NUMERIC(p,s), TIMESTAMPTZ (o ENTERO, TEXTO, LOGICO, BYTES, DECIMAL, INSTANTE) |
7. Errores#
El mensaje empieza por un código estable, que la app puede reconocer sin depender del resto del texto.
| Código | Cuándo |
|---|---|
UNICO_VIOLADO:<índice> | Valor repetido en una columna única |
FORANEA_VIOLADA:<restricción> | La fila referenciada no existe o aún tiene hijas |
COMPROBAR_VIOLADO:<restricción> | Falla un CHECK |
CONFLICTO_SERIALIZACION | Chocó con otra transacción; se repite |
SOLO_LECTURA | Escritura en una sesión de solo lectura |
TIEMPO_AGOTADO · CANCELADA | La consulta superó su tiempo o se canceló |
CLAVE_REQUERIDA · CLAVE_INVALIDA | Base cifrada abierta sin clave o con otra |
8. En desarrollo#
Solo lo que está en rama, sin fechas:
- R1 y R2: escritura, DDL y auditoría ampliada del acceso remoto.
9. Enlaces#
- Referencia de SQL: SQL-SOFIADB. Línea de órdenes: SOFIADB-CLI. Acceso remoto: SOFIADB-REMOTO. Desde el lenguaje: SOFIADB-LENGUAJE.