Skip to content
Browse files

Refactored.

  • Loading branch information...
1 parent 4fe80eb commit df4d814bf2a997836bdba062104f4197847706a7 @koichik committed
Showing with 1,248 additions and 1,002 deletions.
  1. +17 −16 CHANGELOG.md
  2. +255 −304 README.md
  3. +220 −123 doc-ja/api.md
  4. +27 −0 example/delete.js
  5. +19 −12 example/find-all.js
  6. +19 −5 example/find.js
  7. +20 −5 example/insert-with-slide.js
  8. +20 −7 example/insert.js
  9. +17 −6 example/openindex-with-slide.js
  10. +0 −13 example/remove.js
  11. +19 −5 example/update.js
  12. +146 −123 lib/node-handlersocket.js
  13. +37 −29 package.json
  14. +32 −27 test/connect-test.js
  15. +53 −46 test/find-test.js
  16. +126 −105 test/modify-get-test.js
  17. +117 −97 test/modify-test.js
  18. +14 −11 test/open-index-test.js
  19. +90 −68 test/util-test.js
View
33 CHANGELOG.md
@@ -1,24 +1,25 @@
# Changelog
-- 0.1.0 (not yet)
- - added auth support.
- - added in/filters support.
- - added increment/decrement support.
- - added (update|increment|decrement|delete)AndGet() support.
- - limit/offset optional arguments became the properties of options.
- - Connection.end() was renamed to close().
- - Connection emits 'close' event instead of 'end'.
+ - 0.1.0 (not yet)
+ - added the new features that latest HanslerSocket provided.
+ - authentication.
+ - in/filters.
+ - increment/decrement.
+ - get values before modification/deletion.
+ - `limit` and `offset` optional arguments became the properties of `options` argument.
+ - `Connection.end()` was renamed to `close()`.
+ - `Connection` emits `'close'` event instead of '`end'`.
-- 0.0.3 (2010/11/21)
- - fixed NULL value handling once more.
- - improved error handling.
+ - 0.0.3 (2010/11/21)
+ - fixed NULL value handling once more.
+ - improved error handling.
-- 0.0.2 (2010/11/08)
- - fixed NULL value handling.
- - fixed response handling for insert, update and remove.
+ - 0.0.2 (2010/11/08)
+ - fixed NULL value handling.
+ - fixed response handling for insert, update and remove.
-- 0.0.1 (2010/11/06)
- - fixed NULL value handling.
+ - 0.0.1 (2010/11/06)
+ - fixed NULL value handling.
- 0.0.0 (2010/11/03)
- first release.
View
559 README.md
@@ -2,15 +2,12 @@
node-handlersocket is a pure JavaScript client for HandlerSocket.
-[HandlerSocket](https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL)
-is a NoSQL plugin for MySQL.
-See [auther's blog](http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html)
-for more information.
+[HandlerSocket](https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL) is a NoSQL plugin for MySQL. See [Matsunobu's blog](http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html) for more information.
# Requirements
-- [Node.js](http://nodejs.org/) (>= v0.6.0, tested with v0.6.6)
-- [HandlerSocket Plugin for MySQL](https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL) (>= v1.1.0, tested with v1.1.0)
+- [Node.js](http://nodejs.org/) (>= v0.6.0, tested with v0.6.10)
+- [HandlerSocket Plugin for MySQL](https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL) (>= v1.1.0, tested with v1.1.0)
# Installation
@@ -25,11 +22,11 @@ var hs = require('node-handlersocket');
var con = hs.connect(function() {
con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
- [ 'EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME' ],
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
function(err, index) {
- index.find('=', [ 1 ], function(err, results) {
- console.log(results[0]);
- con.end();
+ index.find('=', [1], function(err, records) {
+ console.log(records[0]);
+ con.close();
});
});
});
@@ -42,13 +39,13 @@ var hs = require('node-handlersocket');
var con = hs.connect(function() {
con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
- [ 'EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME' ],
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
function(err, index) {
- index.find('>=', [ 1 ], { limit: 10, offset: 0 }, function(err, results) {
- results.forEach(function(row) {
- console.log(row);
+ index.find('>=', [1], {limit: 10, offset: 0}, function(err, records) {
+ records.forEach(function(record) {
+ console.log(record);
});
- con.end();
+ con.close();
});
});
});
@@ -61,15 +58,13 @@ var hs = require('node-handlersocket');
var con = hs.connect(function() {
con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
- [ 'EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME' ],
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
function(err, index) {
- index.find('=', [ hs.in(1, 2, 3) ],
- { limit: 10 },
- function(err, results) {
- results.forEach(function(row) {
- console.log(row);
+ index.find('=', [hs.in(1, 2, 3)], {limit: 10}, function(err, records) {
+ records.forEach(function(record) {
+ console.log(record);
});
- con.end();
+ con.close();
});
});
});
@@ -82,18 +77,18 @@ var hs = require('node-handlersocket');
var con = hs.connect(function() {
con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
- [ 'EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME' ],
- [ 'EMPLOYEE_NO' ],
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ ['EMPLOYEE_NO'],
function(err, index) {
- index.find('>=', [ 1 ], {
- filters: [ hs.filter('EMPLOYEE_NO', '<', 7800) ],
+ index.find('>=', [1], {
+ filters: [hs.filter('EMPLOYEE_NO', '<', 7800)],
limit: 10
},
- function(err, results) {
- results.forEach(function(row) {
- console.log(row);
+ function(err, records) {
+ records.forEach(function(record) {
+ console.log(record);
});
- con.end();
+ con.close();
});
});
});
@@ -103,13 +98,13 @@ var con = hs.connect(function() {
var hs = require('node-handlersocket');
- var con = hs.connect({port : 9999});
+ var con = hs.connect({port: 9999});
con.on('connect', function() {
con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
- [ 'EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME' ],
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
function(err, index) {
index.insert([100, 9999, 'KOICHIK'], function(err) {
- con.end();
+ con.close();
});
});
});
@@ -118,13 +113,14 @@ var con = hs.connect(function() {
var hs = require('node-handlersocket');
- var con = hs.connect({port : 9999});
+ var con = hs.connect({port: 9999});
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.update('=', 100, [100, 9999, 'EBIYURI'], function(err, rows) {
- console.log(rows);
- con.end();
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ index.update('=', 100, [100, 9999, 'EBIYURI'], function(err, numRecords) {
+ console.log(numRecords);
+ con.close();
});
});
});
@@ -133,73 +129,70 @@ var con = hs.connect(function() {
var hs = require('node-handlersocket');
- var con = hs.connect({port : 9999});
+ var con = hs.connect({port: 9999});
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.delete('=', 100, function(err, rows) {
- console.log(rows);
- con.end();
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ index.delete('=', 100, function(err, numRecords) {
+ console.log(numRecords);
+ con.close();
});
});
});
# API
-## hs.connect([ options ], [ connectListener ])
+### hs.connect([options], [connectListener])
Open a connection to HandlerSocket server.
-* Parameters
- * `options` (optional) : an object with the following properties:
- * `host` : a host name or address (default is `'localhost'`).
- * `port` : a port number (default is `9998`).
- * `auth` : an authentication key.
+ * Parameters
+ * `options`: (optional) an object with the following properties:
+ * `host`: a host name or address (default is `'localhost'`).
+ * `port`: a port number (default is `9998`).
+ * `auth`: an authentication key.
- **Note, the port 9998 only allows read operations, and the port 9999 allows write operations also.**
- See [HandlerSocket installation document](https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/installation.en.txt) for more information.
- * `connectListener` (optional) : It is automatically set as a listener for
- the `'connect'` event.
-* Returns
- * a new `Connection` object.
+ **Note, the port 9998 only allows read operations, and the port 9999 allows write operations also.** See [HandlerSocket installation document](https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/installation.en.txt) for more information.
+
+ * `connectListener`: (optional) It is automatically set as a listener for the `'connect'` event.
+ * Returns
+ * a new `Connection` object.
### hs.in(values...)
Creates and returns an IN criterion object.
-* Parameters
- * `values` : a values of index.
-* Returns
- * a new IN criterion object.
+ * Parameters
+ * `values`: values of index.
+ * Returns
+ * a new IN criterion object.
### hs.filter(column, op, value)
Creates and returns a filter criterion object.
-* Parameters
- * `column` : a column name used by this filter. It must be included in
- `filterColumns` specified `Connection.openIndex()`.
- * `op` : a filter operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `value` : a value.
-* Returns
- * a new filter object.
+ * Parameters
+ * `column`: a column name used by this filter. It must be included in `filterColumns` specified `Connection.openIndex()`.
+ * `op`: a filter operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `value`: a value.
+ * Returns
+ * a new filter object.
-### Function : hs.while(column, op, value)
+### hs.while(column, op, value)
-Creates and returns a filter criterion object.
+Creates and returns a *while* filter criterion object.
-* Parameters
- * `column` : a column name used by this filter. It must be included in
- `filterColumns` specified `Connection.openIndex()`.
- * `op` : a filter operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `value` : a value.
-* Returns
- * a new filter object.
+ * Parameters
+ * `column`: a column name used by this filter. It must be included in `filterColumns` specified `Connection.openIndex()`.
+ * `op`: a filter operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `value`: a value.
+ * Returns
+ * a new *while* filter object.
## Connection
-An object representing connection to HandlerSocket.
-It is an instance of `EventEmitter`.
+An object representing connection to the HandlerSocket server. It is an instance of `EventEmitter`.
### 'connect' event
@@ -217,252 +210,210 @@ Emitted once the connection is fully closed.
Emitted when an error occurs.
-* Callback function: ` function(err)`
- * Parameters
- * `err` : an error that occurred.
+ * Callback function: ` function(err)`
+ * Parameters
+ * `err`: an error that occurred.
-### Connection.prototype.openIndex(database, table, index, columns, filterColumns, callback)
+### Connection.prototype.openIndex(database, table, index, columns, [filterColumns], callback)
Open an index.
-* Parameters
- * `database` : a database name.
- * `table` : a table name.
- * `index` : an index name. If 'PRIMARY' is specified, the primary index is open.
- * `columns` : an array of columns names.
- * `filterColumns` : an array of column names used by a filter.
- * `callback` : a function to be called when the response received.
-* Callback function : `function(err, index)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `index` : a new `Index` object.
+ * Parameters
+ * `database`: a database name.
+ * `table`: a table name.
+ * `index`: an index name. If 'PRIMARY' is specified, the primary index is open.
+ * `columns`: an array of column names.
+ * `filterColumns`: (optional) an array of column names used by a filter.
+ * `callback`: a function to be called when the response received.
+ * Callback function: `function(err, index)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `index`: a new `Index` object.
### Connection.prototype.close()
-Half-closes the connection.
+Close the connection.
## Index
An object representing MySQL's index.
-### Index.prototype.find(op, keys, [ options ], callback)
-
-To read a records from a table using the index.
-
-* Parameters
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, results)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `results` : an array of records.
- Each recored is array of column values which correspond to `columns` parameter of `Connection.openIndex()`.
+### Index.prototype.find(op, keys, [options], callback)
+
+To read records from a table using the index.
+
+ * Parameters
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filters returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, records)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `records`: an array of records. Each record is array of column values which corresponds to `columns` parameter of `Connection.openIndex()`.
### Index.prototype.insert(values, callback)
-To add a records.
-
-* Parametes
- * values : an array of new column values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
-
-### Index.prototype.update(op, keys, [ options ], values, callback)
-
-To update a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * values : an array of new column values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, rows)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `rows` : a number of updated rows.
-
-### Index.prototype.updateAndGet(op, keys, [ options ], values, callback)
-
-To update a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * values : an array of new column values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, results)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `results` : an array of records before modification.
- Each recored is an array of column values which correspond to
- `columns` parameter of `Connection.openIndex()`.
-
-### Index.prototype.increment(op, keys, [ options ], values, callback)
-
-To increment a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * values : an array of incremental values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, rows)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `rows` : a number of updated rows.
-
-### Index.prototype.incrementAndGet(op, keys, [ options ], values, callback)
-
-To increment a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * values : an array of incremental values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, results)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `results` : an array of records before modification.
- Each recored is an array of column values which correspond to
- `columns` parameter of `Connection.openIndex()`.
-
-### Index.prototype.decrement(op, keys, [ options ], values, callback)
-
-To deirement a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * values : an array of decremental values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, rows)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `rows` : a number of updated rows.
-
-### Index.prototype.decrementAndGet(op, keys, [ options ], values, callback)
-
-To deirement a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * values : an array of decremental values which correspond to `columns` parameter of `Connection.openIndex()`.
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, results)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `results` : an array of records before modification.
- Each recored is an array of column values which correspond to
- `columns` parameter of `Connection.openIndex()`.
-
-### Index.prototype.delete(op, keys, [ limit, [ offset ] ], callback)
-
-To delete a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, rows)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `rows` : a number of deleted rows.
-
-### Index.prototype.deleteAndGet(op, keys, [ limit, [ offset ] ], callback)
-
-To delete a records.
-
-* Parametes
- * `op` : a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
- * `keys` : an array of index values. It can include an IN criterion
- returned from `hs.in()`.
- * `options` : an object which specifies several options.
- * `filters` : an array of filter returned from `hs.filter()`
- and/or `hs.while()`.
- * `limit` : a maximum number of records to be retrieved (defaults to 1).
- * `offset` : a number of records skipped before retrieving records
- (defaults to 0).
- * `callback` : a function to be called when the response received.
-* Callback Function : `function(err, results)`
- * Parameters
- * `err` : an `Error` object when the request failed, otherwise `null`.
- * `results` : an array of records before deletion.
- Each recored is an array of column values which correspond to
- `columns` parameter of `Connection.openIndex()`.
+To add records.
+
+ * Parametes
+ * values: an array of new column values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+
+### Index.prototype.update(op, keys, [options], values, callback)
+
+To update records.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * values: an array of new column values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, numRecords)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `numRecords`: a number of updated records.
+
+### Index.prototype.updateAndGet(op, keys, [options], values, callback)
+
+To update records and get values before they are updated.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * values: an array of new column values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, records)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `records`: an array of records before modification. Each record is an array of column values which corresponds to `columns` parameter of `Connection.openIndex()`.
+
+### Index.prototype.increment(op, keys, [options], values, callback)
+
+To increment records.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * values: an array of incremental values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, numRecords)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `numRecords`: a number of updated records.
+
+### Index.prototype.incrementAndGet(op, keys, [options], values, callback)
+
+To increment records and get values before they are updated.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * values: an array of incremental values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, records)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `records`: an array of records before modification. Each record is an array of column values which corresponds to `columns` parameter of `Connection.openIndex()`.
+
+### Index.prototype.decrement(op, keys, [options], values, callback)
+
+To decrement records.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * values: an array of decremental values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, numRecords)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `numRecords`: a number of updated records.
+
+### Index.prototype.decrementAndGet(op, keys, [options], values, callback)
+
+To decrement records and get values before they are updated.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * values: an array of decremental values which corresponds to `columns` parameter of `Connection.openIndex()`.
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, records)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `records`: an array of records before modification. Each record is an array of column values which corresponds to `columns` parameter of `Connection.openIndex()`.
+
+### Index.prototype.delete(op, keys, [options], callback)
+
+To delete records.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optionaal) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, numRecords)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `numRecords`: a number of deleted records.
+
+### Index.prototype.deleteAndGet(op, keys, [options], callback)
+
+To delete records and get values before they are deleted.
+
+ * Parametes
+ * `op`: a search operation, one of `'='`, `'>'`, `'>='`, `'<'` and `'<='`.
+ * `keys`: an array of index values. It can include an IN criterion returned from `hs.in()`.
+ * `options`: (optional) an object which specifies several options.
+ * `filters`: an array of filter returned from `hs.filter()` and/or `hs.while()`.
+ * `limit`: a maximum number of records to be retrieved (defaults to 1).
+ * `offset`: a number of records skipped before retrieving records (defaults to 0).
+ * `callback`: a function to be called when the response received.
+ * Callback Function: `function(err, records)`
+ * Parameters
+ * `err`: an `Error` object when the request failed, otherwise `null`.
+ * `records`: an array of records before deletion. Each is an array of column values which corresponds to `columns` parameter of `Connection.openIndex()`.
# Test
-node-handlersocket depends on [Vows](http://vowsjs.org/) for testing.
+node-handlersocket depends on [Vows](http://vowsjs.org/) for unit testing.
npm test
-or
-
- mysql -u root -p test < sql/create.sql
- vows test/*.js
- mysql -u root -p test < sql/drop.sql
-
# Limitations
The encoding of MySQL server (`default-character-set` parameter in `[mysqld]` section)
View
343 doc-ja/api.md
@@ -1,21 +1,52 @@
# API ドキュメント
-## hs.connect([options], [connectListener]) 関数
+### hs.connect([options], [connectListener])
HandlerSocket サーバに接続します.
-* 引数
- * `options` (オプション) : 接続先を以下のプロパティとして持つオブジェクトです.
- * `host` : 接続先のホスト名または IP アドレス.デフォルトは `'localhost'` です.
- * `port` : 接続先のポート番号です.デフォルトは `9998` です.
- * `auth` : 認証のキーです.
+ * 引数
+ * `options`: (オプション) 接続先を以下のプロパティとして持つオブジェクトです.
+ * `host`: 接続先のホスト名または IP アドレス.デフォルトは `'localhost'` です.
+ * `port`: 接続先のポート番号です.デフォルトは `9998` です.
+ * `auth`: 認証のキーです.
- **HandlerSocket のデフォルト設定では,9998 番ポートは参照のみ可能なことに注意してください.**
- 9999 番ポートは更新も可能です.
- 詳細は[HandlerSocketのインストールドキュメント](https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-ja/installation.ja.txt)を参照してください.
- * `connectListener` : `'connect'` イベントに対するリスナーとして自動的に加えられます.
-* 戻り値
- * `Connection` オブジェクトを返します.
+ **HandlerSocket のデフォルト設定では,9998 番ポートは参照のみ可能なことに注意してください.** 9999 番ポートは更新も可能です. 詳細は[HandlerSocketのインストールドキュメント](https://github.com/DeNADev/HandlerSocket-Plugin-for-MySQL/blob/master/docs-ja/installation.ja.txt)を参照してください.
+
+ * `connectListener`: `'connect'` イベントに対するリスナーとして自動的に加えられます.
+ * 戻り値
+ * `Connection` オブジェクトを返します.
+
+### hs.in(values...)
+
+IN クライテリアオブジェクトを作成して返します.
+
+ * Parameters
+ * `values`: インデックスの値.
+ * Returns
+ * 新しい IN クライテリアオブジェクト.
+
+### hs.filter(column, op, value)
+
+フィルタオブジェクトを作成して返します.
+
+ * Parameters
+ * `column`: このフィルタで使用するカラム.`Connection.openIndex()` で指定された `filterColumns` に含まれていなければなりません.
+ * `op`: フィルタの演算子.`'='`, `'>'`, `'>='`, `'<'` and `'<='` のいずれかを指定します.
+ * `value`: フィルタの値です.
+ * Returns
+ * 新しいフィルタオブジェクトを作成して返します.
+
+### hs.while(column, op, value)
+
+ *while* フィルタオブジェクトを作成して返します.
+
+ * Parameters
+ * `column`: このフィルタで使用するカラム.
+ `Connection.openIndex()` で指定された `filterColumns` に含まれていなければなりません.
+ * `op`: フィルタの演算子.`'='`, `'>'`, `'>='`, `'<'` and `'<='` のいずれかを指定します.
+ * `value`: フィルタの値です.
+ * Returns
+ * 新しい *while* フィルタオブジェクトを作成して返します.
## Connection オブジェクト
@@ -25,46 +56,39 @@ HandlerSocket への接続を表すオブジェクトで,`EventEmitter` のイ
接続が確立した時に発生するイベントです.
-* コールバック関数: ` function()`
-
-### 'end' イベント
-
-接続が相手側から切断された時に発生するイベントです.
-
-* コールバック関数: ` function()`
+ * コールバック関数: ` function()`
### 'close' イベント
接続が閉じた時に発生するイベントです.
-* コールバック関数: ` function(hadError)`
- * 引数
- * `hadError` : 接続が転送エラーでクローズされたのかどうかを示す `boolean` 値が渡されます.
+ * コールバック関数: ` function()`
### 'error' イベント
エラーが発生した時に発生するイベントです.
-* コールバック関数: ` function(err)`
- * 引数
- * `err` : エラーを表す `Error` オブジェクトが渡されます.
+ * コールバック関数: ` function(err)`
+ * 引数
+ * `err`: エラーを表す `Error` オブジェクトが渡されます.
-### openIndex(database, table, index, columns, callback) メソッド
+### Connection.prototype.openIndex(database, table, index, columns, [filterColumns], callback)
接続上で使用するインデックスをオープンします.
-* 引数
- * `database` : データベースの名前です.
- * `table` : テーブルの名前です.
- * `index` : インデックスの名前です.主キーの場合は `'PRIMARY'` を指定します.
- * `columns` : 参照および更新するカラム名の配列です.
- * `callback` : コールバック関数です.
-* コールバック関数 : `function(err, index)`
- * 引数
- * `err` : 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
- * `index` : オープンしたインデックスを表す `Index` オブジェクトが渡されます.
+ * 引数
+ * `database`: データベースの名前です.
+ * `table`: テーブルの名前です.
+ * `index`: インデックスの名前です.主キーの場合は `'PRIMARY'` を指定します.
+ * `columns`: 参照および更新するカラム名の配列です.
+ * `filterColumns`: (オプション) フィルタで使用するカラム名の配列です.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, index)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `index`: オープンしたインデックスを表す `Index` オブジェクトが渡されます.
-### end() メソッド
+### Connection.prototype.close()
接続を閉じます.
@@ -72,104 +96,177 @@ HandlerSocket への接続を表すオブジェクトで,`EventEmitter` のイ
MySQL 上のインデックスを表すオブジェクトです.
-### find(op, keys, [limit, [offset]], callback) メソッド
+### Index.prototype.find(op, keys, [options], callback)
インデックスを使用して行を取得します.
-* 引数
- * `op` : 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
- * `keys` : 取得対象となるインデックスの値の配列です.
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 取得対象となるインデックスの値の配列です.
配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,
同じか少ない数の値を指定することができます.
- * `limit` (オプション) : 取得する最大行数です.省略した場合は `1` となります.
- * `offset` (オプション) : 取得する前に読み飛ばす行数です.省略した場合は `0` となります.
- * `callback` : コールバック関数です.
-* コールバック関数 : `function(err, results)`
- * 引数
- * `err` : 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
- * `results` : 取得した行の配列が渡されます.
-取得した行がなかった場合は空の配列です.
-複数の行を取得した場合,配列の並びは `op``'='`, `'>'`, `'>='` の場合は昇順,
-`'<'`, `'<='` の場合は降順となります.
-配列の各要素は `Conection.openIndex()` メソッドの引数 `columns` で指定したカラムの値の配列です.
-
-### Index.insert(values, callback)
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 取得する最大行数です.省略した場合は `1` となります.
+ * `offset`: 取得する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, records)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `records`: 取得した行の配列が渡されます.配列の各要素は `Conection.openIndex()` メソッドの引数 `columns` で指定したカラムの値の配列です.取得した行がなかった場合は空の配列です.複数の行を取得した場合,配列の並びは `op``'='`, `'>'`, `'>='` の場合は昇順,`'<'`, `'<='` の場合は降順となります.
+
+### Index.prototype.insert(values, callback)
インデックスを使用して行を挿入します.
-* 引数
- * `values` : 挿入するカラム値の配列です.
-配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
- * `callback` : コールバック関数です.
-* コールバック関数 : `function(err)`
- * `err` : 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
-
-### Index.update(op, keys, [limit, [offset]], values, callback)
-
-インデックスを使用して行を更新します.
-
-* 引数
- * `op` : 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
- * `keys` : 更新対象となるインデックスの値の配列です.
-配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,
-同じか少ない数を指定することができます.
- * `limit` (オプション) : 更新する最大行数です.省略した場合は `1` となります.
- * `offset` (オプション) : 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
- * `values` : 更新するカラム値の配列です.
+ * 引数
+ * `values`: 挿入するカラム値の配列です.
配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
- * `callback` : コールバック関数です
-* コールバック関数 : `function(err, rows)`
- * `err` : 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
- * `results` : 更新した行数が渡されます
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です
+ * コールバック関数: `function(err)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます
-### Index.delete(op, keys, [limit, [offset]], callback)
+### Index.prototype.update(op, keys, [options], values, callback)
インデックスを使用して行を更新します.
-* 引数
- * `op` : 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
- * `keys` : 削除対象となるインデックスの値の配列です.
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 更新対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 更新する最大行数です.省略した場合は `1` となります.
+ * `offset`: 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `values`: 更新するカラム値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, numRecords)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `numRecords`: 更新した行数が渡されます.
+
+### Index.prototype.updateAndGet(op, keys, [options], values, callback)
+
+インデックスを使用して行を更新し,それらが更新される前の値を取得します.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 更新対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 更新する最大行数です.省略した場合は `1` となります.
+ * `offset`: 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `values`: 更新するカラム値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, rows)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `records`: 更新される前の行の配列が渡されます.配列の各要素は `Conection.openIndex()` メソッドの引数 `columns` で指定したカラムの値の配列です.更新した行がなかった場合は空の配列です.複数の行を更新した場合,配列の並びは `op``'='`, `'>'`, `'>='` の場合は昇順,`'<'`, `'<='` の場合は降順となります.
+
+### Index.prototype.increment(op, keys, [options], values, callback)
+
+インデックスを使用して行をインクリメントします.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 更新対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 更新する最大行数です.省略した場合は `1` となります.
+ * `offset`: 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `values`: 更新するカラムに加える値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, numRecords)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `numRecords`: 更新した行数が渡されます.
+
+### Index.prototype.incrementAndGet(op, keys, [options], values, callback)
+
+インデックスを使用して行をインクリメントし,それらが更新される前の値を取得します.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 更新対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 更新する最大行数です.省略した場合は `1` となります.
+ * `offset`: 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `values`: 更新するカラムに加える値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, rows)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `records`: 更新される前の行の配列が渡されます.配列の各要素は `Conection.openIndex()` メソッドの引数 `columns` で指定したカラムの値の配列です.更新した行がなかった場合は空の配列です.複数の行を更新した場合,配列の並びは `op``'='`, `'>'`, `'>='` の場合は昇順,`'<'`, `'<='` の場合は降順となります.
+
+### Index.prototype.decrement(op, keys, [options], values, callback)
+
+インデックスを使用して行をデクリメントします.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 更新対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 更新する最大行数です.省略した場合は `1` となります.
+ * `offset`: 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `values`: 更新するカラムから減じる値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, numRecords)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `numRecords`: 更新した行数が渡されます.
+
+### Index.prototype.decrementAndGet(op, keys, [options], values, callback)
+
+インデックスを使用して行をデクリメントし,それらが更新される前の値を取得します.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 更新対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 更新する最大行数です.省略した場合は `1` となります.
+ * `offset`: 更新する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `values`: 更新するカラムから減じる値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `columns` で指定したカラムと同じ数・並び順でなければなりません.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, rows)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `records`: 更新される前の行の配列が渡されます.配列の各要素は `Conection.openIndex()` メソッドの引数 `columns` で指定したカラムの値の配列です.更新した行がなかった場合は空の配列です.複数の行を更新した場合,配列の並びは `op``'='`, `'>'`, `'>='` の場合は昇順,`'<'`, `'<='` の場合は降順となります.
+
+### Index.prototype.delete(op, keys, [options], callback)
+
+インデックスを使用して行を削除します.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 削除対象となるインデックスの値の配列です.
配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,
同じか少ない数を指定することができます.
- * `limit` (オプション) : 削除する最大行数です.省略した場合は `1` となります.
- * `offset` (オプション) : 削除する前に読み飛ばす行数です.省略した場合は `0` となります.
- * `callback` : コールバック関数です.
-* コールバック関数 : `function(err, rows)`
- * `err` : 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
- * `results` : 更新した行数が渡されます.
-
-### index.in(pos, values)
-
-IN クライテリアを作成して返します.
-
-* 引数
- * `pos` : 検索で使用するカラムのインデックスの中での位置を指定します.
- * `values` : 取得対象となるインデックスの値の配列です.
-* 戻り値
- * IN クライテリアオブジェクトを返します.
-
-### index.filter(column, op, value) 関数
-
-フィルタを作成して返します.
-
-* 引数
- * `column` : 検索で使用するカラム名を指定します. `Connection.openIndex()`
- で指定した `filterColumns` の中に含まれている必要があります.
- * `op` : 演算子です.
- '='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
- * `value` : 取得対象となる値です.
-* 戻り値
- * フィルタオブジェクトを返します.
-
-### index.while(column, op, value) 関数
-
-フィルタを作成して返します.
-
-* 引数
- * `column` : 検索で使用するカラム名を指定します. `Connection.openIndex()`
- で指定した `filterColumns` の中に含まれている必要があります.
- * `op` : 演算子です.
- '='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
- * `value` : 取得対象となる値です.
-* 戻り値
- * フィルタオブジェクトを返します.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 削除する最大行数です.省略した場合は `1` となります.
+ * `offset`: 削除する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, numRecords)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `numRecords`: 削除した行数が渡されます.
+
+### Index.prototype.deleteAndGet(op, keys, [options], callback)
+
+インデックスを使用して行を削除し,それらが削除される前の値を取得します.
+
+ * 引数
+ * `op`: 演算子です.`'='`, `'>'`, `'>='`, `'<'`, `'<='` のいずれかを指定します.
+ * `keys`: 削除対象となるインデックスの値の配列です.配列の要素は `Connection.openIndex()` メソッドの引数 `index` で指定したインデックスに定義されたカラム数と同じ並び順で,同じか少ない数を指定することができます.
+ * `options`: (オプション) 以下のオプションを含むオブジェクトです.
+ * `filters`: `hs.filter()` または `hs.while()` が返すフィルタの配列です.
+ * `limit`: 削除する最大行数です.省略した場合は `1` となります.
+ * `offset`: 削除する前に読み飛ばす行数です.省略した場合は `0` となります.
+ * `callback`: レスポンスを受信した時に呼び出されるコールバック関数です.
+ * コールバック関数: `function(err, rows)`
+ * 引数
+ * `err`: 操作が成功した場合は `null`,失敗した場合は `Error` オブジェクトが渡されます.
+ * `records`: 削除される前の行の配列が渡されます.配列の各要素は `Conection.openIndex()` メソッドの引数 `columns` で指定したカラムの値の配列です.削除した行がなかった場合は空の配列です.複数の行を削除した場合,配列の並びは `op``'='`, `'>'`, `'>='` の場合は昇順,`'<'`, `'<='` の場合は降順となります.
View
27 example/delete.js
@@ -0,0 +1,27 @@
+var hs = require('../index');
+
+//hs._debug = true;
+var con = hs.connect({port: 9999, auth: 'node'});
+con.on('connect', function() {
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ if (err) {
+ console.log(err);
+ con.clode();
+ return;
+ }
+ index.delete('>=', 100, {limit: 100}, function(err, rows) {
+ if (err) {
+ console.log(err);
+ con.clode();
+ return;
+ }
+ console.log(rows + ' row(s) deleted');
+ con.close();
+ });
+ });
+});
+con.on('error', function(err) {
+ console.log(err);
+});
View
31 example/find-all.js
@@ -1,22 +1,29 @@
-var hs = require('../lib/node-handlersocket');
+var hs = require('../index');
//hs._debug = true;
var con = hs.connect();
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.find('>=', 0, 1000, 0, function(err, results) {
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
+ index.find('>=', 0, {limit:1000}, function(err, results) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
results.forEach(function(row) {
console.log(row);
});
- con.end();
+ con.close();
});
});
});
-/**
- * Created by IntelliJ IDEA.
- * User: koichik
- * Date: 2010/11/07
- * Time: 0:07:03
- * To change this template use File | Settings | File Templates.
- */
+con.on('error', function(err) {
+ console.log(err);
+});
View
24 example/find.js
@@ -1,13 +1,27 @@
-var hs = require('../lib/node-handlersocket');
+var hs = require('../index');
//hs._debug = true;
var con = hs.connect();
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.find('=', 100, function(err, results) {
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
+ index.find('=', 1, function(err, results) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
console.log(results[0]);
- con.end();
+ con.close();
});
});
});
+con.on('error', function(err) {
+ console.log(err);
+});
View
25 example/insert-with-slide.js
@@ -1,4 +1,5 @@
-var hs = require('../lib/node-handlersocket'), asyncMap = require('slide/async-map');
+var hs = require('../index');
+var asyncMap = require('slide').asyncMap;
var insertRecords = [
[200, 9999, null],
@@ -8,15 +9,29 @@ var insertRecords = [
];
//hs._debug = true;
-var con = hs.connect({port : 9999});
+var con = hs.connect({port : 9999, auth: 'node'});
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
asyncMap(insertRecords, function(rec, callback) {
index.insert(rec, callback);
}, function(err, rows) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
console.log(rows.length + ' row(s) inserted');
- con.end();
+ con.close();
});
});
});
+con.on('error', function(err) {
+ console.log(err);
+});
View
27 example/insert.js
@@ -1,13 +1,26 @@
-var hs = require('../lib/node-handlersocket');
+var hs = require('../index');
//hs._debug = true;
-var con = hs.connect({port : 9999});
+var con = hs.connect({port: 9999, auth: 'node'});
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.insert([100, 9999, 'KOICHIK'], function(err) {
- if (!err) console.log('1 row inserted');
- con.end();
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO'], function(err, index) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
+ index.insert([100, 9990], function(err) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
+ console.log('1 row inserted');
+ con.close();
});
});
});
+con.on('error', function(err) {
+ console.log(err);
+});
View
23 example/openindex-with-slide.js
@@ -1,8 +1,13 @@
-var hs = require('../lib/node-handlersocket'), asyncMap = require('slide/async-map');
+var hs = require('../index');
+var asyncMap = require('slide').asyncMap;
var indexDefs = [
- ['test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME' ]],
- ['test', 'DEPARTMENT', 'PRIMARY', ['DEPARTMENT_ID', 'DEPARTMENT_NO', 'DEPARTMENT_NAME']],
+ ['test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME']
+ ],
+ ['test', 'DEPARTMENT', 'PRIMARY',
+ ['DEPARTMENT_ID', 'DEPARTMENT_NO', 'DEPARTMENT_NAME']
+ ],
['test', 'ADDRESS', 'PRIMARY', ['ADDRESS_ID', 'STREET']]
];
@@ -12,11 +17,17 @@ con.on('connect', function() {
asyncMap(indexDefs, function(indexDef, callback) {
con.openIndex.apply(con, indexDef.concat(callback))
}, function(err, indices) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
indices.forEach(function(index) {
console.log(index);
});
- con.end();
+ con.close();
});
});
-
-
+con.on('error', function(err) {
+ console.log(err);
+});
View
13 example/remove.js
@@ -1,13 +0,0 @@
-var hs = require('../lib/node-handlersocket');
-
-//hs._debug = true;
-var con = hs.connect({port : 9999});
-con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.remove('>=', 100, 100, 0, function(err, rows) {
- console.log(rows + ' row(s) deleted');
- con.end();
- });
- });
-});
View
24 example/update.js
@@ -1,13 +1,27 @@
var hs = require('../lib/node-handlersocket');
//hs._debug = true;
-var con = hs.connect({port : 9999});
+var con = hs.connect({port: 9999, auth: 'node'});
con.on('connect', function() {
- con.openIndex('test', 'EMPLOYEE', 'PRIMARY', [ 'EMPLOYEE_ID', 'EMPLOYEE_NO',
- 'EMPLOYEE_NAME' ], function(err, index) {
- index.update('=', 100, [100, 9999, 'EBIYURI'], function(err, rows) {
+ con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
+ ['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
+ function(err, index) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
+ index.update('=', 100, [100, 9990, 'EBIYURI'], function(err, rows) {
+ if (err) {
+ console.log(err);
+ con.close();
+ return;
+ }
console.log(rows + ' row updated');
- con.end();
+ con.close();
});
});
});
+con.on('error', function(err) {
+ console.log(err);
+});
View
269 lib/node-handlersocket.js
@@ -22,6 +22,10 @@ function inCriteria() {
return new InCriteria(args);
}
+function InCriteria(values) {
+ this.values = values;
+}
+
function filterCriteria(column, operator, value) {
return {
type: 'F',
@@ -53,22 +57,27 @@ function Connection(options, connectListener) {
this.on('connect', connectListener);
}
+
var self = this;
var socket = new net.Socket({ allowHalfOpen: true });
socket.setEncoding('utf8');
socket.on('connect', function() {
if (!auth) {
- return self.emit('connect');
+ self.emit('connect');
+ return;
}
- var request = ['A', '1', auth];
- self._execute(request, _handleResponse(function(error, fields) {
+
+ _chain([
+ self._execute,
+ _handleResponse
+ ], function(error) {
if (error) {
self.emit('error', error);
self.close();
return;
}
self.emit('connect');
- }));
+ }).call(self, ['A', '1', auth]);
});
socket.on('data', function(data) {
if (data) {
@@ -76,10 +85,11 @@ function Connection(options, connectListener) {
var pos;
while ((pos = received.indexOf('\n')) !== -1) {
var response = received.substring(0, pos + 1);
- received = self._received = received.substring(pos + 1);
+ received = received.substring(pos + 1);
var callback = self._callbacks.shift();
- callback(response);
+ callback(null, response);
}
+ self._received = received;
}
});
socket.on('end', function() {
@@ -104,7 +114,7 @@ util.inherits(Connection, events.EventEmitter);
Connection.prototype.openIndex =
function openIndex(database, table, index,
columns, filterColumns, callback) {
- if (arguments.length === 5) {
+ if (typeof filterColumns === 'function') {
callback = filterColumns;
filterColumns = [];
}
@@ -117,12 +127,15 @@ Connection.prototype.openIndex =
if (filterColumns.length > 0) {
request = request.concat(filterColumns.join(','));
}
- this._execute(request, _handleResponse(function(err, fields) {
+ _chain([
+ this._execute,
+ _handleResponse
+ ], function(err, fields) {
if (err) {
return callback(err);
}
- return callback(null, new Index(self, indexId, columns, filterColumns));
- }));
+ callback(null, new Index(self, indexId, columns, filterColumns));
+ }).call(this, request);
};
Connection.prototype.close = function close() {
@@ -136,7 +149,7 @@ Connection.prototype._execute = function _execute(request, callback) {
});
return;
}
- var data = _createRequest(request);
+ var data = _encodeRequest(request);
this._socket.write(data, 'utf8');
this._callbacks.push(callback);
};
@@ -173,48 +186,62 @@ function Index(con, indexId, columns, filterColumns) {
}
util.inherits(Index, events.EventEmitter);
-Index.prototype.find = _makeOperation(4, _handleResultSet);
-
-Index.prototype.update = _makeOperation(5, _handleResultRownum, 'U');
-Index.prototype.delete = _makeOperation(4, _handleResultRownum, 'D');
-Index.prototype.increment = _makeOperation(5, _handleResultRownum, '+');
-Index.prototype.decrement = _makeOperation(5, _handleResultRownum, '-');
+Index.prototype.find = _makeOperation(4, '', _handleResultSet);
+Index.prototype.update = _makeOperation(5, 'U', _handleResultRownum);
+Index.prototype.delete = _makeOperation(4, 'D', _handleResultRownum);
+Index.prototype.increment = _makeOperation(5, '+', _handleResultRownum);
+Index.prototype.decrement = _makeOperation(5, '-', _handleResultRownum);
-Index.prototype.updateAndGet = _makeOperation(5, _handleResultSet, 'U?');
-Index.prototype.deleteAndGet = _makeOperation(4, _handleResultSet, 'D?');
-Index.prototype.incrementAndGet = _makeOperation(5, _handleResultSet, '+?');
-Index.prototype.decrementAndGet = _makeOperation(5, _handleResultSet, '-?');
+Index.prototype.updateAndGet = _makeOperation(5, 'U?', _handleResultSet);
+Index.prototype.deleteAndGet = _makeOperation(4, 'D?', _handleResultSet);
+Index.prototype.incrementAndGet = _makeOperation(5, '+?', _handleResultSet);
+Index.prototype.decrementAndGet = _makeOperation(5, '-?', _handleResultSet);
Index.prototype.insert = function insert(values, callback) {
values = _toArray(values);
-
var request = [this._indexId, '+', values.length].concat(values);
- this._con._execute(request, _handleResponse(function(error, response) {
- if (error) {
- return callback(error);
- }
- return callback(null);
- }));
+
+ _chain([
+ _executeRequest,
+ _handleResponse,
+ _handleResultRownum
+ ], callback).call(this, request);
};
-Index.prototype._createFindRequest =
- function _createFindRequest(operator, keys, options, callback) {
- var filters = _toArray(options.filters || []);
+
+function _makeOperation(argc, modifier, resultHandler) {
+ return function _operation(operator, keys, options, values, callback) {
+ if (arguments.length < argc) {
+ // no options
+ callback = values;
+ values = options;
+ options = {};
+ }
+ if (argc === 4) {
+ // no values
+ callback = values;
+ values = undefined;
+ }
+
+ _chain([
+ _createRequest,
+ _addFilters.bind(this, options, this._filterColumns),
+ _addModifier.bind(this, modifier),
+ _addValues.bind(this, values),
+ _executeRequest,
+ _handleResponse,
+ resultHandler
+ ], callback).call(this, operator, keys, options);
+ };
+}
+
+
+function _createRequest(operator, keys, options, callback) {
var limit = options.limit || 1;
var offset = options.offset || 0;
var keyValues = [];
var inCriteria = [];
- this._processKeys(keys, keyValues, inCriteria);
- var request = [this._indexId, operator, keyValues.length].
- concat(keyValues, limit, offset);
- request = this._addInCriteria(request, inCriteria);
- request = this._addFilters(request, filters, callback);
- return request;
-};
-
-Index.prototype._processKeys =
- function _processKeys(keys, keyValues, inCriteria) {
_toArray(keys).forEach(function(keyValue, i) {
if (keyValue instanceof InCriteria) {
keyValues.push(null);
@@ -224,23 +251,22 @@ Index.prototype._processKeys =
keyValues.push(keyValue);
}
});
-};
-
-Index.prototype._addInCriteria = function _addInCriteria(request, inCriteria) {
+ var request = [this._indexId, operator, keyValues.length].
+ concat(keyValues, limit, offset);
inCriteria.forEach(function(criteria) {
var values = criteria.values;
request = request.concat('@', criteria.pos, values.length, values);
});
- return request;
-};
+ callback(null, request);
+}
-Index.prototype._addFilters = function _addFilters(request, filters, callback) {
- var self = this;
+function _addFilters(options, filterColumns, request, callback) {
+ var filters = _toArray(options.filters || []);
var noError = filters.every(function(criteria) {
var column = criteria.column;
var pos = typeof column === 'number' ? column :
- self._filterColumns.indexOf(column);
+ filterColumns.indexOf(column);
if (pos < 0) {
process.nextTick(function() {
callback(new Error('invalid column: ' + column));
@@ -253,92 +279,67 @@ Index.prototype._addFilters = function _addFilters(request, filters, callback) {
});
if (noError) {
- return request;
+ callback(null, request);
}
- return null;
-};
-
+}
-function InCriteria(values) {
- this.values = values;
+function _addModifier(modifier, request, callback) {
+ if (modifier) {
+ request.push(modifier);
+ }
+ callback(null, request);
}
+function _addValues(values, request, callback) {
+ if (values) {
+ request = request.concat(values);
+ }
+ callback(null, request);
+}
-function _makeOperation(argc, handler, mop) {
- return function _operation(operator, keys, options, values, callback) {
- if (arguments.length < argc) {
- callback = values;
- values = options;
- options = {};
- }
- if (argc === 4) {
- callback = values;
- values = undefined;
- }
-
- var request = this._createFindRequest(operator, keys, options, callback);
- if (request) {
- if (mop) {
- request.push(mop);
- if (values) {
- request = request.concat(values);
- }
- }
- this._con._execute(request, handler(callback));
- }
- };
+function _executeRequest(request, callback) {
+ this._con._execute(request, callback);
}
-function _createRequest(fields) {
- var request = fields.map(function(field) {
- return _encodeField(field);
- }).join('\t') + '\n';
+function _handleResponse(response, callback) {
if (exports._debug) {
- console.error(util.inspect(request));
+ console.error(util.inspect(response));
}
- return request;
+ response = response.substring(0, response.length - 1); // drop '\n'
+ var fields = response.split('\t').map(function(field) {
+ return _decodeField(field);
+ });
+ var error = fields[0];
+ if (error !== '0') {
+ var message = fields[2];
+ return callback(new Error(message ? (error + ' ' + message) : error));
+ }
+ callback(null, fields);
}
-function _handleResponse(callback) {
- return function(response) {
- if (exports._debug) {
- console.error(util.inspect(response));
- }
- response = response.substring(0, response.length - 1);
- var fields = response.split('\t').map(function(field) {
- return _decodeField(field);
- });
- var error = fields[0];
- if (error === '0') {
- return callback(null, fields);
- }
- var message = fields[2];
- return callback(new Error(message ? error + ' ' + message : error));
- };
+function _handleResultSet(fields, callback) {
+ var numColumns = parseInt(fields[1]);
+ var results = [];
+ for (var i = 2, len = fields.length; i < len; i += numColumns) {
+ results.push(fields.slice(i, i + numColumns));
+ }
+ return callback(null, results);
}
-function _handleResultSet(callback) {
- return _handleResponse(function(error, response) {
- if (error) {
- return callback(error);
- }
- var numColumns = parseInt(response[1]);
- var results = [];
- for (var i = 2, len = response.length; i < len; i += numColumns) {
- results.push(response.slice(i, i + numColumns));
- }
- return callback(null, results);
- });
+function _handleResultRownum(fields, callback) {
+ var rows = parseInt(fields[2]);
+ return callback(null, rows);
}
-function _handleResultRownum(callback) {
- return _handleResponse(function(error, response) {
- if (error) {
- return callback(error);
- }
- var rows = parseInt(response[2]);
- return callback(null, rows);
- });
+
+function _encodeRequest(fields) {
+ var request = fields.map(function(field) {
+ return _encodeField(field);
+ }).join('\t') + '\n';
+ if (exports._debug) {
+ console.error(util.inspect(request));
+ }
+ return request;
}
function _encodeField(field) {
@@ -369,12 +370,34 @@ function _toArray(o) {
return Array.isArray(o) ? o : [o];
}
+function _chain(functions, callback) {
+ return function doFunctions() {
+ var self = this;
+ var index = 0;
+ var args = Array.prototype.slice.call(arguments);
+ args.push(_next);
+ functions[0].apply(self, args);
+
+ function _next(err) {
+ ++index;
+ if (!err && index < functions.length) {
+ var args = Array.prototype.slice.call(arguments, 1);
+ args.push(_next);
+ functions[index].apply(self, args);
+ } else {
+ var args = Array.prototype.slice.call(arguments);
+ callback.apply(null, args);
+ }
+ }
+ };
+}
+
// for tests
exports._debug = false;
-exports._createRequest = _createRequest;
+exports._encodeRequest = _encodeRequest;
exports._handleResponse = _handleResponse;
exports._encodeField = _encodeField;
exports._decodeField = _decodeField;
-exports.Connection = Connection;
-exports.Index = Index;
+exports._Connection = Connection;
+exports._Index = Index;
View
66 package.json
@@ -1,31 +1,39 @@
-{ "name" : "node-handlersocket"
-, "version" : "0.1.0-pre"
-, "description" : "HandlerSocket client for Node.js"
-, "homepage" : "http://github.com/koichik/node-handlersocket/"
-, "author" : "Koichi Kobayashi <koichik@improvement.jp>"
-, "main" : "./index.js"
-, "directories" :
- { "lib" : "./lib"
- , "example" : "./example"
- }
-, "licenses" :
- [ { "type" : "The MIT License"
- , "url": "http://www.opensource.org/licenses/mit-license.php"
- }
- ]
-, "repositories" :
- { "type" : "git"
- , "url" : "http://github.com/koichik/node-handlersocket.git"
- , "private" : "git@github.com:koichik/node-handlersocket.git"
- , "web" : "http://github.com/koichik/node-handlersocket"
- }
-, "engines" : { "node" : ">=0.6.0" }
-, "devDependencies" :
- { "vows" : "*"
- }
-, "scripts" :
- { "pretest" : "mysql test < sql/create.sql"
- , "test" : "./node_modules/vows/bin/vows test/*.js"
- , "posttest" : "mysql test < sql/drop.sql"
+{
+ "name": "node-handlersocket" ,
+ "version": "0.1.0-pre",
+ "description": "HandlerSocket client for Node.js",
+ "keywords": [
+ "database",
+ "mysql",
+ "handlersocket"
+ ],
+ "homepage": "http://github.com/koichik/node-handlersocket/",
+ "author": "Koichi Kobayashi <koichik@improvement.jp>",
+ "main": "./index.js",
+ "directories": {
+ "lib": "./lib",
+ "example": "./example"
+ },
+ "licenses": [
+ {
+ "type": "The MIT License",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ }
+ ],
+ "repositories": {
+ "type": "git",
+ "url": "http://github.com/koichik/node-handlersocket.git",
+ "private": "git@github.com:koichik/node-handlersocket.git",
+ "web": "http://github.com/koichik/node-handlersocket"
+ },
+ "engines": {"node": ">=0.6.0"},
+ "devDependencies": {
+ "vows" : "*",
+ "slide": "*"
+ },
+ "scripts": {
+ "pretest": "mysql test < sql/create.sql",
+ "test": "./node_modules/vows/bin/vows test/*.js",
+ "posttest" : "mysql test < sql/drop.sql"
}
}
View
59 test/connect-test.js
@@ -4,8 +4,8 @@ var events = require('events');
var hs = require('../index');
vows.describe('Connect').addBatch({
- 'connecting' : {
- topic : function() {
+ 'connecting': {
+ topic: function() {
return function(options) {
var emitter = new events.EventEmitter();
var con = hs.connect(options);
@@ -19,54 +19,59 @@ vows.describe('Connect').addBatch({
return emitter;
}
},
- 'with default host and port' : {
- topic : function(connect) {
+
+ 'with default host and port': {
+ topic: function(connect) {
return connect();
},
- 'should create a new Connection object' : function(con) {
- assert.instanceOf(con, hs.Connection);
+ 'should create a new Connection object': function(con) {
+ assert.instanceOf(con, hs._Connection);
}
},
- 'with specific host and port' : {
- topic : function(connect) {
+
+ 'with specific host and port': {
+ topic: function(connect) {
return connect({
- host : '127.0.0.1',
- port : 9999
+ host: '127.0.0.1',
+ port: 9999
});
},
- 'should create a new Connection object' : function(con) {
- assert.instanceOf(con, hs.Connection);
+ 'should create a new Connection object': function(con) {
+ assert.instanceOf(con, hs._Connection);
}
},
- 'with illegal port' : {
- topic : function(connect) {
+
+ 'with illegal port': {
+ topic: function(connect) {
return connect({
- port : 10000
+ port: 10000
});
},
- 'should pass an Error object' : function(con) {
+ 'should pass an Error object': function(con) {
assert.instanceOf(con, Error);
}
},
- 'with auth' : {
- topic : function(connect) {
+
+ 'with auth': {
+ topic: function(connect) {
return connect({
- port : 9999,
- auth : 'node'
+ port: 9999,
+ auth: 'node'
});
},
- 'should create a new Connection object' : function(con) {
- assert.instanceOf(con, hs.Connection);
+ 'should create a new Connection object': function(con) {
+ assert.instanceOf(con, hs._Connection);
}
},
- 'with illegal auth' : {
- topic : function(connect) {
+
+ 'with illegal auth': {
+ topic: function(connect) {
return connect({
- port : 9999,
- auth : 'hoge'
+ port: 9999,
+ auth: 'hoge'
});
},
- 'should pass an Error object' : function(con) {
+ 'should pass an Error object': function(con) {
assert.instanceOf(con, Error);
}
}
View
99 test/find-test.js
@@ -7,8 +7,8 @@ var hs = require('../index');
//hs._debug = true;
var con;
vows.describe('Find').addBatch({
- 'connect =>' : {
- topic : function() {
+ 'connect =>': {
+ topic: function() {
var emitter = new events.EventEmitter();
con = hs.connect();
con.on('connect', function() {
@@ -16,100 +16,107 @@ vows.describe('Find').addBatch({
});
return emitter;
},
- 'openIndex =>' : {
- topic : function(con) {
+
+ 'openIndex =>': {
+ topic: function(con) {
con.openIndex('test', 'EMPLOYEE', 'PRIMARY',
['EMPLOYEE_ID', 'EMPLOYEE_NO', 'EMPLOYEE_NAME'],
['EMPLOYEE_NO', 'EMPLOYEE_NAME'], this.callback);
},
- 'find one record with = operator' : {
- topic : function(index, con) {
+
+ 'find one record with = operator': {
+ topic: function(index, con) {
index.find('=', 1, this.callback);
},
- 'should pass a null to error' : function(err, results) {
+ 'should pass a null to error': function(err, results) {
assert.isNull(err);
},
- 'should pass an array with 1 record' : function(err, results) {
+ 'should pass an array with 1 record': function(err, results) {
assert.lengthOf(results, 1);
},
- 'should results equal to' : function(err, results) {
- assert.deepEqual(results[0], [ '1', '7369', 'SMITH' ]);
+ 'should results equal to': function(err, results) {
+ assert.deepEqual(results[0], ['1', '7369', 'SMITH']);
}
},
- 'find some records with < operator' : {
- topic : function(index, con) {
- index.find('<', [ 3 ], { limit : 10 }, this.callback);
+
+ 'find some records with < operator': {
+ topic: function(index, con) {
+ index.find('<', [3], {limit: 10}, this.callback);
},
- 'should pass null to error' : function(err, results) {
+ 'should pass null to error': function(err, results) {
assert.isNull(err);
},
- 'should pass an array with 2 records' : function(err, results) {
+ 'should pass an array with 2 records': function(err, results) {
assert.lengthOf(results, 2);
},
- 'should results equal to' : function(err, results) {
- assert.deepEqual(results[0], [ '2', '7499', 'ALLEN' ]);
- assert.deepEqual(results[1], [ '1', '7369', 'SMITH' ]);
+ 'should results equal to': function(err, results) {
+ assert.deepEqual(results[0], ['2', '7499', 'ALLEN']);
+ assert.deepEqual(results[1], ['1', '7369', 'SMITH']);
}
},
- 'find some records with IN operator' : {
- topic : function(index, con) {
+
+ 'find some records with IN operator': {
+ topic: function(index, con) {
index.find('=', hs.in(1, 2, 3),
- { limit : 10, offset : 0 },
+ {limit: 10, offset: 0},
this.callback);
},
- 'should pass null to error' : function(err, results) {
+ 'should pass null to error': function(err, results) {
assert.isNull(err);
},
- 'should pass an array with 3 records' : function(err, results) {
+ 'should pass an array with 3 records': function(err, results) {
assert.lengthOf(results, 3);
},
- 'should results equal to' : function(err, results) {
- assert.deepEqual(results[0], [ '1', '7369', 'SMITH' ]);
- assert.deepEqual(results[1], [ '2', '7499', 'ALLEN' ]);
- assert.deepEqual(results[2], [ '3', '7521', 'WARD' ]);
+ 'should results equal to': function(err, results) {
+ assert.deepEqual(results[0], ['1', '7369', 'SMITH']);
+ assert.deepEqual(results[1], ['2', '7499', 'ALLEN']);
+ assert.deepEqual(results[2], ['3', '7521', 'WARD']);
}
},
- 'find some records with filter' : {
- topic : function(index, con) {
+
+ 'find some records with filter': {
+ topic: function(index, con) {
index.find('<=', 10, {
- filters : hs.filter('EMPLOYEE_NO', '>', 7800),
- limit : 10
+ filters: hs.filter('EMPLOYEE_NO', '>', 7800),
+ limit: 10
}, this.callback);
},
- 'should pass null to error' : function(err, results) {
+ 'should pass null to error': function(err, results) {
assert.isNull(err);
},
- 'should pass an array with 2 records' : function(err, results) {
+ 'should pass an array with 2 records': function(err, results) {
assert.lengthOf(results, 2);
},
- 'should results equal to' : function(err, results) {
- assert.deepEqual(results[0], [ '10', '7844', 'TURNER'