- API de Fooldb
Fooldb.runningOn:ObjectFooldb.AssertionError:ErrorFooldb.assertion(condition:Boolean, message:String)Fooldb.ConstraintError:ErrorFooldb.MultipleConstraintErrors:ArrayFooldb.MultipleConstraintErrors.prototype.assertion(condition:Boolean, message:String)Fooldb.MultipleConstraintErrors.prototype.throwIfAny()Fooldb.MultipleConstraintErrors.prototype.throwIfAnyExcept(errorStartingWith:String)FooldbFooldb.create(basedir:String)async Fooldb.load(basedir:String):FooldbFooldb.defaultOptions:ObjectFooldb.uuidAlphabet:Array<String>Fooldb.basicTypes:Array<String>Fooldb.constructor(basedir:String, options:Object = {})Fooldb.prototype.generateUuid(len:Number = 10)Fooldb.prototype.isValidDay(text:String):BooleanFooldb.prototype.isValidHour(text:String):BooleanFooldb.prototype.isValidMoment(text:String):BooleanFooldb.prototype.isArrayOfIntegers(arrayOfNumbers:Array<Integer>):Booleanasync Fooldb.prototype.closeFileHandlers(readliner:Readline, readStream:ReaderStream, writeStream:WriterStream, tmpFile:String)Fooldb.prototype.findMissingElements(array1:Array, array2:Array):ArrayFooldb.prototype.removeElementFromArray(item:any, array:Array)async Fooldb.prototype.wait(ms:Number)async Fooldb.prototype.existsNode(fileOrDirectory:String):Booleanasync Fooldb.prototype.readJson(file:String):anyasync Fooldb.prototype.writeJson(file:String, data:any)async Fooldb.prototype.deleteFilesRecursively(file:String)Fooldb.prototype.$trace(message:String)async Fooldb.prototype.load():FooldbFooldb.prototype.trace.activate()Fooldb.prototype.trace.deactivate()Fooldb.prototype.composePath(...subpaths:Array<String>)async Fooldb.prototype.loadSchemaFromBasedir()Fooldb.prototype.findMissingUids(table:String, uids:Array<Integer>):Array<Integer>async Fooldb.prototype.checkTableValueBySchema(table:String, row:Object, operation:String):MultipleConstraintErrorsasync Fooldb.prototype.pickNextId(table:String):Stringasync Fooldb.prototype.lockDatabase()async Fooldb.prototype.unlockDatabase()async Fooldb.prototype.withLock(callback:AsyncFunction)async Fooldb.prototype.copify(data:Jsonable)async Fooldb.prototype.ensureTable(table:String)async Fooldb.prototype.ensureTablesBySchema()async Fooldb.prototype.resetTablesBySchema()async Fooldb.prototype.validateSchema(partialSchema:Object)async Fooldb.prototype.validateSchemaTable(tableSchema:Object)async Fooldb.prototype.validateSchemaColumn(columnSchema:Object)async Fooldb.prototype.setSchema(schema:Object)async Fooldb.prototype.expandSchema(schemaExpansion:Object)async Fooldb.prototype.copyObjectExceptKeys(data:Object, keys:Array<String>):Objectasync Fooldb.prototype.select(table:String, filter:Function):Array<Object>async Fooldb.prototype.initialize(table:String, row:Object)async Fooldb.prototype.insert(table:String, row:Object):Stringasync Fooldb.prototype.update(table:String, filter:Function, value:Object):Array<Integer>async Fooldb.prototype.delete(table:String, filter:Function):Array<Integer>
Uso interno solamente.
Contiene indicadores del entorno donde está funcionando el javascript.
{
browser: Boolean,
browserOnly: Boolean,
nodejs: Boolean,
nodejsOnly: Boolean,
}Uso interno solamente.
Tipo de error. Para aserciones.
Uso interno solamente.
Método para lanzar error tipo AssertionError.
Uso interno solamente.
Tipo de error. Para errores de constricciones del esquema de datos.
Uso interno solamente.
Tipo de array. Para acumular errores de constricción del esquema.
Uso interno solamente.
Método para aplicar aserciones, pero en lugar de lanzar error, solo acumula el mensaje de error en el array.
Uso interno solamente.
Método que lanza un error ConstraintError con los errores acumulados.
Uso interno solamente.
Igual que el anterior, pero ignorando los errores que empiecen por el String especificado en el parámetro.
Se usa cuando se llama a Fooldb.prototype.initialize(...) y lanza errores de duplicación, para silenciarlos.
Clase principal de la que cuelga toda la API del framework.
Uso público.
Método que llama internamente al Fooldb.constructor(basedir). Pero no al load, que es necesario para cargar el schema.json.
Se recomienda usar directamente await Fooldb.load(basedir) para obtener una instancia cargada de Fooldb.
Uso público.
Método que llama al Fooldb.constructor(basedir:String) y al await Fooldb.prototype.load().
Devuelve la instancia de Fooldb con el this.schema ya cargado.
Se espera que en la ruta ${basedir}/schema.json tenga el JSON del schema.
Uso interno solamente.
Objeto con las opciones por defecto, que son:
{
trace: true
}Uso interno solamente.
Caracteres utilizados para generar identificadores únicos largos. Incluye el alfabeto en minúsculas solamente.
Uso interno solamente.
Lista de tipos básicos admitidos. Estos tipos no tienen un formato de validación especial. Son: string, object, function, number, boolean.
Método constructor.
Establece this.basedir basándose en el parámetro.
Establece this.options basándose en this.constructor.defaultOptions y el parámetro.
Finalmente, inicializa el this.schema llamando a this.loadSchemaFromBasedir().
Uso interno solamente.
Genera un identificador único largo.
Uso interno solamente.
Método utilitario que comprueba si un texto es un día válido. El formato es: AAAA/MM/DD.
Uso interno solamente.
Método utilitario que comprueba si un texto es una hora válida. El formato es: HH:mm:ss.
Uso interno solamente.
Método utilitario que comprueba si un texto es una hora válida. El formato es: AAAA/MM/DD HH:mm:ss.
Uso interno solamente.
Método utilitario que comprueba (devolviendo booleano) si el parámetro es:
- un
Array - con elementos solamente de tipo
Integer
async Fooldb.prototype.closeFileHandlers(readliner:Readline, readStream:ReaderStream, writeStream:WriterStream, tmpFile:String)
Uso interno solamente.
Método que destruye los streams que haya abiertos y elimina el fichero temporal si existe.
Este método es clave para que la base de datos no deje filehandlers abiertos, y no haya inconsistencias luego entre operaciones de ficheros.
Nota: esta función ha dado muchos problemas. Ahora parece que va perfecto. La API de Streams de Node.js es muy poderosa, aunque estés trabajando a nivel de JavaScript, puedes poner programas a funcionar contra volúmenes de datos infinitos. Todas las otras APIs de ficheros de Node.js, no te permitirían eso.
Uso interno solamente.
Método utilitario que encuentra los elementos del array1 que no aparecen en el array2.
Uso interno solamente.
Método utilitario que elimina un elemento de un array.
Uso interno solamente.
Método que lanza una espera de tantos milisegundos como ms:Number.
Uso interno solamente.
Método que devuelve un booleano indicando si el nodo existe como fichero o directorio.
Uso interno solamente.
Método para leer un JSON.
Uso interno solamente.
Método para escribir un JSON.
Uso interno solamente.
Elimina ficheros recursivamente, de forma 100% segura.
No vuelve de la Promise por simplemente haber dejado encoladas las operaciones de eliminación, como según ChatGPT hace fs.promises.rm(file, {recursive:true}).
Este método repasa los nodos recursivamente a mano, y vuelve solo cuando se han borrado todos.
Uso interno solamente.
Método para traza de llamadas. Imprime por consola un mensaje de traza si this.options.trace está en true.
Uso público.
Método que es necesario llamar, después de construir una instancia Fooldb, para que cargue el schema.json, que es necesario tener cargado para poder hacer operaciones.
El método es asíncrono porque el fichero en browser se carga asíncronamente.
Por debajo se llama a await Fooldb.prototype.loadSchemaFromBasedir().
Si creas la instancia de Fooldb directamente con await Fooldb.load(basedir:String), ya no hace falta llamar a este método.
Pero si aplicas cambios en el schema.json, sí te interesa llamar a este método desde la instancia ya creada.
Uso público.
Activa la opción de trace.
Uso público.
Desactiva la opción de trace.
Uso interno principalmente.
Método para construir rutas relativas a this.basedir.
Uso interno solamente.
Método que carga el ${this.basedir}/schema.json (debe haberlo, si no lanzará un error) utilizando readFile + JSON.parse.
Para ver un ejemplo de schema puedes ir a test/db1/schema.json.
Si quieres refrescar el this.schema basándote en los cambios aplicados a schema.json, para eso está Fooldb.prototype.load(), que internamente, llama a este.
Uso interno solamente.
Método que encuentra los uid:Integer que no aparecen en la table:String especificada.
Por debajo usa Fooldb.prototype.select y Fooldb.prototype.findMissingElements.
async Fooldb.prototype.checkTableValueBySchema(table:String, row:Object, operation:String):MultipleConstraintErrors
Uso interno solamente.
Método que acumula y devuelve los errores de constricción.
En operation pueden ir: inserting, updating o initializing.
Importante es que no lanza errores, solo los acumula en una instancia MultipleConstraintErrors y los devuelve, para que el contexto decida qué hacer.
Esto se hace para separar la comprobación de errores de la gestión de estos.
Las comprobaciones que se llevan a cabo son, iterando las columnas del esquema:
- Comprobación 1: si es
nullable:false- Si es operación
updatingse evita: porque se supone que elrowpuede tener el valor que se omite - Si es operación
insertingoinitializing: se comprueba que la columna no seaundefineden elrow.
- Si es operación
- Comprobación 2: si es
type:any- Si no especifica el tipo, se salta el paso
- Si no es
nullable:falsey no especifica la columna en larow, se salta el paso - Si es operación
updatingy no especifica la columna en larow, se salta el paso - Comprueba que el tipo sea válido, sea tipo básico o avanzado.
- Comprobación 3: si es
unique:true- Si no requiere de ser
unique, se salta el paso. - Comprueba que el
data/${table}/indexes/${column}.jsonno tenga el valor especificado en la columna- O de tenerlo, es el mismo
uid
- O de tenerlo, es el mismo
- Si no requiere de ser
- Comprobación 4: si la tabla tiene
openColumns:trueo no:- Si tiene
openColumns:true, se salta el paso. - Comprueba que todas las propiedades de
rowestén en elthis.schema[table].columnscomo claves.
- Si tiene
Uso interno solamente.
Método que:
- Lee el
${this.basedir}/data/${table}/ids.json - Saca el último
uid - Lo incrementa y lo persiste
- Devuelve el
uidsacado.
Uso interno solamente.
Método para bloquear operaciones de persistencia en la base de datos.
Nota: actualmente usa una variable interna, por lo cual solo funciona con 1 mismo objeto de base de datos.
Uso interno solamente.
Método para desbloquear operaciones de persistencia en la base de datos.
Nota: actualmente usa una variable interna, por lo cual solo funciona con 1 mismo objeto de base de datos.
Uso interno solamente.
Método que llama a lockDatabase y unlockDatabase antes y después de una función asícrona, automáticamente.
La API usa este método, y los otros dos solo se usan 1 vez en toda la API, dentro de éste.
Nota: actualmente usa una variable interna, por lo cual solo funciona con 1 mismo objeto de base de datos.
Uso interno solamente.
Método que hace un JSON.stringify + JSON.parse del data:Jsonable que se pase, devolviendo una copia completamente inconexa del parámetro.
Uso interno solamente.
Método que inicializa:
- El directorio de datos:
${this.basedir}/data - El directorio de tabla:
${this.basedir}/data/${table} - El fichero de datos:
${this.basedir}/data/${table}/data.jsonl - El fichero de uids:
${this.basedir}/data/${table}/ids.json
Uso interno solamente.
Método que llama a Fooldb.prototype.ensureTable para cada tabla que haya definida en el this.schema.
Uso público.
Método que elimina toda la base de datos, y vuelve a crear las carpetas de las tablas, desde 0.
Elimina todo excepto el schema.json: tanto nodos como ids. Por tanto, no deja nodos huérfanos.
Usar con precaución.
Uso interno solamente.
Método que lanza un error cuando partialSchema:Object no es un this.schema válido.
Uso interno solamente.
Método que lanza un error cuando tableSchema:Object no es un this.schema.tables[table] válido.
Uso interno solamente.
Método que lanza un error cuando columnSchema:Object no es un this.schema.tables[table].columns[column] válido.
Uso público.
Método que cambia (y sobreescribe en fichero) el schema.json.
Uso público.
Método que cambia (y sobreescribe en fichero) el schema.json, igual que setSchema, con la diferencia de dejar permanecer las tablas y columnas que no se mencionan.
Uso interno principalmente.
Método utilitario que devuelve un objeto igual que data:Object (sin hacer copify), con solamente las claves que no aparecen en keys:Array<String>.
Uso público.
Método select de una tabla.
La función filter solo recibe el row:Object.
Uso público.
Este método es un insert con silencios.
Lo único que si solo lanza errores de duplicación, no propaga el error, simplemente devuelve false y no inserta nada.
Uso público.
Método para insertar una row en una tabla. Hará las comprobaciones pertinentes de constricción de esquema antes.
Uso público.
Método para actualizar registros de una tabla.
El value:Object ignorará las claves uid y uuid, porque se reservan para la gestión interna de la base de datos.
Devuelve los uid:Integer alterados por la operación.
Uso público.
Método para eliminar registros de una tabla.
Devuelve los uid:Integer eliminados por la operación.