From a20fa8ada83a7019f0181d30810f4413d4fc62d9 Mon Sep 17 00:00:00 2001 From: Raymond Feng Date: Wed, 13 May 2015 10:14:44 -0700 Subject: [PATCH] Refactor base and sql connector --- .jshintrc | 42 +- docs.json | 22 + docs/connector-architecture.png | Bin 0 -> 115227 bytes docs/crud-connector.png | Bin 0 -> 107254 bytes docs/sql-connector.md | 662 +++++++++++++ index.js | 4 +- lib/connector.js | 167 +++- lib/parameterized-sql.js | 100 ++ lib/sql.js | 1312 +++++++++++++++++++++---- package.json | 11 +- test/connectors/test-sql-connector.js | 69 +- test/smoke.test.js | 18 + test/sql.test.js | 310 ++++++ 13 files changed, 2439 insertions(+), 278 deletions(-) create mode 100644 docs.json create mode 100644 docs/connector-architecture.png create mode 100644 docs/crud-connector.png create mode 100644 docs/sql-connector.md create mode 100644 lib/parameterized-sql.js create mode 100644 test/sql.test.js diff --git a/.jshintrc b/.jshintrc index 66670a0..f9aa219 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,23 +1,23 @@ { -"node": true, -"browser": true, -"camelcase" : true, -"eqnull" : true, -"indent": 2, -"undef": true, -"unused": true, -"quotmark": "single", -"maxlen": 90, -"trailing": true, -"newcap": true, -"nonew": true, -"sub": true, -"globals": { - "describe": true, - "it": true, - "before": true, - "beforeEach": true, - "after": true, - "afterEach": true -} + "node": true, + "browser": true, + "camelcase": true, + "eqnull": true, + "indent": 2, + "undef": true, + "unused": "vars", + "quotmark": "true", + "maxlen": 110, + "trailing": true, + "newcap": true, + "nonew": true, + "sub": true, + "globals": { + "describe": true, + "it": true, + "before": true, + "beforeEach": true, + "after": true, + "afterEach": true + } } diff --git a/docs.json b/docs.json new file mode 100644 index 0000000..3ed5576 --- /dev/null +++ b/docs.json @@ -0,0 +1,22 @@ +{ + "content": [ + { + "title": "Build a SQL connector", + "depth": 2 + }, + "docs/sql-connector.md", + { + "title": "Base Connector", + "depth": 2 + }, + "lib/connector.js", + { + "title": "SQL Connector", + "depth": 2 + }, + "lib/sql.js", + "lib/parameterized-sql.js" + ], + "codeSectionDepth": 3 +} + diff --git a/docs/connector-architecture.png b/docs/connector-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..3709668274308d71055dd632453ab7cea46f4bb8 GIT binary patch literal 115227 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�!}(Wxm`q1-`)DuU^9m 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 MVr@(?yn6qC0Ql^@n*aa+ literal 0 HcmV?d00001 diff --git a/docs/sql-connector.md b/docs/sql-connector.md new file mode 100644 index 0000000..ede3dac --- /dev/null +++ b/docs/sql-connector.md @@ -0,0 +1,662 @@ +# Build a connector for relational databases + +This tutorial walks you through the MySQL connector implementation to teach you +how to develop a connector for relational databases. + +## Understand a connector's responsibilities + +In LoopBack, models encapsulate business data and logic as JavaScript properties +and methods. One of the powerful features of LoopBack is that application +developers don't have to implement all behaviors for their models as a lot of +them are already provided by the framework out of box with data sources and +connectors. For example, a model automatically receives the create, retrieve, +update, and delete (CRUD) functions if it is attached to a data source for a +database. LoopBack abstracts the persistence layer and other backend services, +such as REST APIs, SOAP web services, and storage services, and so on, as data +sources, which are configurations of backend connectivity and integration. +Each data source is backed a connector which implements the interactions between +Node.js and its underlying backend system. Connectors are responsible for +mapping model method invocations to backend functions, such as database +operations or call to REST or SOAP APIs. The following diagram illustrates how +connectors fit into the big picture of LoopBack API framework. + +![connector-architecture](connector-architecture.png) + +Please note that you don't always have to develop a connector to allow your +application to interact with other systems. Ad-hoc integration can be done with +custom methods on the model. The custom methods can be implemented using other +Node modules, such as drivers or clients to your backend. + +You should consider to develop a connector for common and reusable backend +integrations, for example: + +- Integrate with a backend such as databases +- Reusable logic to interact with another system + +There are a few typical types of connectors based on what backends they connect +to and interact with. + +- Databases that support full CRUD operations + - Oracle, SQL Server, MySQL, Postgresql, MongoDB, In-memory DB +- Other forms of existing APIs + - REST APIs exposed by your backend + - SOAP/HTTP web services +- Services + - E-mail + - Push notification + - Storage + +The connectors are mostly transparent to models. Their functions are mixed into +model classes through data source attachments. + +Most of the connectors need to implement the following logic: + +- Lifecycle handlers + - initialize: receive configuration from the data source settings and + initialize the connector instance + - connect: create connections to the backend system + - disconnect: close connections to the backend system + - ping (optional): check if the connectivity + +- Model method delegations + - Delegating model method invocations to backend calls, for example CRUD + +- Connector metadata (optional) + - Model definition for the configuration, such as host/url/user/password + - What data access interfaces are implemented by the connector (the capability + of the connector) + - Connector-specific model/property mappings + +To mixin methods onto model classes, a connector must choose what functions to +offer. Different types of connectors implement different interfaces that group +a set of common methods, for example: + +- Database connectors + - CRUD methods, such as create, find, findById, deleteAll, updateAll, count + +- E-mail connector + - send() + +- Storage connector + - Container/File operations, such as createContainer, getContainers, getFiles, + upload, download, deleteFile, deleteContainer + +- Push Notification connector + - notify() + +- REST connector + - Map operations from existing REST APIs + +- SOAP connector + - Map WSDL operations + +In this tutorial, we'll focus on building a connector for databases that provide +the full CRUD capabilities. + +## Understand a database connector with CRUD operations + +![crud-connector](crud-connector.png) + +LoopBack unifies all CRUD based database connectors so that a model can choose +to attach to any of the supported database. There are a few classes involved +here: + +1. [PersistedModelClass](http://docs.strongloop.com/display/public/LB/PersistedModel+class) +defines all the methods mixed into a model for persistence. + +2. [The DAO facade](https://github.com/strongloop/loopback-datasource-juggler/blob/master/lib/dao.js) +maps the PersistedModel methods to connector implementations. + +3. CRUD methods need to be implemented by connectors + + + +In the next sections, we will use MySQL connector as an example to walk through +how to implement a SQL based connector. + +## Define a module and export the *initialize* function + +A LoopBack connector is packaged as a Node.js module that can be installed using +`npm install`. LoopBack runtime loads the module via `require` on behalf of +data source configuration, for example, `require('loopback-connector-mysql');`. +The connector module should export an `initialize` function as follows: + +```js +// Require the DB driver +var mysql = require('mysql'); +// Require the base SqlConnector class +var SqlConnector = require('loopback-connector').SqlConnector; +// Require the debug module with a pattern of loopback:connector:connectorName +var debug = require('debug')('loopback:connector:mysql'); + +/** + * Initialize the MySQL connector against the given data source + * + * @param {DataSource} dataSource The loopback-datasource-juggler dataSource + * @param {Function} [callback] The callback function + */ +exports.initialize = function initializeDataSource(dataSource, callback) { + ... +}; +``` + +After the initialization, the dataSource object will have the following properties +added: + +- connector: The connector instance +- driver: The module for the underlying database driver (`mysql` for MySQL) + +The `initialize` function should calls the `callback` function once the connector +has been initialized. + +## Create a subclass of SqlConnector + +Connectors for relational databases have a lot of things in common. They are +responsible for mapping CRUD operations to SQL statements. LoopBack provides a +base class called `SqlConnector` that encapsulates the common logic for inheritance. +The following code snippet is used to create a subclass of SqlConnector. + +```js +/** + * @constructor + * Constructor for MySQL connector + * @param {Object} settings The data source settings + */ +function MySQL(settings) { + // Call the super constructor with name and settings + SqlConnector.call(this, 'mysql', settings); + ... +} +// Set up the prototype inheritence +require('util').inherits(MySQL, SqlConnector); +``` + +## Implement methods to interact with the database + +A connector implements the following methods to communicate with the underlying +database. + +### Connect to the database + +The `connect` method establishes connections to the database. In most cases, a +connection pool will be created based on the data source settings, including +`host`, `port`, `database`, and other configuration properties. + +```js +MySQL.prototype.connect = function (cb) { + // ... +}; +``` + +### Disconnect from the database + +The `disconnect` method close connections to the database. Most database drivers +provide APIs. + +```js +/** + * Disconnect from MySQL + */ +MySQL.prototype.disconnect = function (cb) { + // ... +}; +``` +### Ping the database + +The `ping` method tests if the connection to the database is healthy. Most +connectors choose to implement it by executing a simple SQL statement. + +```js +MySQL.prototype.ping = function(cb) { + // ... +}; +``` + +## Implement CRUD methods + +The connector is responsible for implementing the following CRUD methods. The +good news is that the base SqlConnector now have most of the methods implemented +with the extension point to override certain behaviors that are specific to the +underlying database. + +To extend from SqlConnector, the minimum set of methods below must be +implemented: + + +### Execute a SQL statement with parameters + +The `executeSQL` method is the core function that a connector has to implement. +Most of other CRUD methods are delegated to the `query` function. It executes +a SQL statement with an array of parameters. `SELECT` statements will produce +an array of records representing matching rows from the database while other +statements such as `INSERT`, `DELETE`, or `UPDATE` will report the number of +rows changed during the operation. + +```js +/** + * Execute the parameterized sql statement + * + * @param {String} sql The SQL statement, possibly with placeholders for parameters + * @param {*[]} [params] An array of parameter values + * @param {Objet} [options] Options passed to the CRUD method + * @param {Function} [callback] The callback after the SQL statement is executed + */ +MySQL.prototype.executeSQL = function (sql, params, options, callback) { + // ... +}; +``` + +### Map values between a model property and a database column + +```js +/** + * Converts a model property value into the form required by the + * database column. The result should be one of following forms: + * + * - {sql: "point(?,?)", params:[10,20]} + * - {sql: "'John'", params: []} + * - "John" + * + * @param {Object} propertyDef Model property definition + * @param {*} value Model property value + * @returns {ParameterizedSQL|*} Database column value. + * + */ +SqlConnector.prototype.toColumnValue = function(propertyDef, value) { + /*jshint unused:false */ + throw new Error('toColumnValue() must be implemented by the connector'); +}; + +/** + * Convert the data from database column to model property + * @param {object} propertyDef Model property definition + * @param {*) value Column value + * @returns {*} Model property value + */ +SqlConnector.prototype.fromColumnValue = function(propertyDef, value) { + /*jshint unused:false */ + throw new Error('fromColumnValue() must be implemented by the connector'); +}; +``` + +### Helpers to generate SQL statements and parse responses from DB drivers + +```js +/** + * Build a new SQL statement with pagination support by wrapping the given sql + * @param {String} model The model name + * @param {ParameterizedSQL} stmt The sql statement + * @param {Number} limit The maximum number of records to be fetched + * @param {Number} offset The offset to start fetching records + * @param {String[]} order The sorting criteria + */ +SqlConnector.prototype.applyPagination = function(model, stmt, filter) { + /*jshint unused:false */ + throw new Error('applyPagination() must be implemented by the connector'); +}; + +/** + * Parse the result for SQL UPDATE/DELETE/INSERT for the number of rows + * affected + * @param {String} model Model name + * @param {Object} info Status object + * @returns {Number} Number of rows affected + */ +SqlConnector.prototype.getCountForAffectedRows = function(model, info) { + /*jshint unused:false */ + throw new Error('getCountForAffectedRows() must be implemented by the connector'); +}; + +/** + * Parse the result for SQL INSERT for newly inserted id + * @param {String} model Model name + * @param {Object} info The status object from driver + * @returns {*} The inserted id value + */ +SqlConnector.prototype.getInsertedId = function(model, info) { + /*jshint unused:false */ + throw new Error('getInsertedId() must be implemented by the connector'); +}; + +/** + * Escape the name for the underlying database + * @param {String} name The name + * @returns {String} An escaped name for SQL + */ +SqlConnector.prototype.escapeName = function(name) { + /*jshint unused:false */ + throw new Error('escapeName() must be implemented by the connector'); +}; + +/** + * Escape the name for the underlying database + * @param {String} value The value to be escaped + * @returns {*} An escaped value for SQL + */ +SqlConnector.prototype.escapeValue = function(value) { + /*jshint unused:false */ + throw new Error('escapeValue() must be implemented by the connector'); +}; + +/** + * Get the place holder in SQL for identifiers, such as ?? + * @param {String} key Optional key, such as 1 or id + * @returns {String} The place holder + */ +SqlConnector.prototype.getPlaceholderForIdentifier = function(key) { + /*jshint unused:false */ + throw new Error('getPlaceholderForIdentifier() must be implemented by the connector'); +}; + +/** + * Get the place holder in SQL for values, such as :1 or ? + * @param {String} key Optional key, such as 1 or id + * @returns {String} The place holder + */ +SqlConnector.prototype.getPlaceholderForValue = function(key) { + /*jshint unused:false */ + throw new Error('getPlaceholderForValue() must be implemented by the connector'); +}; +``` + +### Override other methods + +There are a list of methods that serve as default implementations in the SqlConnector. +The connector can choose to override such methods to customize the behaviors. Please +see a complete list at http://apidocs.strongloop.com/loopback-connector/. + +## Implement database/model synchronization methods + +It's often desirable to apply model definitions to the underlying relational +database to provision or update schema objects so that they stay synchronized +with the model definitions. + +### automigrate and autoupdate + +There are two flavors: + +- automigrate - Drop existing schema objects if exist and create them based on +model definitions. Existing data will be lost. +- autoupdate - Detects the difference between schema objects and model +definitions, alters the database schema objects. Existing data will be kept. + +```js +/** + * Perform autoupdate for the given models + * @param {String[]} [models] A model name or an array of model names. + * If not present, apply to all models + * @param {Function} [cb] The callback function + */ +MySQL.prototype.autoupdate = function (models, cb) { + // ... +}; + +MySQL.prototype.automigrate = function (models, cb) { + // ... +}; +``` + +The `automigrate` and `autoupdate` operations are usually mapped to a sequence of +DDL statements. + +### Build a CREATE TABLE statement + +```js +/** + * Create a DB table for the given model + * @param {string} model Model name + * @param cb + */ +MySQL.prototype.createTable = function (model, cb) { + // ... +}; +``` + +### Check if models have corresponding tables + +```js +/** + * Check if the models exist + * @param {String[]} [models] A model name or an array of model names. If not + * present, apply to all models + * @param {Function} [cb] The callback function + */ +MySQL.prototype.isActual = function(models, cb) { + // ... +}; +``` + +### Alter a table + +```js +MySQL.prototype.alterTable = function (model, actualFields, actualIndexes, done, checkOnly) { + // ... +}; +``` + +### Build column definition clause for a given model + +```js +MySQL.prototype.buildColumnDefinitions = +MySQL.prototype.propertiesSQL = function (model) { + // ... +}; +``` + +### Build index definition clause for a given model property + +```js +MySQL.prototype.buildIndex = function(model, property) { + // ... +}; +``` + +### Build indexes for a given model + +```js +MySQL.prototype.buildIndexes = function(model) { + // ... +}; +``` + +### Build column definition for a given model property + +```js +MySQL.prototype.buildColumnDefinition = function(model, prop) { + // ... +}; +``` + +### Build column type for a given model property + +```js +MySQL.prototype.columnDataType = function (model, property) { + // ... +}; +``` + +## Implement model discovery from database schemas + +For relational databases that have schema definitions, the connector can +implement the discovery capability to reverse engineer database schemas into +model definitions. + +### Build a SQL statement to list schemas + +```js +/** + * Build sql for listing schemas (databases in MySQL) + * @params {Object} [options] Options object + * @returns {String} The SQL statement + */ + function querySchemas(options) { + // ... + } +``` + +### Build a SQL statement to list tables + +```js +/** + * Build sql for listing tables + * @param options {all: for all owners, owner|schema: for a given owner} + * @returns {string} The sql statement + */ + function queryTables(options) { + // ... + } +```js + +### Build a SQL statement to list views + +```js +/** + * Build sql for listing views + * @param options {all: for all owners, owner: for a given owner} + * @returns {string} The sql statement + */ + function queryViews(options) { + // ... + } +``` + +### Discover schemas + +```js + MySQL.prototype.discoverDatabaseSchemas = function(options, cb) { + // ... + }; +``` + +### Discover a list of models + +```js +/** + * Discover model definitions + * + * @param {Object} options Options for discovery + * @param {Function} [cb] The callback function + */ + MySQL.prototype.discoverModelDefinitions = function(options, cb) { + // ... + }; +``` + +### Discover a list of model properties for a given table + +```js +/** + * Discover model properties from a table + * @param {String} table The table name + * @param {Object} options The options for discovery + * @param {Function} [cb] The callback function + * + */ + MySQL.prototype.discoverModelProperties = function(table, options, cb) { + // ... + }; +``` + +### Discover primary keys for a given table + +```js +/** + * Discover primary keys for a given table + * @param {String} table The table name + * @param {Object} options The options for discovery + * @param {Function} [cb] The callback function + */ + MySQL.prototype.discoverPrimaryKeys = function(table, options, cb) { + // ... + }; +``` + +### Discover foreign keys for a given table + +```js +/** + * Discover foreign keys for a given table + * @param {String} table The table name + * @param {Object} options The options for discovery + * @param {Function} [cb] The callback function + */ + MySQL.prototype.discoverForeignKeys = function(table, options, cb) { + // ... + }; +``` + +### Discover exported foreign keys for a given table + +```js +/** + * Discover foreign keys that reference to the primary key of this table + * @param {String} table The table name + * @param {Object} options The options for discovery + * @param {Function} [cb] The callback function + */ + MySQL.prototype.discoverExportedForeignKeys = function(table, options, cb) { + // ... + }; + ``` + +### Discover indexes for a given table + +```js + MySQL.prototype.discoverIndexes = function(table, options, cb) { + // ... + }; +``` + +### Map column definition to model property definition + +```js + MySQL.prototype.buildPropertyType = function(columnDefinition) { + // ... + } +``` + +### Build SQL statements to discover database objects + +```js +/** + * Build the sql statement to query columns for a given table + * @param schema + * @param table + * @returns {String} The sql statement + */ + function queryColumns(schema, table) { + // ... + } + +/** + * Build the sql statement for querying primary keys of a given table + * @param schema + * @param table + * @returns {string} + */ + function queryPrimaryKeys(schema, table) { + // ... + } + +/** + * Build the sql statement for querying foreign keys of a given table + * @param schema + * @param table + * @returns {string} + */ + function queryForeignKeys(schema, table) { + // ... + } + +/** + * Retrieves a description of the foreign key columns that reference the + * given table's primary key columns (the foreign keys exported by a table). + * They are ordered by fkTableOwner, fkTableName, and keySeq. + * @param schema + * @param table + * @returns {string} + */ + function queryExportedForeignKeys(schema, table) { + // ... + } +``` \ No newline at end of file diff --git a/index.js b/index.js index 5c3f74d..92e0c3a 100644 --- a/index.js +++ b/index.js @@ -1,2 +1,4 @@ exports.Connector = require('./lib/connector'); -exports.SqlConnector = require('./lib/sql'); +// Set up SqlConnector as an alias to SQLConnector +exports.SQLConnector = exports.SqlConnector = require('./lib/sql'); +exports.ParameterizedSQL = exports.SQLConnector.ParameterizedSQL; diff --git a/lib/connector.js b/lib/connector.js index 3eb6c79..99e5d97 100644 --- a/lib/connector.js +++ b/lib/connector.js @@ -1,7 +1,9 @@ +var debug = require('debug')('loopback:connector'); + module.exports = Connector; /** - * Base class for LooopBack connector. This is more a collection of useful + * Base class for LoopBack connector. This is more a collection of useful * methods for connectors than a super class * @constructor */ @@ -17,6 +19,15 @@ function Connector(name, settings) { */ Connector.prototype.relational = false; +/** + * Check if the connector is for a relational DB + * @returns {Boolean} true for relational DB + */ +Connector.prototype.isRelational = function() { + return this.isRelational || + (this.getTypes().indexOf('rdbms') !== -1); +}; + /** * Get types associated with the connector * @returns {String[]} The types for the connector @@ -27,9 +38,11 @@ Connector.prototype.getTypes = function() { /** * Get the default data type for ID + * @param prop Property definition * @returns {Function} The default type for ID */ -Connector.prototype.getDefaultIdType = function() { +Connector.prototype.getDefaultIdType = function(prop) { + /*jshint unused:false */ return String; }; @@ -38,15 +51,16 @@ Connector.prototype.getDefaultIdType = function() { * @returns {Object} The metadata object * @property {String} type The type for the backend * @property {Function} defaultIdType The default id type - * @property {Boolean} [isRelational] If the connector represents a relational database + * @property {Boolean} [isRelational] If the connector represents a relational + * database * @property {Object} schemaForSettings The schema for settings object */ -Connector.prototype.getMedadata = function () { +Connector.prototype.getMetadata = function() { if (!this._metadata) { this._metadata = { types: this.getTypes(), defaultIdType: this.getDefaultIdType(), - isRelational: this.isRelational || (this.getTypes().indexOf('rdbms') !== -1), + isRelational: this.isRelational(), schemaForSettings: {} }; } @@ -55,13 +69,51 @@ Connector.prototype.getMedadata = function () { /** * Execute a command with given parameters - * @param {String} command The command such as SQL - * @param {Object[]} [params] An array of parameters + * @param {String|Object} command The command such as SQL + * @param {*[]} [params] An array of parameter values + * @param {Object} [options] Options object * @param {Function} [callback] The callback function */ -Connector.prototype.execute = function (command, params, callback) { - /*jshint unused:false */ - throw new Error('query method should be declared in connector'); +Connector.prototype.execute = function(command, params, options, callback) { + throw new Error('execute() must be implemented by the connector'); +}; + +/** + * Get the model definition by name + * @param {String} modelName The model name + * @returns {ModelDefinition} The model definition + */ +Connector.prototype.getModelDefinition = function(modelName) { + return this._models[modelName]; +}; + +/** + * Get connector specific settings for a given model, for example, + * ``` + * { + * "postgresql": { + * "schema": "xyz" + * } + * } + * ``` + * + * @param {String} modelName Model name + * @returns {Object} The connector specific settings + */ +Connector.prototype.getConnectorSpecificSettings = function(modelName) { + var settings = this.getModelDefinition(modelName).settings || {}; + return settings[this.name]; +}; + +/** + * Get model property definition + * @param {String} modelName Model name + * @param {String} propName Property name + * @returns {Object} Property definition + */ +Connector.prototype.getPropertyDefinition = function(modelName, propName) { + var model = this.getModelDefinition(modelName); + return model && model.properties[propName]; }; /** @@ -69,10 +121,10 @@ Connector.prototype.execute = function (command, params, callback) { * @param {String} model The model name * @returns {DataSource} The data source */ -Connector.prototype.getDataSource = function (model) { - var m = this._models[model]; +Connector.prototype.getDataSource = function(model) { + var m = this.getModelDefinition(model); if (!m) { - console.trace('Model not found: ' + model); + debug('Model not found: ' + model); } return m && m.model.dataSource; }; @@ -82,7 +134,7 @@ Connector.prototype.getDataSource = function (model) { * @param {String} model The model name * @returns {String} The id property name */ -Connector.prototype.idName = function (model) { +Connector.prototype.idName = function(model) { return this.getDataSource(model).idName(model); }; @@ -91,7 +143,7 @@ Connector.prototype.idName = function (model) { * @param {String} model The model name * @returns {[String]} The id property names */ -Connector.prototype.idNames = function (model) { +Connector.prototype.idNames = function(model) { return this.getDataSource(model).idNames(model); }; @@ -102,8 +154,8 @@ Connector.prototype.idNames = function (model) { * @returns {Number} The id index, undefined if the property is not part * of the primary key */ -Connector.prototype.id = function (model, prop) { - var p = this._models[model].properties[prop]; +Connector.prototype.id = function(model, prop) { + var p = this.getModelDefinition(model).properties[prop]; return p && p.id; }; @@ -111,10 +163,8 @@ Connector.prototype.id = function (model, prop) { * Hook to be called by DataSource for defining a model * @param {Object} modelDefinition The model definition */ -Connector.prototype.define = function (modelDefinition) { - if (!modelDefinition.settings) { - modelDefinition.settings = {}; - } +Connector.prototype.define = function(modelDefinition) { + modelDefinition.settings = modelDefinition.settings || {}; this._models[modelDefinition.model.modelName] = modelDefinition; }; @@ -122,18 +172,22 @@ Connector.prototype.define = function (modelDefinition) { * Hook to be called by DataSource for defining a model property * @param {String} model The model name * @param {String} propertyName The property name - * @param {Object} propertyDefinition The object for property metadata + * @param {Object} propertyDefinition The object for property definition */ -Connector.prototype.defineProperty = function (model, propertyName, propertyDefinition) { - this._models[model].properties[propertyName] = propertyDefinition; -}; +Connector.prototype.defineProperty = function(model, propertyName, propertyDefinition) { + var modelDef = this.getModelDefinition(model); + modelDef.properties[propertyName] = propertyDefinition; + }; /** * Disconnect from the connector + * @param {Function} [cb] Callback function */ Connector.prototype.disconnect = function disconnect(cb) { // NO-OP - if (cb) process.nextTick(cb); + if (cb) { + process.nextTick(cb); + } }; /** @@ -143,7 +197,7 @@ Connector.prototype.disconnect = function disconnect(cb) { * @returns {*} The id value * */ -Connector.prototype.getIdValue = function (model, data) { +Connector.prototype.getIdValue = function(model, data) { return data && data[this.idName(model)]; }; @@ -154,16 +208,69 @@ Connector.prototype.getIdValue = function (model, data) { * @param {*} value The id value * */ -Connector.prototype.setIdValue = function (model, data, value) { +Connector.prototype.setIdValue = function(model, data, value) { if (data) { data[this.idName(model)] = value; } }; -Connector.prototype.getType = function () { - return this.type; +/** + * Test if a property is nullable + * @param {Object} prop The property definition + * @returns {boolean} true if nullable + */ +Connector.prototype.isNullable = function(prop) { + if (prop.required || prop.id) { + return false; + } + if (prop.nullable || prop['null'] || prop.allowNull) { + return true; + } + if (prop.nullable === false || prop['null'] === false || + prop.allowNull === false) { + return false; + } + return true; }; +/** + * Return the DataAccessObject interface implemented by the connector + * @returns {Object} An object containing all methods implemented by the + * connector that can be mixed into the model class. It should be considered as + * the interface. + */ +Connector.prototype.getDataAccessObject = function() { + return this.DataAccessObject; +}; + +/*! + * Define aliases to a prototype method/property + * @param {Function} cls The class that owns the method/property + * @param {String} methodOrPropertyName The official property method/property name + * @param {String|String[]} aliases Aliases to the official property/method + */ +Connector.defineAliases = function(cls, methodOrPropertyName, aliases) { + if (typeof aliases === 'string') { + aliases = [aliases]; + } + if (Array.isArray(aliases)) { + aliases.forEach(function(alias) { + if (typeof alias === 'string') { + Object.defineProperty(cls, alias, { + get: function() { + return this[methodOrPropertyName]; + } + }); + } + }); + } +}; + +/** + * `command()` and `query()` are aliases to `execute()` + */ +Connector.defineAliases(Connector.prototype, 'execute', ['command', 'query']); + diff --git a/lib/parameterized-sql.js b/lib/parameterized-sql.js new file mode 100644 index 0000000..15d5bf0 --- /dev/null +++ b/lib/parameterized-sql.js @@ -0,0 +1,100 @@ +var assert = require('assert'); +var PLACEHOLDER = '?'; + +module.exports = ParameterizedSQL; + +/** + * A class for parameterized SQL clauses + * @param {String|Object} sql The SQL clause. If the value is a string, treat + * it as the template using `?` as the placeholder, for example, `(?,?)`. If + * the value is an object, treat it as {sql: '...', params: [...]} + * @param {*[]} params An array of parameter values. The length should match the + * number of placeholders in the template + * @returns {ParameterizedSQL} A new instance of ParameterizedSQL + * @constructor + */ +function ParameterizedSQL(sql, params) { + if (!(this instanceof ParameterizedSQL)) { + return new ParameterizedSQL(sql, params); + } + sql = sql || ''; + if (arguments.length === 1 && typeof sql === 'object') { + this.sql = sql.sql; + this.params = sql.params || []; + } else { + this.sql = sql; + this.params = params || []; + } + assert(typeof this.sql === 'string', 'sql must be a string'); + assert(Array.isArray(this.params), 'params must be an array'); + + var parts = this.sql.split(PLACEHOLDER); + assert(parts.length - 1 === this.params.length, + 'The number of ? (' + (parts.length - 1) + + ') in the sql (' + this.sql + ') must match the number of params (' + + this.params.length + + ') ' + this.params); +} + +/** + * Merge the parameterized sqls into the current instance + * @param {Object|Object[]} ps A parametered SQL or an array of parameterized + * SQLs + * @param {String} [separator] Separator, default to ` ` + * @returns {ParameterizedSQL} The current instance + */ +ParameterizedSQL.prototype.merge = function(ps, separator) { + if (Array.isArray(ps)) { + return this.constructor.append(this, + this.constructor.join(ps, separator), separator); + } else { + return this.constructor.append(this, ps, separator); + } +}; + +ParameterizedSQL.prototype.toJSON = function() { + return { + sql: this.sql, + params: this.params + }; +}; + +/** + * Append the statement into the current statement + * @param {Object} currentStmt The current SQL statement + * @param {Object} stmt The statement to be appended + * @param {String} [separator] Separator, default to ` ` + * @returns {*} The merged statement + */ +ParameterizedSQL.append = function(currentStmt, stmt, separator) { + currentStmt = (currentStmt instanceof ParameterizedSQL) ? + currentStmt : new ParameterizedSQL(currentStmt); + stmt = (stmt instanceof ParameterizedSQL) ? stmt : + new ParameterizedSQL(stmt); + separator = typeof separator === 'string' ? separator : ' '; + if (currentStmt.sql) { + currentStmt.sql += separator; + } + if (stmt.sql) { + currentStmt.sql += stmt.sql; + } + currentStmt.params = currentStmt.params.concat(stmt.params); + return currentStmt; +}; + +/** + * Join multiple parameterized SQLs into one + * @param {Object[]} sqls An array of parameterized SQLs + * @param {String} [separator] Separator, default to ` ` + * @returns {ParameterizedSQL} + */ +ParameterizedSQL.join = function(sqls, separator) { + assert(Array.isArray(sqls), 'sqls must be an array'); + var ps = new ParameterizedSQL('', []); + for (var i = 0, n = sqls.length; i < n; i++) { + this.append(ps, sqls[i], separator); + } + return ps; +}; + +ParameterizedSQL.PLACEHOLDER = PLACEHOLDER; diff --git a/lib/sql.js b/lib/sql.js index 29b4617..440884b 100644 --- a/lib/sql.js +++ b/lib/sql.js @@ -2,105 +2,184 @@ var util = require('util'); var async = require('async'); var assert = require('assert'); var Connector = require('./connector'); +var debug = require('debug')('loopback:connector:sql'); +var ParameterizedSQL = require('./parameterized-sql'); -module.exports = SqlConnector; +module.exports = SQLConnector; /** - * Base class for connectors that are backed by relational databases/SQL + * Base class for connectors that connect to relational databases using SQL * @class */ -function SqlConnector() { +function SQLConnector() { + // Call the super constructor Connector.apply(this, [].slice.call(arguments)); } -util.inherits(SqlConnector, Connector); +// Inherit from the base Connector +util.inherits(SQLConnector, Connector); + +// Export ParameterizedSQL +SQLConnector.ParameterizedSQL = ParameterizedSQL; + +// The generic placeholder +var PLACEHOLDER = SQLConnector.PLACEHOLDER = ParameterizedSQL.PLACEHOLDER; /** * Set the relational property to indicate the backend is a relational DB * @type {boolean} */ -SqlConnector.prototype.relational = true; +SQLConnector.prototype.relational = true; + +/** + * Invoke a prototype method on the super class + * @param {String} methodName Method name + */ +SQLConnector.prototype.invokeSuper = function(methodName) { + var args = [].slice.call(arguments, 1); + var superMethod = this.constructor.super_.prototype[methodName]; + return superMethod.apply(this, args); +}; /** * Get types associated with the connector * Returns {String[]} The types for the connector */ -SqlConnector.prototype.getTypes = function() { +SQLConnector.prototype.getTypes = function() { return ['db', 'rdbms', 'sql']; }; -/*! +/** * Get the default data type for ID + * @param prop Property definition * Returns {Function} */ -SqlConnector.prototype.getDefaultIdType = function() { +SQLConnector.prototype.getDefaultIdType = function(prop) { + /*jshint unused:false */ return Number; }; -SqlConnector.prototype.query = function () { - throw new Error('query method should be declared in connector'); -}; - -SqlConnector.prototype.command = function (sql, params, callback) { - return this.query(sql, params, callback); -}; - -SqlConnector.prototype.queryOne = function (sql, callback) { - return this.query(sql, function (err, data) { - if (err) { - return callback(err); - } - callback(err, data && data[0]); - }); +/** + * Get the default database schema name + * @returns {string} The default schema name, such as 'public' or 'dbo' + */ +SQLConnector.prototype.getDefaultSchemaName = function() { + return ''; }; /** - * Get the table name for a given model. + * Get the database schema name for the given model. The schema name can be + * customized at model settings or connector configuration level as `schema` or + * `schemaName`. For example, + * + * ```json + * "Customer": { + * "name": "Customer", + * "mysql": { + * "schema": "MYDB", + * "table": "CUSTOMER" + * } + * } + * ``` + * + * @param {String} model The model name + * @returns {String} The database schema name + */ +SQLConnector.prototype.schema = function(model) { + // Check if there is a 'schema' property for connector + var dbMeta = this.getConnectorSpecificSettings(model); + var schemaName = (dbMeta && (dbMeta.schema || dbMeta.schemaName)) || + (this.settings.schema || this.settings.schemaName) || + this.getDefaultSchemaName(); + return schemaName; +}; + +/** + * Get the table name for the given model. The table name can be customized + * at model settings as `table` or `tableName`. For example, + * + * ```json + * "Customer": { + * "name": "Customer", + * "mysql": { + * "table": "CUSTOMER" + * } + * } + * ``` + * * Returns the table name (String). * @param {String} model The model name */ -SqlConnector.prototype.table = function (model) { - var name = this.getDataSource(model).tableName(model); - var dbName = this.dbName; - if (typeof dbName === 'function') { - name = dbName(name); +SQLConnector.prototype.table = function(model) { + var dbMeta = this.getConnectorSpecificSettings(model); + var tableName; + if (dbMeta) { + tableName = dbMeta.table || dbMeta.tableName; + if (tableName) { + // Explicit table name, return as-is + return tableName; + } } - return name; + tableName = model; + if (typeof this.dbName === 'function') { + tableName = this.dbName(tableName); + } + return tableName; }; /** - * Get the column name for given model property + * Get the column name for the given model property. The column name can be + * customized at the model property definition level as `column` or + * `columnName`. For example, + * + * ```json + * "name": { + * "type": "string", + * "mysql": { + * "column": "NAME" + * } + * } + * ``` + * * @param {String} model The model name * @param {String} property The property name * @returns {String} The column name */ -SqlConnector.prototype.column = function (model, property) { - var name = this.getDataSource(model).columnName(model, property); - var dbName = this.dbName; - if (typeof dbName === 'function') { - name = dbName(name); +SQLConnector.prototype.column = function(model, property) { + var prop = this.getPropertyDefinition(model, property); + var columnName; + if (prop && prop[this.name]) { + columnName = prop[this.name].column || prop[this.name].columnName; + if (columnName) { + // Explicit column name, return as-is + return columnName; + } } - return name; + columnName = property; + if (typeof this.dbName === 'function') { + columnName = this.dbName(columnName); + } + return columnName; }; /** - * Get the column name for given model property + * Get the column metadata for the given model property * @param {String} model The model name * @param {String} property The property name * @returns {Object} The column metadata */ -SqlConnector.prototype.columnMetadata = function (model, property) { +SQLConnector.prototype.columnMetadata = function(model, property) { return this.getDataSource(model).columnMetadata(model, property); }; /** - * Get the corresponding property name for a given column name + * Get the corresponding property name for the given column name * @param {String} model The model name * @param {String} column The column name * @returns {String} The property name for a given column */ -SqlConnector.prototype.propertyName = function (model, column) { - var props = this._models[model].properties; +SQLConnector.prototype.propertyName = function(model, column) { + var props = this.getModelDefinition(model).properties; for (var p in props) { if (this.column(model, p) === column) { return p; @@ -112,9 +191,9 @@ SqlConnector.prototype.propertyName = function (model, column) { /** * Get the id column name * @param {String} model The model name - * @returns {String} The column name + * @returns {String} The id column name */ -SqlConnector.prototype.idColumn = function (model) { +SQLConnector.prototype.idColumn = function(model) { var name = this.getDataSource(model).idColumnName(model); var dbName = this.dbName; if (typeof dbName === 'function') { @@ -128,17 +207,8 @@ SqlConnector.prototype.idColumn = function (model) { * @param {String} model The model name * @returns {String} the escaped id column name */ -SqlConnector.prototype.idColumnEscaped = function (model) { - return this.escapeName(this.getDataSource(model).idColumnName(model)); -}; - -/** - * Escape the name for the underlying database - * @param {String} name The name - */ -SqlConnector.prototype.escapeName = function (name) { - /*jshint unused:false */ - throw new Error('escapeName method should be declared in connector'); +SQLConnector.prototype.idColumnEscaped = function(model) { + return this.escapeName(this.idColumn(model)); }; /** @@ -146,7 +216,7 @@ SqlConnector.prototype.escapeName = function (name) { * @param {String} model The model name * @returns {String} the escaped table name */ -SqlConnector.prototype.tableEscaped = function (model) { +SQLConnector.prototype.tableEscaped = function(model) { return this.escapeName(this.table(model)); }; @@ -156,200 +226,913 @@ SqlConnector.prototype.tableEscaped = function (model) { * @param {String} property The property name * @returns {String} The escaped column name */ -SqlConnector.prototype.columnEscaped = function (model, property) { +SQLConnector.prototype.columnEscaped = function(model, property) { return this.escapeName(this.column(model, property)); }; -function isIdValuePresent(idValue, callback, returningNull) { +/*! + * Check if id value is set + * @param idValue + * @param cb + * @param returningNull + * @returns {boolean} + */ +function isIdValuePresent(idValue, cb, returningNull) { try { assert(idValue !== null && idValue !== undefined, 'id value is required'); return true; } catch (err) { - process.nextTick(function () { - if(callback) callback(returningNull ? null: err); + process.nextTick(function() { + if (cb) cb(returningNull ? null : err); }); return false; } } + /** - * Save the model instance into the backend store + * Convert the id value to the form required by database column + * @param {String} model The model name + * @param {*} idValue The id property value + * @returns {*} The escaped id column value + */ +SQLConnector.prototype.idColumnValue = function(model, idValue) { + var idProp = this.getDataSource(model).idProperty(model); + if (typeof this.toColumnValue === 'function') { + return this.toColumnValue(idProp, idValue); + } else { + return idValue; + } +}; + +/** + * Replace `?` with connector specific placeholders. For example, + * + * ``` + * {sql: 'SELECT * FROM CUSTOMER WHERE NAME=?', params: ['John']} + * ==> + * {sql: 'SELECT * FROM CUSTOMER WHERE NAME=:1', params: ['John']} + * ``` + * *LIMITATION*: We don't handle the ? inside escaped values, for example, + * `SELECT * FROM CUSTOMER WHERE NAME='J?hn'` will not be parameterized + * correctly. + * + * @param {ParameterizedSQL|Object} ps Parameterized SQL + * @returns {ParameterizedSQL} Parameterized SQL with the connector specific + * placeholders + */ +SQLConnector.prototype.parameterize = function(ps) { + ps = new ParameterizedSQL(ps); + + // The value is parameterized, for example + // {sql: 'to_point(?,?)', values: [1, 2]} + var parts = ps.sql.split(PLACEHOLDER); + var clause = []; + for (var j = 0, m = parts.length; j < m; j++) { + // Replace ? with the keyed placeholder, such as :5 + clause.push(parts[j]); + if (j !== parts.length - 1) { + clause.push(this.getPlaceholderForValue(j + 1)); + } + } + ps.sql = clause.join(''); + return ps; +}; + +/** + * Build the the `INSERT INTO` statement + * @param {String} model The model name + * @param {Object} fields Fields to be inserted + * @param {Object} options Options object + * @returns {ParameterizedSQL} + */ +SQLConnector.prototype.buildInsertInto = function(model, fields, options) { + var stmt = new ParameterizedSQL('INSERT INTO ' + this.tableEscaped(model)); + var columnNames = fields.names.join(','); + if (columnNames) { + stmt.merge('(' + columnNames + ')', ''); + } + return stmt; +}; + +/** + * Build the clause to return id values after insert + * @param {String} model The model name + * @param {Object} data The model data object + * @param {Object} options Options object + * @returns {string} + */ +SQLConnector.prototype.buildInsertReturning = function(model, data, options) { + return ''; +}; + +/** + * Build the clause for default values if the fields is empty + * @param {String} model The model name + * @param {Object} data The model data object + * @param {Object} options Options object + * @returns {string} 'DEFAULT VALUES' + */ +SQLConnector.prototype.buildInsertDefaultValues = function(model, data, options) { + return 'VALUES()'; +}; + +/** + * Build INSERT SQL statement + * @param {String} model The model name + * @param {Object} data The model data object + * @param {Object} options The options object + * @returns {string} The INSERT SQL statement + */ +SQLConnector.prototype.buildInsert = function(model, data, options) { + var fields = this.buildFields(model, data); + var insertStmt = this.buildInsertInto(model, fields, options); + var columnValues = fields.columnValues; + var fieldNames = fields.names; + if (fieldNames.length) { + var values = ParameterizedSQL.join(columnValues, ','); + values.sql = 'VALUES(' + values.sql + ')'; + insertStmt.merge(values); + } else { + insertStmt.merge(this.buildInsertDefaultValues(model, data, options)); + } + var returning = this.buildInsertReturning(model, data, options); + if (returning) { + insertStmt.merge(returning); + } + return this.parameterize(insertStmt); +}; + +/** + * Execute a SQL statement with given parameters. + * + * @param {String} sql The SQL statement + * @param {*[]} [params] An array of parameter values + * @param {Object} [options] Options object + * @param {Function} [callback] The callback function + */ +SQLConnector.prototype.execute = function(sql, params, options, callback) { + assert(typeof sql === 'string', 'sql must be a string'); + if (typeof params === 'function' && options === undefined && + callback === undefined) { + // execute(sql, callback) + options = {}; + callback = params; + params = []; + } else if (typeof options === 'function' && callback === undefined) { + // execute(sql, params, callback) + callback = options; + options = {}; + } + params = params || []; + options = options || {}; + assert(Array.isArray(params), 'params must be an array'); + assert(typeof options === 'object', 'options must be an object'); + assert(typeof callback === 'function', 'callback must be a function'); + + var self = this; + if (!this.dataSource.connected) { + return this.dataSource.once('connected', function() { + self.execute(sql, params, options, callback); + }); + } + this.executeSQL(sql, params, options, callback); +}; + +/** + * Create the data model in MySQL + * * @param {String} model The model name * @param {Object} data The model instance data - * @param {Function} callback The callback function + * @param {Object} options Options object + * @param {Function} [callback] The callback function */ -SqlConnector.prototype.save = function (model, data, callback) { - var idName = this.getDataSource(model).idName(model); +SQLConnector.prototype.create = function(model, data, options, callback) { + var self = this; + var stmt = this.buildInsert(model, data, options); + this.execute(stmt.sql, stmt.params, options, function(err, info) { + if (err) { + callback(err); + } else { + var insertedId = self.getInsertedId(model, info); + callback(err, insertedId); + } + }); +}; + +/** + * Save the model instance into the database + * @param {String} model The model name + * @param {Object} data The model instance data + * @param {Object} options Options object + * @param {Function} cb The callback function + */ +SQLConnector.prototype.save = function(model, data, options, cb) { + var idName = this.idName(model); var idValue = data[idName]; - if (!isIdValuePresent(idValue, callback)) { + if (!isIdValuePresent(idValue, cb)) { return; } - idValue = this._escapeIdValue(model, idValue); - var sql = 'UPDATE ' + this.tableEscaped(model) + ' SET ' + - this.toFields(model, data) + - ' WHERE ' + this.idColumnEscaped(model) + ' = ' + idValue; + var where = {}; + where[idName] = idValue; - this.query(sql, function (err, result) { - if (callback) callback(err, result); - }); + var updateStmt = new ParameterizedSQL('UPDATE ' + this.tableEscaped(model)); + updateStmt.merge(this.buildFieldsForUpdate(model, data)); + var whereStmt = this.buildWhere(model, where); + updateStmt.merge(whereStmt); + updateStmt = this.parameterize(updateStmt); + this.execute(updateStmt.sql, updateStmt.params, options, + function(err, result) { + if (cb) cb(err, result); + }); }; /** * Check if a model instance exists for the given id value * @param {String} model The model name * @param {*} id The id value - * @param {Function} callback The callback function + * @param {Object} options Options object + * @param {Function} cb The callback function */ -SqlConnector.prototype.exists = function (model, id, callback) { - if (!isIdValuePresent(id, callback, true)) { +SQLConnector.prototype.exists = function(model, id, options, cb) { + if (!isIdValuePresent(id, cb, true)) { return; } - var sql = 'SELECT 1 FROM ' + - this.tableEscaped(model) + ' WHERE ' + - this.idColumnEscaped(model) + ' = ' + this._escapeIdValue(model, id) + - ' LIMIT 1'; + var idName = this.idName(model); + var where = {}; + where[idName] = id; + var selectStmt = new ParameterizedSQL( + 'SELECT 1 FROM ' + this.tableEscaped(model) + + ' WHERE ' + this.idColumnEscaped(model) + ); + selectStmt.merge(this.buildWhere(model, where)); - this.query(sql, function (err, data) { - if (!callback) return; + selectStmt = this.applyPagination(model, selectStmt, { + limit: 1, + offset: 0, + order: [idName] + }); + selectStmt = this.parameterize(selectStmt); + + this.execute(selectStmt.sql, selectStmt.params, options, function(err, data) { + if (!cb) return; if (err) { - callback(err); + cb(err); } else { - callback(null, data.length >= 1); + cb(null, data.length >= 1); } }); }; /** - * Find a model instance by id - * @param {String} model The model name - * @param {*} id The id value - * @param {Function} callback The callback function - */ -SqlConnector.prototype.find = function find(model, id, callback) { - if (!isIdValuePresent(id, callback, true)) { - return; - } - var self = this; - var idQuery = this.idColumnEscaped(model) + ' = ' + this._escapeIdValue(model, id); - var sql = 'SELECT * FROM ' + - this.tableEscaped(model) + ' WHERE ' + idQuery + ' LIMIT 1'; - - this.query(sql, function (err, data) { - var result = (data && data.length >= 1) ? data[0] : null; - if (callback) callback(err, self.fromDatabase(model, result)); - }); -}; - -/** + * ATM, this method is not used by loopback-datasource-juggler dao, which + * maps `destroy` to `destroyAll` with a `where` filter that includes the `id` + * instead. + * * Delete a model instance by id value * @param {String} model The model name * @param {*} id The id value - * @param {Function} callback The callback function + * @param {Object} options Options object + * @param {Function} cb The callback function + * @private */ -SqlConnector.prototype.delete = -SqlConnector.prototype.destroy = function destroy(model, id, callback) { - if (!isIdValuePresent(id, callback, true)) { +SQLConnector.prototype.destroy = function(model, id, options, cb) { + if (!isIdValuePresent(id, cb, true)) { return; } - var sql = 'DELETE FROM ' + this.tableEscaped(model) + ' WHERE ' + - this.idColumnEscaped(model) + ' = ' + this._escapeIdValue(model, id); - - this.command(sql, function (err, result) { - if (callback) callback(err, result); - }); + var idName = this.idName(model); + var where = {}; + where[idName] = id; + this.destroyAll(model, where, options, cb); }; - -SqlConnector.prototype._escapeIdValue = function(model, idValue) { - var idProp = this.getDataSource(model).idProperty(model); - if(typeof this.toDatabase === 'function') { - return this.toDatabase(idProp, idValue); - } else { - if(idProp.type === Number) { - return idValue; - } else { - return '\'' + idValue + '\''; - } - } -}; - -function buildWhere(self, model, where) { - if (typeof self.buildWhere === 'function') { - return self.buildWhere(model, where); - } else { - var props = self._models[model].properties; - var cs = []; - Object.keys(where || {}).forEach(function (key) { - var keyEscaped = self.columnEscaped(model, key); - if (where[key] === null) { - cs.push(keyEscaped + ' IS NULL'); - } else { - cs.push(keyEscaped + ' = ' + self.toDatabase(props[key], where[key])); - } - }); - return cs.length ? ' WHERE ' + cs.join(' AND ') : ''; - } -} +// Alias to `destroy`. Juggler checks `destroy` only. +Connector.defineAliases(SQLConnector.prototype, 'destroy', + ['delete', 'deleteById', 'destroyById']); /** - * Delete all model instances + * Build the `DELETE FROM` SQL statement + * @param {String} model The model name + * @param {Object} where The where object + * @param {Object} options Options object + * @returns {ParameterizedSQL} The SQL DELETE FROM statement + */ +SQLConnector.prototype.buildDelete = function(model, where, options) { + var deleteStmt = new ParameterizedSQL('DELETE FROM ' + + this.tableEscaped(model)); + deleteStmt.merge(this.buildWhere(model, where)); + return this.parameterize(deleteStmt); +}; + +/** + * Delete all matching model instances * * @param {String} model The model name - * @param {Function} callback The callback function + * @param {Object} where The where object + * @param {Object} options The options object + * @param {Function} cb The callback function */ -SqlConnector.prototype.deleteAll = - SqlConnector.prototype.destroyAll = function destroyAll(model, where, callback) { - this.command('DELETE FROM ' + this.tableEscaped(model) + - buildWhere(this, model, where), function (err, result) { - if (callback) { - callback(err, result); +SQLConnector.prototype.destroyAll = function(model, where, options, cb) { + var self = this; + var stmt = this.buildDelete(model, where, options); + this.execute(stmt.sql, stmt.params, options, function(err, info) { + var affectedRows = self.getCountForAffectedRows(model, info); + if (cb) { + cb(err, {count: affectedRows}); + } + }); +}; +// Alias to `destroyAll`. Juggler checks `destroyAll` only. +Connector.defineAliases(SQLConnector.prototype, 'destroyAll', ['deleteAll']); + +/** + * ATM, this method is not used by loopback-datasource-juggler dao, which + * maps `updateAttributes` to `update` with a `where` filter that includes the + * `id` instead. + * + * Update attributes for a given model instance + * @param {String} model The model name + * @param {*} id The id value + * @param {Object} data The model data instance containing all properties to + * be updated + * @param {Object} options Options object + * @param {Function} cb The callback function + * @private + */ +SQLConnector.prototype.updateAttributes = function(model, id, data, options, cb) { + if (!isIdValuePresent(id, cb)) { + return; + } + var idName = this.idName(model); + delete data[idName]; + var where = {}; + where[idName] = id; + this.updateAll(model, where, data, options, cb); +}; + +/** + * Build the UPDATE statement + * @param {String} model The model name + * @param {Object} where The where object + * @param {Object} data The data to be changed + * @param {Object} options The options object + * @param {Function} cb The callback function + * @returns {ParameterizedSQL} The UPDATE SQL statement + */ +SQLConnector.prototype.buildUpdate = function(model, where, data, options) { + var fields = this.buildFieldsForUpdate(model, data); + var updateClause = new ParameterizedSQL('UPDATE ' + this.tableEscaped(model)); + var whereClause = this.buildWhere(model, where); + updateClause.merge([fields, whereClause]); + return this.parameterize(updateClause); +}; + +/** + * Update all instances that match the where clause with the given data + * @param {String} model The model name + * @param {Object} where The where object + * @param {Object} data The property/value object representing changes + * to be made + * @param {Object} options The options object + * @param {Function} cb The callback function + */ +SQLConnector.prototype.update = function(model, where, data, options, cb) { + var self = this; + var stmt = this.buildUpdate(model, where, data, options); + this.execute(stmt.sql, stmt.params, options, function(err, info) { + var affectedRows = self.getCountForAffectedRows(model, info); + if (cb) { + cb(err, {count: affectedRows}); + } + }); +}; +// Alias to `update`. Juggler checks `update` only. +Connector.defineAliases(SQLConnector.prototype, 'update', ['updateAll']); + +/** + * Build the SQL WHERE clause for the where object + * @param {string} model Model name + * @param {object} where An object for the where conditions + * @returns {ParameterizedSQL} The SQL WHERE clause + */ +SQLConnector.prototype.buildWhere = function(model, where) { + var whereClause = this._buildWhere(model, where); + if (whereClause.sql) { + whereClause.sql = 'WHERE ' + whereClause.sql; + } + return whereClause; +}; + +/** + * Build SQL expression + * @param {String} columnName Escaped column name + * @param {String} operator SQL operator + * @param {*} columnValue Column value + * @param {*} propertyValue Property value + * @returns {ParameterizedSQL} The SQL expression + */ +SQLConnector.prototype.buildExpression = function(columnName, operator, columnValue, propertyValue) { + function buildClause(columnValue, separator, grouping) { + var values = []; + for (var i = 0, n = columnValue.length; i < n; i++) { + if (columnValue instanceof ParameterizedSQL) { + values.push(columnValue[i]); + } else { + values.push(new ParameterizedSQL(PLACEHOLDER, [columnValue[i]])); + } + } + separator = separator || ','; + var clause = ParameterizedSQL.join(values, separator); + if (grouping) { + clause.sql = '(' + clause.sql + ')'; + } + return clause; + } + + var sqlExp = columnName; + var clause; + if (columnValue instanceof ParameterizedSQL) { + clause = columnValue; + } else { + clause = new ParameterizedSQL(PLACEHOLDER, [columnValue]); + } + switch (operator) { + case 'gt': + sqlExp += '>'; + break; + case 'gte': + sqlExp += '>='; + break; + case 'lt': + sqlExp += '<'; + break; + case 'lte': + sqlExp += '<='; + break; + case 'between': + sqlExp += ' BETWEEN '; + clause = buildClause(columnValue, ' AND ', false); + break; + case 'inq': + sqlExp += ' IN '; + clause = buildClause(columnValue, ',', true); + break; + case 'nin': + sqlExp += ' NOT IN '; + clause = buildClause(columnValue, ',', true); + break; + case 'neq': + if (columnValue == null) { + return new ParameterizedSQL(sqlExp + ' IS NOT NULL'); + } + sqlExp += '!='; + break; + case 'like': + sqlExp += ' LIKE '; + break; + case 'nlike': + sqlExp += ' NOT LIKE '; + break; + } + var stmt = ParameterizedSQL.join([sqlExp, clause], ''); + return stmt; +}; + +/*! + * @param model + * @param where + * @returns {ParameterizedSQL} + * @private + */ +SQLConnector.prototype._buildWhere = function(model, where) { + if (!where) { + return new ParameterizedSQL(''); + } + if (typeof where !== 'object' || Array.isArray(where)) { + debug('Invalid value for where: %j', where); + return new ParameterizedSQL(''); + } + var self = this; + var props = self.getModelDefinition(model).properties; + + var whereStmts = []; + for (var key in where) { + var stmt = new ParameterizedSQL('', []); + // Handle and/or operators + if (key === 'and' || key === 'or') { + var branches = []; + var branchParams = []; + var clauses = where[key]; + if (Array.isArray(clauses)) { + for (var i = 0, n = clauses.length; i < n; i++) { + var stmtForClause = self._buildWhere(model, clauses[i]); + stmtForClause.sql = '(' + stmtForClause.sql + ')'; + branchParams = branchParams.concat(stmtForClause.params); + branches.push(stmtForClause.sql); + } + stmt.merge({ + sql: branches.join(' ' + key.toUpperCase() + ' '), + params: branchParams + }); + whereStmts.push(stmt); + continue; + } + // The value is not an array, fall back to regular fields + } + var columnName = self.columnEscaped(model, key); + var expression = where[key]; + var columnValue; + var sqlExp; + if (expression === null || expression === undefined) { + stmt.merge(columnName + ' IS NULL'); + } else if (expression && + (typeof expression === 'object' && !Array.isArray(expression))) { + var operator = Object.keys(expression)[0]; + // Get the expression without the operator + expression = expression[operator]; + if (operator === 'inq' || operator === 'nin' || operator === 'between') { + columnValue = []; + if (Array.isArray(expression)) { + // Column value is a list + for (var j = 0, m = expression.length; j < m; j++) { + columnValue.push(this.toColumnValue(props[key], expression[j])); + } + } else { + columnValue.push(this.toColumnValue(props[key], expression)); + } + if (operator === 'between') { + // BETWEEN v1 AND v2 + var v1 = columnValue[0] === undefined ? null : columnValue[0]; + var v2 = columnValue[1] === undefined ? null : columnValue[1]; + columnValue = [v1, v2]; + } else { + // IN (v1,v2,v3) or NOT IN (v1,v2,v3) + if (columnValue.length === 0) { + if (operator === 'inq') { + columnValue = [null]; + } else { + // nin () is true + continue; + } + } + } + } else { + columnValue = this.toColumnValue(props[key], expression); + } + sqlExp = self.buildExpression( + columnName, operator, columnValue, props[key]); + stmt.merge(sqlExp); + } else { + // The expression is the field value, not a condition + columnValue = self.toColumnValue(props[key], expression); + if (columnValue === null) { + stmt.merge(columnName + ' IS NULL'); + } else { + if (columnValue instanceof ParameterizedSQL) { + stmt.merge(columnName + '=').merge(columnValue); + } else { + stmt.merge({ + sql: columnName + '=?', + params: [columnValue] + }); + } + } + } + whereStmts.push(stmt); + } + var params = []; + var sqls = []; + for (var k = 0, s = whereStmts.length; k < s; k++) { + sqls.push(whereStmts[k].sql); + params = params.concat(whereStmts[k].params); + } + var whereStmt = new ParameterizedSQL({ + sql: sqls.join(' AND '), + params: params + }); + return whereStmt; +}; + +/** + * Build the ORDER BY clause + * @param {string} model Model name + * @param {string[]} order An array of sorting criteria + * @returns {string} The ORDER BY clause + */ +SQLConnector.prototype.buildOrderBy = function(model, order) { + if (!order) { + return ''; + } + var self = this; + if (typeof order === 'string') { + order = [order]; + } + var clauses = []; + for (var i = 0, n = order.length; i < n; i++) { + var t = order[i].split(/[\s,]+/); + if (t.length === 1) { + clauses.push(self.columnEscaped(model, order[i])); + } else { + clauses.push(self.columnEscaped(model, t[0]) + ' ' + t[1]); + } + } + return 'ORDER BY ' + clauses.join(','); +}; + +/** + * Build an array of fields for the database operation + * @param {String} model Model name + * @param {Object} data Model data object + * @param {Boolean} excludeIds Exclude id properties or not, default to false + * @returns {{names: Array, values: Array, properties: Array}} + */ +SQLConnector.prototype.buildFields = function(model, data, excludeIds) { + var fields = { + names: [], // field names + columnValues: [], // an array of ParameterizedSQL + properties: [] // model properties + }; + var props = this.getModelDefinition(model).properties; + var keys = Object.keys(data); + for (var i = 0, n = keys.length; i < n; i++) { + var key = keys[i]; + var p = props[key]; + if (excludeIds && p.id) { + continue; + } + if (p) { + var k = this.columnEscaped(model, key); + var v = this.toColumnValue(p, data[key]); + if (v !== undefined) { + fields.names.push(k); + if (v instanceof ParameterizedSQL) { + fields.columnValues.push(v); + } else { + fields.columnValues.push(new ParameterizedSQL(PLACEHOLDER, [v])); + } + fields.properties.push(p); + } + } + } + return fields; +}; + +/** + * Build the SET clause for database update + * @param {String} model Model na + * @param {Object} data The model data object + * @param {Boolean} excludeIds Exclude id properties or not, default to true + * @returns {string} The list of fields for update + */ +SQLConnector.prototype.buildFieldsForUpdate = function(model, data, excludeIds) { + if (excludeIds === undefined) { + excludeIds = true; + } + var fields = this.buildFields(model, data, excludeIds); + var columns = new ParameterizedSQL(''); + for (var i = 0, n = fields.names.length; i < n; i++) { + var clause = ParameterizedSQL.append(fields.names[i], + fields.columnValues[i], '='); + columns.merge(clause, ','); + } + columns.sql = 'SET ' + columns.sql; + return columns; +}; + +/** + * Build a list of escaped column names for the given model and fields filter + * @param {string} model Model name + * @param {object} filter The filter object + * @returns {string} Comma separated string of escaped column names + */ +SQLConnector.prototype.buildColumnNames = function(model, filter) { + var fieldsFilter = filter && filter.fields; + var cols = this.getModelDefinition(model).properties; + if (!cols) { + return '*'; + } + var self = this; + var keys = Object.keys(cols); + if (Array.isArray(fieldsFilter) && fieldsFilter.length > 0) { + // No empty array, including all the fields + keys = fieldsFilter; + } else if ('object' === typeof fieldsFilter && + Object.keys(fieldsFilter).length > 0) { + // { field1: boolean, field2: boolean ... } + var included = []; + var excluded = []; + keys.forEach(function(k) { + if (fieldsFilter[k]) { + included.push(k); + } else if ((k in fieldsFilter) && !fieldsFilter[k]) { + excluded.push(k); } }); - }; + if (included.length > 0) { + keys = included; + } else if (excluded.length > 0) { + excluded.forEach(function(e) { + var index = keys.indexOf(e); + keys.splice(index, 1); + }); + } + } + var names = keys.map(function(c) { + return self.columnEscaped(model, c); + }); + return names.join(','); +}; + +/** + * Build a SQL SELECT statement + * @param {String} model Model name + * @param {Object} filter Filter object + * @param {Object} options Options object + * @returns {ParameterizedSQL} Statement object {sql: ..., params: [...]} + */ +SQLConnector.prototype.buildSelect = function(model, filter, options) { + if (!filter.order) { + var idNames = this.idNames(model); + if (idNames && idNames.length) { + filter.order = idNames; + } + } + + var selectStmt = new ParameterizedSQL('SELECT ' + + this.buildColumnNames(model, filter) + + ' FROM ' + this.tableEscaped(model) + ); + + if (filter) { + + if (filter.where) { + var whereStmt = this.buildWhere(model, filter.where); + selectStmt.merge(whereStmt); + } + + if (filter.order) { + selectStmt.merge(this.buildOrderBy(model, filter.order)); + } + + if (filter.limit || filter.skip || filter.offset) { + selectStmt = this.applyPagination( + model, selectStmt, filter); + } + + } + return this.parameterize(selectStmt); +}; + +/** + * Transform the row data into a model data object + * @param {string} model Model name + * @param {object} rowData An object representing the row data from DB + * @returns {object} Model data object + */ +SQLConnector.prototype.fromRow = SQLConnector.prototype.fromDatabase = function(model, rowData) { + if (rowData == null) { + return rowData; + } + var props = this.getModelDefinition(model).properties; + var data = {}; + for (var p in props) { + var columnName = this.column(model, p); + // Load properties from the row + var columnValue = this.fromColumnValue(props[p], rowData[columnName]); + if (columnValue !== undefined) { + data[p] = columnValue; + } + } + return data; +}; + +/** + * Find matching model instances by the filter + * + * Please also note the name `all` is confusing. `Model.find` is to find all + * matching instances while `Model.findById` is to find an instance by id. On + * the other hand, `Connector.prototype.all` implements `Model.find` while + * `Connector.prototype.find` implements `Model.findById` due to the `bad` + * naming convention we inherited from juggling-db. + * + * @param {String} model The model name + * @param {Object} filter The filter + * @param {Function} [cb] The cb function + */ +SQLConnector.prototype.all = function find(model, filter, options, cb) { + var self = this; + // Order by id if no order is specified + filter = filter || {}; + var stmt = this.buildSelect(model, filter, options); + this.execute(stmt.sql, stmt.params, options, function(err, data) { + if (err) { + return cb(err, []); + } + + var objs = data.map(function(obj) { + return self.fromRow(model, obj); + }); + if (filter && filter.include) { + self.getModelDefinition(model).model.include(objs, filter.include, cb); + } else { + cb(null, objs); + } + }); +}; +// Alias to `all`. Juggler checks `all` only. +Connector.defineAliases(SQLConnector.prototype, 'all', ['findAll']); + +/** + * ATM, this method is not used by loopback-datasource-juggler dao, which + * maps `findById` to `find` with a `where` filter that includes the `id` + * instead. + * + * Please also note the name `find` is confusing. `Model.find` is to find all + * matching instances while `Model.findById` is to find an instance by id. On + * the other hand, `Connector.prototype.find` is for `findById` and + * `Connector.prototype.all` is for `find` due the `bad` convention used by + * juggling-db. + * + * Find by id + * @param {String} model The Model name + * @param {*} id The id value + * @param {Object} options The options object + * @param {Function} cb The callback function + * @private + */ +SQLConnector.prototype.find = function(model, id, options, cb) { + if (id == null) { + process.nextTick(function() { + var err = new Error('id value is required'); + if (cb) { + cb(err); + } + }); + return; + } + var where = {}; + var idName = this.idName(model); + where[idName] = id; + + var filter = {limit: 1, offset: 0, order: idName, where: where}; + return this.all(model, filter, options, function(err, results) { + cb(err, (results && results[0]) || null); + }); +}; +// Alias to `find`. Juggler checks `findById` only. +Connector.defineAliases(SQLConnector.prototype, 'find', ['findById']); /** * Count all model instances by the where filter * * @param {String} model The model name - * @param {Function} callback The callback function - * @param {Object} where The where clause - */ -SqlConnector.prototype.count = function count(model, callback, where) { - var self = this; - - var whereClause = buildWhere(self, model, where); - this.queryOne('SELECT count(*) as cnt FROM ' + - this.tableEscaped(model) + ' ' + whereClause, function (err, res) { - if (err) { - return callback(err); - } - callback(err, res && res.cnt); - }); -}; - -/** - * Update attributes for a given model instance - * @param {String} model The model name - * @param {*} id The id value - * @param {Object} data The model data instance containing all properties to be updated + * @param {Object} where The where object + * @param {Object} options The options object * @param {Function} cb The callback function */ -SqlConnector.prototype.updateAttributes = function updateAttributes(model, id, data, cb) { - if (!isIdValuePresent(id, cb)) { - return; +SQLConnector.prototype.count = function(model, where, options, cb) { + if (typeof where === 'function') { + // Backward compatibility for 1.x style signature: + // count(model, cb, where) + var tmp = options; + cb = where; + where = tmp; } - var idName = this.getDataSource(model).idName(model); - delete data[idName]; - var where = {}; - where[idName] = id; - this.updateAll(model, where, data, cb); + + var stmt = new ParameterizedSQL('SELECT count(*) as "cnt" FROM ' + + this.tableEscaped(model)); + stmt = stmt.merge(this.buildWhere(model, where)); + stmt = this.parameterize(stmt); + this.execute(stmt.sql, stmt.params, + function(err, res) { + if (err) { + return cb(err); + } + var c = (res && res[0] && res[0].cnt) || 0; + // Some drivers return count as a string to contain bigint + // See https://github.com/brianc/node-postgres/pull/427 + cb(err, Number(c)); + }); }; /** - * Disconnect from the connector + * Drop the table for the given model from the database + * @param {String} model The model name + * @param {Function} [cb] The callback function */ -SqlConnector.prototype.disconnect = function disconnect() { - // No operation +SQLConnector.prototype.dropTable = function(model, cb) { + this.execute('DROP TABLE IF EXISTS ' + this.tableEscaped(model), cb); +}; + +/** + * Create the table for the given model + * @param {String} model The model name + * @param {Function} [cb] The callback function + */ +SQLConnector.prototype.createTable = function(model, cb) { + var sql = 'CREATE TABLE ' + this.tableEscaped(model) + + ' (\n ' + this.buildColumnDefinitions(model) + '\n)'; + this.execute(sql, cb); }; /** @@ -358,7 +1141,7 @@ SqlConnector.prototype.disconnect = function disconnect() { * if not present, apply to all models defined in the connector * @param {Function} [cb] The callback function */ -SqlConnector.prototype.automigrate = function (models, cb) { +SQLConnector.prototype.automigrate = function(models, cb) { var self = this; if ((!cb) && ('function' === typeof models)) { @@ -376,8 +1159,8 @@ SqlConnector.prototype.automigrate = function (models, cb) { } var invalidModels = models.filter(function(m) { - return !(m in self._models); - }); + return !(m in self._models); + }); if (invalidModels.length) { return process.nextTick(function() { cb(new Error('Cannot migrate models not attached to this datasource: ' + @@ -403,42 +1186,141 @@ SqlConnector.prototype.automigrate = function (models, cb) { }; /** - * Drop the table for the given model from the database - * @param {String} model The model name - * @param {Function} [cb] The callback function + * Serialize an object into JSON string or other primitive types so that it + * can be saved into a RDB column + * @param {Object} obj The object value + * @returns {*} */ -SqlConnector.prototype.dropTable = function (model, cb) { - this.command('DROP TABLE IF EXISTS ' + this.tableEscaped(model), cb); +SQLConnector.prototype.serializeObject = function(obj) { + var val; + if (obj && typeof obj.toJSON === 'function') { + obj = obj.toJSON(); + } + if (typeof obj !== 'string') { + val = JSON.stringify(obj); + } else { + val = obj; + } + return val; +}; + +/*! + * @param obj + */ +SQLConnector.prototype.escapeObject = function(obj) { + var val = this.serializeObject(obj); + return this.escapeValue(val); }; /** - * Create the table for the given model - * @param {String} model The model name - * @param {Function} [cb] The callback function + * The following _abstract_ methods have to be implemented by connectors that + * extend from SQLConnector to reuse the base implementations of CRUD methods + * from SQLConnector */ -SqlConnector.prototype.createTable = function (model, cb) { - this.command('CREATE TABLE ' + this.tableEscaped(model) + - ' (\n ' + this.propertiesSQL(model) + '\n)', cb); +/** + * Converts a model property value into the form required by the + * database column. The result should be one of following forms: + * + * - {sql: "point(?,?)", params:[10,20]} + * - {sql: "'John'", params: []} + * - "John" + * + * @param {Object} propertyDef Model property definition + * @param {*} value Model property value + * @returns {ParameterizedSQL|*} Database column value. + * + */ +SQLConnector.prototype.toColumnValue = function(propertyDef, value) { + throw new Error('toColumnValue() must be implemented by the connector'); }; /** - * Update all instances that match the where clause with the given data - * @param {String} model The model name - * @param {Object} data The property/value object representing changes to be made - * @param {Function} callback The callback function + * Convert the data from database column to model property + * @param {object} propertyDef Model property definition + * @param {*) value Column value + * @returns {*} Model property value */ -SqlConnector.prototype.update = - SqlConnector.prototype.updateAll = function (model, where, data, callback) { - var whereClause = buildWhere(this, model, where); +SQLConnector.prototype.fromColumnValue = function(propertyDef, value) { + throw new Error('fromColumnValue() must be implemented by the connector'); +}; - var sql = 'UPDATE ' + this.tableEscaped(model) + ' SET ' + - this.toFields(model, data) + ' ' + whereClause; +/** + * Escape the name for the underlying database + * @param {String} name The name + * @returns {String} An escaped name for SQL + */ +SQLConnector.prototype.escapeName = function(name) { + throw new Error('escapeName() must be implemented by the connector'); +}; - this.query(sql, function (err, result) { - if (callback) { - callback(err, result); - } - }); - }; +/** + * Escape the name for the underlying database + * @param {String} value The value to be escaped + * @returns {*} An escaped value for SQL + */ +SQLConnector.prototype.escapeValue = function(value) { + throw new Error('escapeValue() must be implemented by the connector'); +}; +/** + * Get the place holder in SQL for identifiers, such as ?? + * @param {String} key Optional key, such as 1 or id + * @returns {String} The place holder + */ +SQLConnector.prototype.getPlaceholderForIdentifier = function(key) { + throw new Error('getPlaceholderForIdentifier() must be implemented by the connector'); +}; + +/** + * Get the place holder in SQL for values, such as :1 or ? + * @param {String} key Optional key, such as 1 or id + * @returns {String} The place holder + */ +SQLConnector.prototype.getPlaceholderForValue = function(key) { + throw new Error('getPlaceholderForValue() must be implemented by the connector'); +}; + +/** + * Build a new SQL statement with pagination support by wrapping the given sql + * @param {String} model The model name + * @param {ParameterizedSQL} stmt The sql statement + * @param {Number} limit The maximum number of records to be fetched + * @param {Number} offset The offset to start fetching records + * @param {String[]} order The sorting criteria + */ +SQLConnector.prototype.applyPagination = function(model, stmt, filter) { + throw new Error('applyPagination() must be implemented by the connector'); +}; + +/** + * Parse the result for SQL UPDATE/DELETE/INSERT for the number of rows + * affected + * @param {String} model Model name + * @param {Object} info Status object + * @returns {Number} Number of rows affected + */ +SQLConnector.prototype.getCountForAffectedRows = function(model, info) { + throw new Error('getCountForAffectedRows() must be implemented by the connector'); +}; + +/** + * Parse the result for SQL INSERT for newly inserted id + * @param {String} model Model name + * @param {Object} info The status object from driver + * @returns {*} The inserted id value + */ +SQLConnector.prototype.getInsertedId = function(model, info) { + throw new Error('getInsertedId() must be implemented by the connector'); +}; + +/** + * Execute a SQL statement with given parameters + * @param {String} sql The SQL statement + * @param {*[]} [params] An array of parameter values + * @param {Object} [options] Options object + * @param {Function} [callback] The callback function + */ +SQLConnector.prototype.executeSQL = function(sql, params, options, callback) { + throw new Error('executeSQL() must be implemented by the connector'); +}; diff --git a/package.json b/package.json index ed1d851..c76f43d 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,13 @@ "url": "https://github.com/strongloop/loopback-connector/blob/master/LICENSE" }, "dependencies": { - "async": "^0.9.0" + "async": "^0.9.0", + "debug": "^2.1.3" }, "devDependencies": { - "chai": "~1.9.2", - "jshint": "^2.6.0", - "loopback-datasource-juggler": "^2.0.0", - "mocha": "^1.19.0" + "chai": "~2.3.0", + "jshint": "^2.7.0", + "loopback-datasource-juggler": "^2.26.3", + "mocha": "^2.2.4" } } diff --git a/test/connectors/test-sql-connector.js b/test/connectors/test-sql-connector.js index 41e0a24..b3a5890 100644 --- a/test/connectors/test-sql-connector.js +++ b/test/connectors/test-sql-connector.js @@ -2,12 +2,12 @@ * A mockup connector that extends SQL connector */ var util = require('util'); -var SqlConnector = require('../../lib/sql'); +var SQLConnector = require('../../lib/sql'); exports.initialize = function initializeDataSource(dataSource, callback) { process.nextTick(function() { - if(callback) { - var connector = new TestConnector(); + if (callback) { + var connector = new TestConnector(dataSource.settings); connector.dataSource = dataSource; dataSource.connector = connector; callback(null, connector); @@ -15,12 +15,65 @@ exports.initialize = function initializeDataSource(dataSource, callback) { }); }; -function TestConnector() { - SqlConnector.apply(this, [].slice.call(arguments)); +function TestConnector(settings) { + SQLConnector.call(this, 'testdb', settings); this._tables = {}; } -util.inherits(TestConnector, SqlConnector); +util.inherits(TestConnector, SQLConnector); + +TestConnector.prototype.escapeName = function(name) { + return '`' + name + '`'; +}; + +TestConnector.prototype.dbName = function(name) { + return name.toUpperCase(); +}; + +TestConnector.prototype.getPlaceholderForValue = function(key) { + return '$' + key; +}; + +TestConnector.prototype.escapeValue = function(value) { + if (typeof value === 'number' || typeof value === 'boolean') { + return value; + } + if (typeof value === 'string') { + return "'" + value + "'"; + } + if (value == null) { + return 'NULL'; + } + if (typeof value === 'object') { + return String(value); + } + return value; +}; + +TestConnector.prototype.toColumnValue = function(prop, val) { + return val; +}; + +TestConnector.prototype._buildLimit = function(model, limit, offset) { + if (isNaN(limit)) { + limit = 0; + } + if (isNaN(offset)) { + offset = 0; + } + if (!limit && !offset) { + return ''; + } + return 'LIMIT ' + (offset ? (offset + ',' + limit) : limit); +}; + +TestConnector.prototype.applyPagination = + function(model, stmt, filter) { + /*jshint unused:false */ + var limitClause = this._buildLimit(model, filter.limit, + filter.offset || filter.skip); + return stmt.merge(limitClause); + }; TestConnector.prototype.dropTable = function(model, cb) { var err; @@ -47,3 +100,7 @@ TestConnector.prototype.createTable = function(model, cb) { cb(err); }); }; + +TestConnector.prototype.executeSQL = function(sql, params, options, callback) { + callback(null, []); +}; diff --git a/test/smoke.test.js b/test/smoke.test.js index 70f742b..cb01c34 100644 --- a/test/smoke.test.js +++ b/test/smoke.test.js @@ -9,4 +9,22 @@ describe('loopback-connector', function() { it('exports SqlConnector', function() { assert(connector.SqlConnector); }); + + it('exports SQLConnector', function() { + assert(connector.SQLConnector); + }); + + it('creates aliases to Connector.prototype.execute', function() { + assert.equal(connector.Connector.prototype.execute, + connector.Connector.prototype.query); + assert.equal(connector.Connector.prototype.execute, + connector.Connector.prototype.command); + }); + + it('creates aliases to SQLConnector.prototype.execute', function() { + assert.equal(connector.SQLConnector.prototype.execute, + connector.SQLConnector.prototype.query); + assert.equal(connector.SQLConnector.prototype.execute, + connector.SQLConnector.prototype.command); + }); }); diff --git a/test/sql.test.js b/test/sql.test.js new file mode 100644 index 0000000..0b62ddd --- /dev/null +++ b/test/sql.test.js @@ -0,0 +1,310 @@ +var expect = require('chai').expect; +var SQLConnector = require('../lib/sql'); +var ParameterizedSQL = SQLConnector.ParameterizedSQL; +var testConnector = require('./connectors/test-sql-connector'); + +var juggler = require('loopback-datasource-juggler'); +var ds = new juggler.DataSource({ + connector: testConnector, + debug: true +}); +var connector; + +describe('sql connector', function() { + before(function() { + connector = ds.connector; + connector._tables = {}; + connector._models = {}; + ds.createModel('customer', + { + name: { + id: true, + type: String, + testdb: { + column: 'NAME', + dataType: 'VARCHAR', + dataLength: 32 + } + }, vip: { + type: Boolean, + testdb: { + column: 'VIP' + } + }, + address: String + }, + {testdb: {table: 'CUSTOMER'}}); + }); + + it('should map table name', function() { + var table = connector.table('customer'); + expect(table).to.eql('CUSTOMER'); + }); + + it('should map column name', function() { + var column = connector.column('customer', 'name'); + expect(column).to.eql('NAME'); + }); + + it('should find column metadata', function() { + var column = connector.columnMetadata('customer', 'name'); + expect(column).to.eql({ + column: 'NAME', + dataType: 'VARCHAR', + dataLength: 32 + }); + }); + + it('should map property name', function() { + var prop = connector.propertyName('customer', 'NAME'); + expect(prop).to.eql('name'); + }); + + it('should map id column name', function() { + var idCol = connector.idColumn('customer'); + expect(idCol).to.eql('NAME'); + }); + + it('should find escaped id column name', function() { + var idCol = connector.idColumnEscaped('customer'); + expect(idCol).to.eql('`NAME`'); + }); + + it('should find escaped table name', function() { + var table = connector.tableEscaped('customer'); + expect(table).to.eql('`CUSTOMER`'); + }); + + it('should find escaped column name', function() { + var column = connector.columnEscaped('customer', 'vip'); + expect(column).to.eql('`VIP`'); + }); + + it('should convert to escaped id column value', function() { + var column = connector.idColumnValue('customer', 'John'); + expect(column).to.eql('John'); + }); + + it('builds where', function() { + var where = connector.buildWhere('customer', {name: 'John'}); + expect(where.toJSON()).to.eql({ + sql: 'WHERE `NAME`=?', + params: ['John'] + }); + }); + + it('builds where with null', function() { + var where = connector.buildWhere('customer', {name: null}); + expect(where.toJSON()).to.eql({ + sql: 'WHERE `NAME` IS NULL', + params: [] + }); + }); + + it('builds where with inq', function() { + var where = connector.buildWhere('customer', {name: {inq: ['John', 'Mary']}}); + expect(where.toJSON()).to.eql({ + sql: 'WHERE `NAME` IN (?,?)', + params: ['John', 'Mary'] + }); + }); + + it('builds where with or', function() { + var where = connector.buildWhere('customer', + {or: [{name: 'John'}, {name: 'Mary'}]}); + expect(where.toJSON()).to.eql({ + sql: 'WHERE (`NAME`=?) OR (`NAME`=?)', + params: ['John', 'Mary'] + }); + }); + + it('builds where with and', function() { + var where = connector.buildWhere('customer', + {and: [{name: 'John'}, {vip: true}]}); + expect(where.toJSON()).to.eql({ + sql: 'WHERE (`NAME`=?) AND (`VIP`=?)', + params: ['John', true] + }); + }); + + it('builds order by with one field', function() { + var orderBy = connector.buildOrderBy('customer', 'name'); + expect(orderBy).to.eql('ORDER BY `NAME`'); + }); + + it('builds order by with two fields', function() { + var orderBy = connector.buildOrderBy('customer', ['name', 'vip']); + expect(orderBy).to.eql('ORDER BY `NAME`,`VIP`'); + }); + + it('builds order by with two fields and dirs', function() { + var orderBy = connector.buildOrderBy('customer', ['name ASC', 'vip DESC']); + expect(orderBy).to.eql('ORDER BY `NAME` ASC,`VIP` DESC'); + }); + + it('builds fields for columns', function() { + var fields = connector.buildFields('customer', {name: 'John', vip: true}); + expect(fields.names).to.eql(['`NAME`', '`VIP`']); + expect(fields.columnValues[0].toJSON()).to.eql( + {sql: '?', params: ['John']}); + expect(fields.columnValues[1].toJSON()).to.eql( + {sql: '?', params: [true]}); + }); + + it('builds fields for UPDATE without ids', function() { + var fields = connector.buildFieldsForUpdate('customer', + {name: 'John', vip: true}); + expect(fields.toJSON()).to.eql({ + sql: 'SET `VIP`=?', + params: [true] + }); + }); + + it('builds fields for UPDATE with ids', function() { + var fields = connector.buildFieldsForUpdate('customer', + {name: 'John', vip: true}, false); + expect(fields.toJSON()).to.eql({ + sql: 'SET `NAME`=?,`VIP`=?', + params: ['John', true] + }); + }); + + it('builds column names for SELECT', function() { + var cols = connector.buildColumnNames('customer'); + expect(cols).to.eql('`NAME`,`VIP`,`ADDRESS`'); + }); + + it('builds column names with true fields filter for SELECT', function() { + var cols = connector.buildColumnNames('customer', {fields: {name: true}}); + expect(cols).to.eql('`NAME`'); + }); + + it('builds column names with false fields filter for SELECT', function() { + var cols = connector.buildColumnNames('customer', {fields: {name: false}}); + expect(cols).to.eql('`VIP`,`ADDRESS`'); + }); + + it('builds column names with array fields filter for SELECT', function() { + var cols = connector.buildColumnNames('customer', {fields: ['name']}); + expect(cols).to.eql('`NAME`'); + }); + + it('builds DELETE', function() { + var sql = connector.buildDelete('customer', {name: 'John'}); + expect(sql.toJSON()).to.eql({ + sql: 'DELETE FROM `CUSTOMER` WHERE `NAME`=$1', + params: ['John'] + }); + }); + + it('builds UPDATE', function() { + var sql = connector.buildUpdate('customer', {name: 'John'}, {vip: false}); + expect(sql.toJSON()).to.eql({ + sql: 'UPDATE `CUSTOMER` SET `VIP`=$1 WHERE `NAME`=$2', + params: [false, 'John'] + }); + }); + + it('builds SELECT', function() { + var sql = connector.buildSelect('customer', + {order: 'name', limit: 5, where: {name: 'John'}}); + expect(sql.toJSON()).to.eql({ + sql: 'SELECT `NAME`,`VIP`,`ADDRESS` FROM `CUSTOMER`' + + ' WHERE `NAME`=$1 ORDER BY `NAME` LIMIT 5', + params: ['John'] + }); + }); + + it('builds INSERT', function() { + var sql = connector.buildInsert('customer', {name: 'John', vip: true}); + expect(sql.toJSON()).to.eql({ + sql: 'INSERT INTO `CUSTOMER`(`NAME`,`VIP`) VALUES($1,$2)', + params: ['John', true] + }); + }); + + it('normalizes a SQL statement from string', function() { + var sql = 'SELECT * FROM `CUSTOMER`'; + var stmt = new ParameterizedSQL(sql); + expect(stmt.toJSON()).to.eql({sql: sql, params: []}); + }); + + it('normalizes a SQL statement from object without params', function() { + var sql = {sql: 'SELECT * FROM `CUSTOMER`'}; + var stmt = new ParameterizedSQL(sql); + expect(stmt.toJSON()).to.eql({sql: sql.sql, params: []}); + }); + + it('normalizes a SQL statement from object with params', function() { + var sql = + {sql: 'SELECT * FROM `CUSTOMER` WHERE `NAME`=?', params: ['John']}; + var stmt = new ParameterizedSQL(sql); + expect(stmt.toJSON()).to.eql({sql: sql.sql, params: ['John']}); + }); + + it('should throw if the statement is not a string or object', function() { + expect(function() { + /*jshint unused:false */ + var stmt = new ParameterizedSQL(true); + }).to.throw('sql must be a string'); + }); + + it('concats SQL statements', function() { + var stmt1 = {sql: 'SELECT * from `CUSTOMER`'}; + var where = {sql: 'WHERE `NAME`=?', params: ['John']}; + stmt1 = ParameterizedSQL.append(stmt1, where); + expect(stmt1.toJSON()).to.eql( + {sql: 'SELECT * from `CUSTOMER` WHERE `NAME`=?', params: ['John']}); + }); + + it('concats string SQL statements', function() { + var stmt1 = 'SELECT * from `CUSTOMER`'; + var where = {sql: 'WHERE `NAME`=?', params: ['John']}; + stmt1 = ParameterizedSQL.append(stmt1, where); + expect(stmt1.toJSON()).to.eql( + {sql: 'SELECT * from `CUSTOMER` WHERE `NAME`=?', params: ['John']}); + }); + + it('should throw if params does not match placeholders', function() { + expect(function() { + var stmt1 = 'SELECT * from `CUSTOMER`'; + var where = {sql: 'WHERE `NAME`=?', params: ['John', 'Mary']}; + stmt1 = ParameterizedSQL.append(stmt1, where); + }).to.throw('must match the number of params'); + }); + + it('should allow execute(sql, callback)', function(done) { + connector.execute('SELECT * FROM `CUSTOMER`', done); + }); + + it('should allow execute(sql, params, callback)', function(done) { + connector.execute('SELECT * FROM `CUSTOMER` WHERE `NAME`=$1', + ['xyz'], done); + }); + + it('should allow execute(sql, params, options, callback)', function(done) { + connector.execute('SELECT * FROM `CUSTOMER` WHERE `NAME`=$1', + ['xyz'], {transaction: true}, done); + }); + + it('should throw if params is not an array for execute()', function() { + expect(function() { + connector.execute('SELECT * FROM `CUSTOMER`', 'xyz', function() { + }); + }).to.throw('params must be an array'); + }); + + it('should throw if options is not an object for execute()', function() { + expect(function() { + connector.execute('SELECT * FROM `CUSTOMER`', [], 'xyz', function() { + }); + }).to.throw('options must be an object'); + }); + + it('should throw if callback is not a function for execute()', function() { + expect(function() { + connector.execute('SELECT * FROM `CUSTOMER`', [], {}, 'xyz'); + }).to.throw('callback must be a function'); + }); +}); +