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#

HitoQué traeCommit
D1Motor embebido: páginas, árbol B+, WAL, SQL básico, pruebas de corte de luze16f97c
D2a–D2bÍndices, restricciones (UNIQUE, CHECK), varias tablas y JOIN68f3168, 32bcd8f
D2c–D2dVarios escritores a la vez (MVCC serializable con reintento), claves foráneas, bloque transaccion { }98f963f
GrupoConfirmación en grupo con un solo fsynce933395
AutoincrementalClave INTEGER sin valor toma la siguiente; INSERT OR REPLACE y OR IGNOREe6a2fa8
Copia en calientedatos.copiar y sofia datos copiar1c45fad
R0Acceso remoto de solo lectura para personas con permisod4a41c6
D3aFormato 4: cifrado por página con clave maestraa9d1c24
D3bClaves por inquilino con envolturas en el prólogo, cifrar una base existente, rotación y borrado de clavesec9a55d

2. Formato en disco#

3. Garantías#

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ónPara 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#

OrdenQué 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|importarMaestra 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 90dDa de alta a una persona para el acceso remoto
sofia datos permiso --persona <n> leer <base>.* --vence 30dConcede lectura acotada
sofia datos revocar --persona <n>Revoca a una persona o a un dispositivo y cierra sus sesiones
sofia datos personasLista personas y permisos
sofia datos auditoriaMuestra 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.

GrupoQué hay
TablasCREATE TABLE [IF NOT EXISTS] con PRIMARY KEY, NOT NULL, DEFAULT, UNIQUE, CHECK; DROP TABLE; ALTER TABLE … ADD COLUMN … DEFAULT …; CREATE [UNIQUE] INDEX
CambiosINSERT (varias filas), INSERT OR REPLACE, INSERT OR IGNORE, UPDATE, DELETE
ConsultasSELECT con WHERE, ORDER BY, LIMIT/OFFSET, GROUP BY/HAVING; count, sum, min, max; JOIN y LEFT JOIN; subconsultas, IN, EXISTS; EXPLAIN
Claves foráneasREFERENCES con RESTRICT o NO ACTION; no hay ON DELETE CASCADE
TiposINTEGER, 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ódigoCuá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_SERIALIZACIONChocó con otra transacción; se repite
SOLO_LECTURAEscritura en una sesión de solo lectura
TIEMPO_AGOTADO · CANCELADALa consulta superó su tiempo o se canceló
CLAVE_REQUERIDA · CLAVE_INVALIDABase cifrada abierta sin clave o con otra

8. En desarrollo#

Solo lo que está en rama, sin fechas:

9. Enlaces#