UNPKG

db-meta

Version:

Relational database metadata extraction library

131 lines (106 loc) 3.25 kB
var sqlite3 = require('sqlite3'); var Table = require('../table'); var Column = require('./column'); var Index = require('./index'); exports.connect = function (options, callback) { try { var client = new sqlite3.Database(options); callback(null, new Driver(client)); } catch (err) { callback(err); } }; exports.connectToExistingConnection = function(client, callback){ callback(null, new Driver(client)); }; function Driver(client) { this.client = client; } Driver.prototype.getVersion = function (callback) { this.client.all('select sqlite_version() as version', onResult); function onResult(err, result) { if (err) { return callback(err); } callback(null, result[0].version); } }; Driver.prototype.getTables = function (callback) { var handler = handleResults.bind(this, Table, callback); this.client.all("SELECT tbl_name as table_name, * from sqlite_master where type = 'table';", handler); }; Driver.prototype.getColumns = function (tableName, callback) { var handler = handleResults.bind(this, Column, onResult.bind(this)); this.client.all("PRAGMA table_info(" + tableName + ")", handler); function onResult(err, result){ if (err) { return callback(err); } var previous = result; this.client.all("SELECT sql from sqlite_master where name = \'" + tableName + "\';", process.bind(this, previous)); } function process(previous,err,result){ if (err) { return callback(err); } var sql = result[0]['sql']; sql = sql.substring( sql.indexOf('\(')+1,sql.lastIndexOf('\)') ); var strings = sql.split(','); var colNumber = 0; strings.forEach(function(string){ string = string.trim(); string = string.toUpperCase(); if (string.indexOf('UNIQUE') >= 0){ previous[colNumber].meta.unique = true; } if (string.indexOf('AUTOINCREMENT') >= 0){ previous[colNumber].meta.auto_increment = true; } colNumber++; }); callback(err,previous); } }; Driver.prototype.getIndexes = function (tableName, callback) { this.client.all("pragma index_list(" + tableName + ")", function (err, result) { if (err) { return callback(err); } var indexCount = 0; var indexes = []; var numIndexes = result.length; if (numIndexes === 0) { return callback(null, []); } for (var i = 0; i < numIndexes; i++) { var indexName = result[i].name; this.client.all("pragma index_info(" + indexName + ")", function (err, result) { if (err) { return callback(err); } for (var j = 0; j < result.length; j++) { var indexMeta = result[j]; indexMeta.index_name = indexName; indexMeta.table_name = tableName; indexes.push(new Index(indexMeta)); } if (++indexCount === numIndexes) { callback(null, indexes); } }); } }.bind(this)); }; Driver.prototype.close = function (callback) { this.client.close(); callback(); }; function handleResults(obj, callback, err, result) { if (err) { return callback(err); } var objects = result.map(function (row) { return new obj(row); }); callback(null, objects); }