___ ___ __ _____ ___ _______
|" \ /" | |" \ (\" \|" \ /" "|
\ \ // | || | |.\\ \ |(: ______)
/\\ \/. | |: | |: \. \\ | \/ | へ♡ ╱|-`♡´-
|: \. | |. | |. \ \. | // ___)_ ૮ > <) (˚ˎ 。7 ִ ࣪𖤐
|. \ /: | /\ |\| \ \ |(: "| / ⁻ ៸| |、˜〵
|___|\__/|___|(__\_|_)\___|\____\) \_______) 乀(ˍ, ل ل じしˍ,)ノ♡
MinervaSQL - Intérprete SQL en Español v1.0
python main.pyEl control de transacciones te permite agrupar una serie de operaciones de base de datos en una única unidad de trabajo.
Esto asegura que todas las operaciones se completen con éxito o, si ocurre algún error, que ninguna de ellas se aplique, manteniendo la integridad de tus datos.
El comando BEGIN marca el inicio de una nueva transacción.
Desde este punto, todas las operaciones de modificación de datos (INSERTAR, ACTUALIZAR, ELIMINAR) se registran temporalmente.
BEGIN;
## Secuencias Actuales
Éstas son las instrucciones reconocidas por el motor (ejemplos que pueden copiarse y probarse, no estrictamente la estructura lógica de las instrucciones, ésta se encuentra en HELP)
```sql
SELECCIONA HR, TEMP DESDE datos;SELECCIONA * DESDE datos;Pendiente a corregir
INSERTAR EN datos VALORES (130, 39);INSERTAR EN datos (HR, TEMP) VALORES (100, 37.1);SELECCIONA NOMBRE, EDAD DESDE empleados DONDE DEPARTAENTO = 1 ORDENAR POR EDAD ASC;SELECCIONA NOMBRE, EDAD DESDE empleados DONDE DEPARTAENTO = 1 ORDENAR POR EDAD DESC;ACTUALIZAR datos CON HR = 95 DONDE TEMP = 36.5;BORRAR DE datos DONDE HR EQ 90;DESHACER datos;CONTAR DESDE datos;CREAR TABLA pacientes (ID, NOMBRE, EDAD);USAR BASE datos;CREAR BASE laboratorio;CREAR USUARIO fernando PARA 1234LOGIN fernando PARA 1234ELIMINAR USUARIO fernandoMOSTRAR BASESMOSTRAR TABLASMOSTRAR USUARIOSUSUARIO_ACTUAL;ELIMINAR BASE oficina;BASE_ACTUAL;HELPSALIRMODO DEPURACIONOTORGAR ver_bases A fernando;OTORGAR otorgar A fernando;OTORGAR ver_tablas A fernando;OTORGAR insertar A fernando;OTORGAR usar_base A fernando;OTORGAR ver_usuarios A fernando;OTORGAR crear_base A fernando;OTORGAR actualizar A fernando;OTORGAR contar A fernando;OTORGAR eliminar A fernando;OTORGAR crear_tabla A fernando;OTORGAR eliminar_tabla A fernando;REVOCAR ver_bases A fernando;REVOCAR otorgar A fernando;REVOCAR ver_tablas A fernando;REVOCAR insertar A fernando;REVOCAR usar_base A fernando;REVOCAR ver_usuarios A fernando;REVOCAR crear_base A fernando;REVOCAR actualizar A fernando;REVOCAR contar A fernando;REVOCAR eliminar A fernando;REVOCAR crear_tabla A fernando;REVOCAR eliminar_tabla A fernando;REVOCAR crear_tabla A karla;REVOCAR ver_bases A karla;La siguiente tabla da una breve decripción de los permisos que se pueden asignar a los usuarios.
| Permiso | Descripción |
|---|---|
| ver_bases | Listar todas las bases de datos |
| otorgar | Asignar permisos a usuarios |
| ver_tablas | Mostrar tablas de una base |
| insertar | Añadir nuevos registros |
| usar_base | Seleccionar una base para trabajar |
| ver_usuarios | Listar usuarios existentes |
| crear_base | Crear nuevas bases de datos |
| actualizar | Modificar registros existentes |
| contar | Obtener cantidad de registros |
| eliminar | Borrar registros |
| crear_tabla | Crear nuevas tablas |
| eliminar_tabla | Eliminar tablas existentes |
TOKEN_PATTERNS = [
(r'\bSELECCIONA\b', 'SELECCIONA'),
(r'\bBORRAR\b', 'ELIMINAR'),
(r'\bDESDE\b', 'DESDE'),
(r'\bDONDE\b', 'DONDE'),
(r'\bINSERTAR\b', 'INSERT'),
(r'\bEN\b', 'INTO'),
(r'\bUSUARIO_ACTUAL\b', 'CURRENT_USER'),
(r'\bBASE_ACTUAL\b', 'CURRENT_DATABASE'),
(r'\bVALORES\b', 'VALUES'),
(r'\bUSAR\b', 'USE'),
(r'\bBASE\b', 'DATABASE'),
(r'\bBASES\b', 'DATABASES'),
(r'\bMOSTRAR\b', 'SHOW'),
(r'\bOTORGAR\b', 'GRANT'),
(r'\bA\b', 'TO'),
(r'\bMOSTRAR\b', 'MOSTRAR'),
(r'\bTABLAS\b', 'TABLES'),
(r'\bUSUARIO\b', 'USER'),
(r'\bPARA\b', 'WITH'),
(r'\bCREAR\b', 'CREATE'),
(r'\bLOGIN\b', 'LOGIN'),
(r'\bUSUARIO\b', 'USUARIO'),
(r'\bUSUARIOS\b', 'USUARIOS'),
(r'\bACTUALIZAR\b', 'ACTUALIZAR'),
(r'\bCREAR\b', 'CREATE'),
(r'\bCON\b', 'SET'),
(r'\bTABLA\b', 'TABLE'),
(r'\bDESHACER\b', 'DESHACER'),
(r'\bELIMINAR\b', 'DELETE'),
(r'\bDE\b', 'FROM'),
(r'\bCONTAR\b', 'COUNT'),
(r'\bEQ\b', '='),
(r'[a-zA-Z_][a-zA-Z0-9_]*', 'IDENTIFIER'),
(r'\d+\.\d+', 'FLOAT'),
(r'\d+', 'NUMBER'), # Asegura que los valores flotantes también se manejen
(r"\*", "ASTERISK"),
(r'>', 'GT'),
(r'<', 'LT'),
(r'=', 'EQ'),
(r',', 'COMMA'),
(r';', 'SEMICOLON'),
(r'\(', 'PARIZQ'),
(r'\)', 'PARDER'),
(r'(".*?"|\'.*?\')', 'STRING'),
(r'\s+', None) # Espacios en blanco que se ignoran
]- Lexer: Convierte texto SQL en tokens (SELECT, FROM, WHERE)
- Parser: Construye Árbol de Sintaxis Abstracta (AST)
- Ejecutor: Procesa consultas y genera resultados en JSON
- Lenguaje: Python 3.x
- Paradigmas: Programación funcional, procesamiento de lenguajes
- Conceptos: Autómatas finitos, análisis léxico/sintáctico
- Almacenamiento: JSON para persistencia de datos
Interprete basado en SQL Español. Algunas reglas y aspectos relevantes:
- Las consultas como promedio, suma, entre otras, se realizan por Medio de codigo externo.
- Los tipos de datos en insersion son de tipo FLOAT, INT y STRING.
- La eliminacion de usuarios se maneja desde el archivo de control.
- Los archivos de base de datos estan en la carpeta database.
- Los archivos de base de datos se generan con extensión JSON.
- El gestor tiene su propio motor de depuración.
- El usuario root no se puede borrar.
- El usuario root se carga con el primer inicio de sesion, después pueden crearse usuarios loguearse.
- El usuario root es administrador y tiene todos los permisos disponibles.
- El ";"es opcional en la mayoria de instrucciones, solo necesario cuando hay una instruccioque tiene - la ntencion de perdurar.
- El motor es sensible a mayusculas y minusculas.
- Todas las palabras reservadas se escribiran en mayusculas.
- El modo de depuración se activa y desactiva con la misma instrucción (MODO DEPURACION)
- El modo de depuración explica en texto plano el debbugin.
- No pueden revocarse permisos, seria neceario modificarlos desde JSON
El proceso para crear respaldos de las bases de datos es el siguiente.
Para usar el respaldo por medio de ssh es necesario establecer una clave para ejecutar los scripts. Dicha clave se generara con el uso del siguiente comando.
ssh-keygen -t rsa -b 4096 -C "usuario@ip_usuario"Tanto la ruta como la passphrase se recomienda dejar en default. Despues de creada la llave, se copia al servidor. Si se tiene un puerto diferente del 22, debe especificarse con -p y ser el mismo que el servidor escucha.
ssh-copy-id -p 5000 servidor@ip_servidorPara comenzar con el uso de los comandos, deben darse permisos de ejecucion como comando a los scripts dentro de la carpeta ssh-backup.
chmod +x ssh-backups/descargar_respaldo.shchmod +x ssh-backups/enviar_bases.shchmod +x ssh-backups/restaurar_base.shPara realizar una copia de seguridad de todas las bases de datos comprimida y encriptada en el servidor :
./ssh-backups/enviar_bases.sh servidor /home/servidor/backupsPara realizar una copia de seguridad de una base de datos especifica comprimida y encriptada en el servidor.
./ssh-backups/enviar_bases.sh servidor /home/servidor/backups "" "" "" nombre_baseEn caso de querer descargar (no restaura inmediatamente, unicamente descarga) una base de datos desde el servidor a la carpeta backups:
./ssh-backups/descargar_respaldo.sh ferna /home/ferna/backups/laboratorio.tar.gz.gpg localhost ./backups/respaldo_recibidoPara restaurar una base de datos en el sistema desde la carpeta backups:
./ssh-backups/restaurar_base.sh ./backups/respaldo_recibido ./databasesNOTA: Por cuestiones de seguridad, se pedira clave en cada operacion. A continuacion se muestra la ejecucion esperada de los scripts.
usuario@CLIENTE:~$ cd biometric_interpreter
usuario@CLIENTE:~/biometric_interpreter$ ./ssh-backups/enviar_bases.sh servidor /home/servidor/backups
⏳ Empaquetando base de datos: default
🔐 Cifrando default.tar.gz
🚀 Enviando default.tar.gz.gpg a servidor@ip_servidor:/home/servidor/backups usando llave ~/.ssh/id_rsa
default.tar.gz.gpg 100% 192 106.5KB/s 00:00
🧹 Limpiando archivos temporales
✅ Base default procesada.
⏳ Empaquetando base de datos: laboratorio
🔐 Cifrando laboratorio.tar.gz
🚀 Enviando laboratorio.tar.gz.gpg a servidor@ip_servidor:/home/servidor/backups usando llave ~/.ssh/id_rsa
laboratorio.tar.gz.gpg 100% 386 480.7KB/s 00:00
🧹 Limpiando archivos temporales
✅ Base laboratorio procesada.
usuario@CLIENTE:~/biometric_interpreter$ ./ssh-backups/enviar_bases.sh servidor /home/servidor/backups "" "" "" laboratorio
⏳ Empaquetando base de datos: laboratorio
🔐 Cifrando laboratorio.tar.gz
🚀 Enviando laboratorio.tar.gz.gpg a servidor@ip_servidor:/home/servidor/backups usando llave ~/.ssh/id_rsa
laboratorio.tar.gz.gpg 100% 386 224.9KB/s 00:00
🧹 Limpiando archivos temporales
✅ Base laboratorio procesada.
usuario@CLIENTE:~/biometric_interpreter$ ./ssh-backups/descargar_respaldo.sh servidor /home/servidor/backups/laboratorio.tar.gz.gpg host ./backups/respaldo_recibido
📥 Descargando /home/servidor/backups/laboratorio.tar.gz.gpg desde servidor@ip_servidor:5000 a ./backups/respaldo_recibido...
laboratorio.tar.gz.gpg 100% 386 183.9KB/s 00:00
✅ Descarga completada.
usuario@CLIENTE:~/biometric_interpreter$ ./ssh-backups/restaurar_base.sh ./backups/respaldo_recibido ./databases
🔓 Descifrando ./backups/respaldo_recibido...
gpg: AES256.CFB encrypted data
gpg: encrypted with 1 passphrase
📦 Extrayendo ./backups/respaldo_recibido en ./databases...
🧹 Eliminando temporal: ./backups/respaldo_recibido
✅ Restauración completada en ./databases
graph TD
ROOT[RAÍZ] --> SELECT
ROOT --> INSERT
ROOT --> UPDATE
ROOT --> DELETE
ROOT --> UNDO
ROOT --> COUNT
ROOT --> CREATE_TABLE
ROOT --> USE_DB
ROOT --> CREATE_DB
ROOT --> CREATE_USER
ROOT --> LOGIN
ROOT --> DROP_USER
ROOT --> SHOW
ROOT --> CURRENT
ROOT --> DROP_DB
ROOT --> HELP
ROOT --> EXIT
ROOT --> DEBUG
ROOT --> GRANT
ROOT --> REVOKE
ROOT --> TX_BEGIN
ROOT --> TX_COMMIT
ROOT --> TX_ROLLBACK
%% --- GESTIÓN DE PERMISOS (GRANT/REVOKE) ---
PERMISSION_NAME[PERMISO] --> ver_bases
PERMISSION_NAME --> otorgar
PERMISSION_NAME --> ver_tablas
PERMISSION_NAME --> insertar
PERMISSION_NAME --> usar_base
PERMISSION_NAME --> ver_usuarios
PERMISSION_NAME --> crear_base
PERMISSION_NAME --> actualizar
PERMISSION_NAME --> contar
PERMISSION_NAME --> eliminar
PERMISSION_NAME --> crear_tabla
PERMISSION_NAME --> eliminar_tabla
GRANT --> GRANT_INSTR
GRANT_INSTR[OTORGAR] --> PERMISSION_NAME
GRANT_INSTR --> USER_GRANT[A USUARIO]
REVOKE --> REVOKE_INSTR
REVOKE_INSTR[REVOCAR] --> PERMISSION_NAME
REVOKE_INSTR --> USER_REVOKE[DE USUARIO]
%% --- TRANSACCIONES ---
TX_BEGIN[BEGIN] --> CMD_BEGIN
TX_COMMIT[COMMIT] --> CMD_COMMIT
TX_ROLLBACK[ROLLBACK] --> CMD_ROLLBACK
%% --- SELECT CON WHERE Y ORDENAR POR ---
SELECT --> SELECT_COLS
SELECT_COLS[SELECT: Columnas] --> COL_LIST
SELECT_COLS --> TABLE_NAME_SEL
SELECT_COLS --> WHERE_CLAUSE
SELECT_COLS --> ORDER_CLAUSE
SELECT --> SELECT_A
SELECT_A[SELECT: Asterisco] --> ASTERISK
SELECT_A --> TABLE_NAME_ALL_SEL
SELECT_A --> WHERE_CLAUSE
SELECT_A --> ORDER_CLAUSE
WHERE_CLAUSE[DONDE] --> WHERE_COND_SELECT
ORDER_CLAUSE[ORDENAR POR] --> ORDER_COL
ORDER_COL --> ORDER_DIR_ASC[ASC]
ORDER_COL --> ORDER_DIR_DESC[DESC]
%% --- INSERCIÓN ---
INSERT --> INSERT_VALS
INSERT_VALS[INSERT: Valores] --> TABLE_NAME_INSERT
INSERT_VALS --> VALUE_LIST
INSERT --> INSERT_COLS
INSERT_COLS[INSERT: Columnas] --> TABLE_NAME_INSERT_COLS
INSERT_COLS --> COLUMN_LIST
INSERT_COLS --> VALUE_LIST_COLS
%% --- OTROS COMANDOS ---
UPDATE --> TABLE_UPDATE
UPDATE --> SET_CLAUSE
UPDATE --> WHERE_COND_UPDATE
DELETE --> TABLE_DELETE
DELETE --> WHERE_COND_DELETE
UNDO --> UNDO_TABLE
COUNT --> COUNT_TARGET
COUNT --> COUNT_SOURCE
CREATE_TABLE --> TABLE_NAME_CREATE
CREATE_TABLE --> TABLE_COLS
USE_DB --> DB_NAME_USE
CREATE_DB --> DB_NAME_CREATE
CREATE_USER --> USER_NAME
CREATE_USER --> USER_PASS
LOGIN --> LOGIN_USER
LOGIN --> LOGIN_PASS
DROP_USER --> DROP_USER_NAME
SHOW --> SHOW_DBS
SHOW_DBS --> CMD_SHOW_DB
SHOW --> SHOW_TABLES
SHOW_TABLES --> CMD_SHOW_TABLES
SHOW --> SHOW_USERS
SHOW_USERS --> CMD_SHOW_USERS
CURRENT --> CURRENT_USER
CURRENT_USER --> CMD_CURRENT_USER
CURRENT --> CURRENT_DB
CURRENT_DB --> CMD_CURRENT_DB
DROP_DB --> DROP_DB_NAME
HELP --> HELP_CMD
EXIT --> EXIT_CMD
DEBUG --> DEBUG_CMD