Lleva tu base de datos relacional
directo a la línea de comandos
PumaDB Engine es un DBMS multiproceso en lenguaje C puro con sockets POSIX TCP/IP, exclusión mutua mediante flock() y persistencia en disco sobre archivos planos.
git clone https://github.com/rogerich/pumadb-engine.git && make && ./bin/servidor 8080
Arquitectura Cliente-Servidor de Alto Nivel
Construido desde cero para cumplir estrictamente con los estándares de sistemas POSIX para Linux.
Concurrencia con fork()
El servidor multiproceso delega cada conexión entrante a un proceso hijo independiente, garantizando aislamiento de memoria y cero interferencia entre clientes simultáneos.
Persistencia con flock()
Lecturas paralelas seguras con LOCK_SH y escrituras exclusivas con LOCK_EX. Las operaciones de modificación utilizan reemplazo atómico con rename().
Sockets POSIX TCP/IP
Comunicación full-duplex sobre el protocolo de transporte TCP con control de flujo garantizado, enmarcamiento de mensajes y saneamiento de buffers en utils.c.
Llave Primaria Inmutable
Autoincremento garantizado mediante escaneo max(Id) + 1. Se rechaza a nivel de parser cualquier intento de mutación sobre la columna Id mediante UPDATE.
Banner ASCII & Interfaz ANSI
Banner estético calibrado a 60 columnas que combina el puma emblemático en arte ASCII y el logotipo de PumaDB en colores dorados y cian de la UNAM.
Almacenamiento en Texto Plano
Persistencia transparente sobre archivos CSV (alumno.txt) con encabezado estricto, facilitando inspección directa, auditorías y pruebas automatizadas.
PumaDB Engine en Acción
Capturas de pantalla tomadas directamente de terminales Linux durante la ejecución concurrente.
Cliente Interactivo (REPL)
Banner visual con logotipo Puma y procesamiento de sentencias SQL interactivas con prompt >.
Servidor Concurrente
Daemon TCP escuchando en puerto 8080, despachando procesos hijos concurrentes y registrando transacciones.
Comandos SQL Soportados
Sintaxis formal implementada en el parser sintáctico de PumaDB Engine.
| Comando | Sintaxis de Ejemplo | Tipo de Bloqueo | Comportamiento en la Base de Datos |
|---|---|---|---|
| SELECT | SELECT * FROM Alumno |
flock(LOCK_SH) | Lee y retorna todos los registros de la tabla de forma concurrente sin bloquear otras lecturas. |
| INSERT | INSERT INTO Alumno VALUES (Nombre,Apellido,Semestre,Carrera) |
flock(LOCK_EX) | Calcula el siguiente Id autoincremental (max(Id) + 1) y anexa el registro atómicamente. |
| UPDATE | UPDATE Alumno SET Columna=NuevoValor WHERE Id=X |
flock(LOCK_EX) + rename() | Modifica la columna indicada en el registro con Id=X. La columna Id no se puede alterar. |
| DELETE | DELETE FROM Alumno WHERE Id=X |
flock(LOCK_EX) + rename() | Elimina de forma permanente el registro identificado por Id=X reescribiendo el archivo temporal. |
| SALIR | SALIR |
N/A | Cierra ordenadamente el socket TCP del cliente y libera los recursos asociados en el servidor. |