Skip to content

Drivers

Thiago Delgado Pinto edited this page Jul 3, 2018 · 8 revisions

This page lists currently known drivers and some brief instructions on creating new drivers.

Driver List

Implementing a New Driver

Writing a new wrapper around an existing database implementation in Node is fairly straight forward. The database-js-mysql wrapper is a good place to start. Generally the pattern will be like this:

var baseDriver = require('base-driver');

class Wrapper {
    constructor(connection) {
        this.connection = connection;
        this.transacton = false; // only needed if the database supports transactions
    }

    query(sql) {
        var self = this;
        return new Promise((resolve, reject) => {
            self.connection.query(sql, (error, data, fields) => {
                if (error) {
                    reject(error);
                } else {
                    resolve(data);
                }                
            });
        });
    }

    execute(sql) {
        return new Promise((resolve, reject) => {
            self.connection.execute(sql, (error, data, fields) => {
                if (error) {
                    reject(error);
                } else {
                    resolve(data);
                }                
            });
        });
    }

    close() {
        var self = this;
        return new Promise((resolve, reject) => {
            self.connection.close((err) => {
                if (err) {
                    reject(err);
                } else {
                    resolve();
                }
            });
        });
    }

    /** From here down is only required for transaction support **/

    isTransactionSupported() {
        return true;
    }

    inTransaction() {
        return this.transaction;
    }

    beginTransaction() {
        var self = this;
        return new Promise((resolve, reject) => {
            this.execute("START TRANSACTION")
            .then(() => {
                self.transaction = true;
                resolve(true);
            })
            .catch((error) => {
                reject(error);
            });
        });
    }

    commit() {
        var self = this;
        return new Promise((resolve, reject) => {
            this.execute("COMMIT")
            .then(() => {
                self.transaction = false;
                resolve(true);
            })
            .catch((error) => {
                reject(error);
            });
        });
    }

    rollback() {
        var self = this;
        return new Promise((resolve, reject) => {
            this.execute("ROLLBACK")
            .then(() => {
                self.transaction = false;
                resolve(true);
            })
            .catch((error) => {
                reject(error);
            });
        });
    }
}

module.exports = {
    open: function(connection) {
        let base = baseDriver.createConnection({
            host: connection.Hostname || 'localhost',
            port: parseInt(connection.Port) || 3306,
            user: connection.Username,
            password: connection.Password,
            database: connection.Database
        })
        return new Wrapper(base);
    }
};