# zcatsql

> SQLite wrapper idiomático para Zig 0.15.2+

Parte del ecosistema **zcat**: `zcatui` (TUI), `zcatgui` (GUI), `zcatsql` (SQLite)

## Estado

**v1.1** | ~12,000 líneas | 16 módulos | 80 tests

## Quick Start

```bash
zig build              # Compilar
zig build test         # Tests (80/80)
./zig-out/bin/basic    # Ejemplo
```

## Arquitectura

```
src/
├── root.zig        # Exports públicos
├── database.zig    # Conexión, transacciones, pragmas, snapshots
├── statement.zig   # Prepared statements, binding, row mapping
├── session.zig     # Change tracking (Session extension)
├── serialize.zig   # Serialize/Deserialize API
├── functions.zig   # UDFs, callbacks, hooks
├── backup.zig      # Backup API, Blob I/O
├── pool.zig        # Connection pool
├── fts5.zig        # Full-text search
├── json.zig        # JSON1 helpers
├── rtree.zig       # R-Tree spatial index
├── vtable.zig      # Virtual tables API
├── types.zig       # Tipos comunes
├── errors.zig      # Mapeo de errores
├── c.zig           # C bindings
└── audit/          # Sistema de auditoría
    ├── mod.zig     # Exports
    ├── log.zig     # AuditLog principal
    ├── entry.zig   # Entry + JSON
    ├── context.zig # User/app context
    ├── index.zig   # File index
    ├── writer.zig  # File rotation
    └── verify.zig  # Hash chain verification
```

## Documentación

| Archivo | Contenido |
|---------|-----------|
| `REFERENCE.md` | **Manual técnico completo** (1566 líneas) - API, ejemplos, tipos |
| `docs/AUDIT_LOG_DESIGN.md` | Diseño del sistema de auditoría |
| `docs/API.md` | Referencia API detallada |
| `docs/ARCHITECTURE.md` | Arquitectura del proyecto |
| `README.md` | Introducción y ejemplos básicos |
| `examples/basic.zig` | Ejemplo ejecutable completo |

## SQLite Flags

```
-DSQLITE_THREADSAFE=2          # Multi-thread (required for ConnectionPool)
-DSQLITE_ENABLE_FTS5            # Full-text search
-DSQLITE_ENABLE_JSON1           # JSON functions
-DSQLITE_ENABLE_RTREE           # R-Tree spatial
-DSQLITE_ENABLE_SESSION         # Change tracking
-DSQLITE_ENABLE_SNAPSHOT        # Snapshots
-DSQLITE_ENABLE_COLUMN_METADATA
-DSQLITE_ENABLE_PREUPDATE_HOOK  # Pre-update hooks (audit)
```

## Notas Zig 0.15

| Cambio | Solución |
|--------|----------|
| `ArrayList.init` no existe | Usar `ArrayListUnmanaged` + `.empty` |
| `callconv(.C)` | Cambiar a `callconv(.c)` (minúscula) |
| `bufferedReader()` | Usar `readFileAlloc` |
| Strings para SQLite | `allocPrint` + null terminator |
| Named params | Incluir prefijo (`:name`) |

## Audit Log

```zig
var audit = try AuditLog.init(allocator, &db, .{
    .log_dir = "/var/log/audit",
    .app_name = "my_app",
});
defer audit.deinit();
audit.start();  // IMPORTANTE: después de que struct esté en memoria final
```

**Verificar integridad:**
```zig
var result = try verifyAuditChain(allocator, "/var/log/audit");
defer result.deinit(allocator);
if (!result.valid) { /* ALERTA */ }
```

---

## TEAM STANDARDS

**Ubicación:** `/mnt/cello2/arno/re/recode/teamdocs/`

### Normas Esenciales

**NUNCA:**
- Ejecutar binarios en background (`&`) - shells zombies
- Commit sin testing
- Silenciar warnings
- Duplicar código (verificar common/ primero)
- Archivos >600 líneas
- Modificar scope sin consultar

**SIEMPRE:**
- DRY - Una función por tarea
- Testing progresivo (compilar + verificar)
- Security commits antes de refactorizaciones
- Actualizar CLAUDE.md cada sesión
- Fragmentar: <400 líneas (core), <200 (utils)

### Comunicación
- Directo al grano, sin preámbulos
- Honestidad técnica total
- Si algo está mal, decirlo y explicar

### Workflow
1. Leer `teamdocs/LAST_UPDATE.md`
2. Leer CLAUDE.md del proyecto
3. Implementar con testing progresivo
4. Actualizar documentación
5. Commit tras confirmación usuario

### Documentos Clave
- `QUICK_REFERENCE.md` - Cheat sheet (<1 min)
- `NORMAS_TRABAJO_CONSENSUADAS.md` - Metodología completa
- `NORMAS_PATRONES_DESARROLLO.md` - Patrones específicos

---

## Git

```
origin: git@git.reugenio.com:reugenio/zcatsql.git
branch: main
```

## Zig Path

```bash
ZIG=/mnt/cello2/arno/re/recode/zig/zig-0.15.2/zig-x86_64-linux-0.15.2/zig
```
