dbtex

🌻 DbTex is a lightweight, flat-file, embedded, zero-dependant database designed for using in non-ACID and relatively simple Node.js applications as an external dependency.

View on GitHub

dbtex

GitHub Maintenance GitHub commit activity dependencies Status Lines of code GitHub repo size PRs Welcome

DbTex is a lightweight, flat-file, embedded, zero-dependant database designed for using in non-ACID and relatively simple Node.js applications as an external dependency.

About

DbTex tries to solve one particular aspect in building software – storing application data. There are many approaches and specific software implementations here, one of which is Flat-file databases. Generally speaking, DbTex implements ideas of such databases with some additional mechanisms or enhancements, e.g. encryption. It stores data in uniform structured format which is determined by driver being used. Data store is persistent, because application data is saved permanently to file system. DbTex is not ACID-compatible by-design and doesn’t offer the features comparable to “large” RDBMS. The main goal to use DbTex may be minimizing amount of third-party code in an application, because it has no dependencies, and it’s size is relatively small. Another reason to use DbTex may be an ability to “quick start”, because it’s API is concise and simple. Oftentimes, application needs are scoped with CRUD operations, so DbTex may be suitable for small and medium Node.js projects without high-load, ACID requirements, other advanced stuff and waste headache.

Architecture

Despite the API exposes the high abstract convenient methods for data manipulation, there are several encapsulated details and under-the-hood concepts that should be described.

1) DbTex provides persistent storage mechanism where application’s data are stored in plaint-text (MIME – text/plain, extension – .txt) files/flatfiles in UTF-8 character encoding. These files represent the database table data and organized appropriately. Generally, a storage structure in DbTex looks like as following:

   databases_parent_directory/
       ├── database_directory/
           ├── meta.json
           ├── [prefix]table_1/
               ├── 1_<timestamp>_file.txt
               ├── ...
               └── N_<timestamp>_file.txt
           ├── ...
           └── [prefix]table_N

Database metadata is stored in meta.json file in its root directory. This file contains all database instance related information and is closely synchronized with database structure and reflects all updates.

2) Record/row in DbTex terms is a character sequence terminated with line-break. This sequence consists of two types of symbols: semantic sub-sequences and delimiters. What a delimiter should be is defined by the driver being used. There are two common delimiters using for delimiter-separated values: commas in comma-separated values (CSV) and tabs in tab-separated values (TSV). There are two such currently supported built-in drivers. It’s possible to use a custom driver with an arbitrary delimiter and corresponding read/write logic. Driver type should be specified during DbTex initialization, otherwise CSV format will be used.

3) DbTex is developed around so-called “navigational” principle, so read/write procedures are implemented using direct imperative traversing on table records.

Getting Started

Installation:

npm install dbtex

# or

yarn add dbtex

Initialize in application (see API for detailed explanation):

import { DbTex } from 'dbtex';


// Instantiate and create database (if not exists) in path: database-parent-directory/name-of-database.
// Also specify the file size limit for table data and that it should be encrypted with built-in encoder.
const dbTex: DbTex = new DbTex({
    location: 'databases_parent_directory',
    name: 'database_name',
    fileSizeLimit: '1MB',
    encrypt: true
});

API

DbTex

Name Access Type Description
location public property Absolute path to database directory (where meta-info and all tables data are stored).
audit public method Load data from meta-info file, verify all metrics being read, and compare with real database structure.
createTable public method Create table in current database and update of database meta-info metrics.
dropTable public method Drop an existing table and update of database meta-info metrics.
getStats public method Get statistics about database: general metrics, tables, paths, disk utilization, etc.
setHook public method Set (add new or update of existing) additional procedure as a middleware to the CRUD flow.
shutdown public method Terminate database process gracefully.
       
types static method Enumeration of supported types for table fields.
       
config private property Main application config.
sanitizeConfig private method User/external configuration sanitizer.
init private method Parse given config, analyze, merge with existing if any, and initialize inner structures.
save private method Save database configuration and state to meta file with checksum.

Contributing

I’m grateful to the community for contributing bug fixes and improvements. Read checklist and issues to learn how specifically can you be helpful. If nevertheless you decide to help to improve DbTex, please read the Contribution Guidelines first. Thank you!

License

DbTex is licensed under the terms of the MIT license.