3 new revisions:
Revision: 974a3f8382e8
Author: gdusbabek <gdusba...@gmail.com>
Date: Wed Jan 11 09:01:40 2012
Log: detect select count(*) and decode appropriately.
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=974a3f8382e8
Revision: 474e16d83307
Author: Gary Dusbabek <gdusba...@gmail.com>
Date: Wed Jan 11 08:05:25 2012
Log: export bufferToHex and tests to show that binary cols/keys work
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=474e16d83307
Revision: 252c01c314aa
Author: Gary Dusbabek <gdusba...@gmail.com>
Date: Wed Jan 11 09:03:09 2012
Log: Merge branch '25/select_count'
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=252c01c314aa
==============================================================================
Revision: 974a3f8382e8
Author: gdusbabek <gdusba...@gmail.com>
Date: Wed Jan 11 09:01:40 2012
Log: detect select count(*) and decode appropriately.
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=974a3f8382e8
Modified:
/lib/decoder.js
/lib/driver.js
/test/test_driver.js
=======================================
--- /lib/decoder.js Tue Jan 10 11:15:10 2012
+++ /lib/decoder.js Wed Jan 11 09:01:40 2012
@@ -129,6 +129,9 @@
},
'org.apache.cassandra.db.marshal.LexicalUUIDType': function(bytes) {
return converters['org.apache.cassandra.db.marshal.UUIDType'](bytes);
+ },
+ 'select count': function(bytes) {
+ return converters['org.apache.cassandra.db.marshal.LongType'](bytes);
}
};
@@ -162,7 +165,9 @@
} else if (which == 'comparator') {
className = this.validators.comparator;
} else if (which == 'validator') {
- if (column && this.validators.specificValidators[column]) {
+ if (this.options.select_count) {
+ className = 'select count';
+ } else if (column && this.validators.specificValidators[column]) {
className = this.validators.specificValidators[column];
} else {
className = this.validators.defaultValidator;
=======================================
--- /lib/driver.js Mon Jan 9 03:12:55 2012
+++ /lib/driver.js Wed Jan 11 09:01:40 2012
@@ -37,6 +37,7 @@
// used to parse the CF name out of a select statement.
var selectRe = /\s*SELECT\s+.+\s+FROM\s+[\']?(\w+)/im;
+var selectCountRe = /\s*SELECT\s+.*COUNT\(.+\)\s+FROM\s+[\']?(\w+)/im;
var appExceptions =
['InvalidRequestException', 'TimedOutException', 'UnavailableException',
'SchemaDisagreementException'];
@@ -559,7 +560,8 @@
} else {
if (res.type === ttypes.CqlResultType.ROWS) {
var cfName = selectRe.exec(cql)[1];
- var decoder = new Decoder(self.validators[cfName], {use_bigints:
self.connectionInfo.use_bigints});
+ var decoder = new Decoder(self.validators[cfName], {use_bigints:
self.connectionInfo.use_bigints,
+
select_count: selectCountRe.test(cql)});
// for now, return results.
var rows = [];
for (var i = 0; i < res.rows.length; i++) {
=======================================
--- /test/test_driver.js Mon Jan 9 12:44:46 2012
+++ /test/test_driver.js Wed Jan 11 09:01:40 2012
@@ -207,7 +207,8 @@
function executeCountQuery(callback) {
con.execute('SELECT COUNT(*) FROM CfLong', [], function(err, rows) {
assert.ifError(err);
- assert.equal(rows[0].cols[0].value, 5);
+ console.log(rows[0].cols);
+ assert.strictEqual(rows[0].cols[0].value, 5);
callback();
});
},
==============================================================================
Revision: 474e16d83307
Author: Gary Dusbabek <gdusba...@gmail.com>
Date: Wed Jan 11 08:05:25 2012
Log: export bufferToHex and tests to show that binary cols/keys work
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=474e16d83307
Added:
/test/util.js
Modified:
/lib/decoder.js
/test/test_decoder.js
/test/test_driver.js
=======================================
--- /dev/null
+++ /test/util.js Wed Jan 11 08:05:25 2012
@@ -0,0 +1,23 @@
+
+// min is inclusive, max is exclusive.
+function randomInt(min, max) {
+ if (min === undefined) {
+ min = -2147483648;
+ }
+ if (max === undefined) {
+ max = 2147483647
+ }
+ return Math.round(Math.random() * (max - min) + min);
+}
+
+function randomBuffer(sz) {
+ sz = sz || randomInt(10, 100);
+ var buf = new Buffer(sz);
+ for (var i = 0; i < sz; i++) {
+ buf[i] = randomInt(0, 255);
+ }
+ return buf;
+}
+
+exports.randomInt = randomInt;
+exports.randomBuffer = randomBuffer;
=======================================
--- /lib/decoder.js Tue Jan 10 11:15:10 2012
+++ /lib/decoder.js Wed Jan 11 08:05:25 2012
@@ -63,6 +63,24 @@
return bytesToBigInt(bytes);
};
+// just what you think.
+function byteToHex(n) {
+ if (n < 16) {
+ return '0' + n.toString(16);
+ } else {
+ return n.toString(16);
+ }
+}
+
+/** convert a buffer to a hex string suitable for use in cql statements. */
+var bufferToString = module.exports.bufferToString = function(buf) {
+ var chars = [];
+ for (var i = 0; i < buf.length; i++) {
+ chars[i] = byteToHex(buf[i]);
+ }
+ return chars.join('');
+};
+
// Cassandra datatypes according to
// http://www.datastax.com/docs/1.0/ddl/column_family
// Those commented out are not correctly dealt with yet and will appear as
=======================================
--- /test/test_decoder.js Mon Jan 9 10:46:41 2012
+++ /test/test_decoder.js Wed Jan 11 08:05:25 2012
@@ -19,6 +19,7 @@
var BigInteger = require('../lib/bigint').BigInteger;
var bytesToBigLong = require('../lib/decoder').bytesToBigLong;
var bytesToNum = require('../lib/decoder').bytesToNum;
+var bufferToString = require('../lib/decoder').bufferToString;
var UUID = require('../lib/uuid');
function makeBuffer(string) {
@@ -242,3 +243,15 @@
}
test.finish();
};
+
+exports.testHexing = function(test, assert) {
+ var buf = new Buffer(6);
+ buf[0] = 0x00;
+ buf[1] = 0x33;
+ buf[2] = 0x66;
+ buf[3] = 0x99;
+ buf[4] = 0xcc;
+ buf[5] = 0xff;
+ assert.strictEqual('00336699ccff', bufferToString(buf));
+ test.finish();
+};
=======================================
--- /test/test_driver.js Mon Jan 9 12:44:46 2012
+++ /test/test_driver.js Wed Jan 11 08:05:25 2012
@@ -34,6 +34,8 @@
var KsDef = require('../lib/system').KsDef;
var CfDef = require('../lib/system').CfDef;
var UUID = require('../lib/driver').UUID;
+var util = require('./util');
+var decoder = require('../lib/decoder');
var CASSANDRA_PORT = 19170;
@@ -429,6 +431,33 @@
});
};
+exports.testBinary = function(test, assert) {
+ connect(function(err, con) {
+ assert.ifError(err);
+ var key = 'binarytest';
+ var binaryParams = [util.randomBuffer(), util.randomBuffer(),
util.randomBuffer()];
+ var stringParams = binaryParams.map(decoder.bufferToString);
+ con.execute('update CfBytes set ?=? where key=?', stringParams,
function(updErr) {
+ if (updErr) {
+ con.close();
+ assert.ok(false);
+ test.finish();
+ } else {
+ con.execute('select ? from CfBytes where key=?', [stringParams[0],
stringParams[2]], function(selErr, rows) {
+ con.close();
+ assert.strictEqual(rows.rowCount(), 1);
+ var row = rows[0];
+ console.log(row);
+ assert.strictEqual(row.key.toString('base64'),
binaryParams[2].toString('base64'));
+ assert.strictEqual(row.cols[0].name.toString('base64'),
binaryParams[0].toString('base64'));
+ assert.strictEqual(row.cols[0].value.toString('base64'),
binaryParams[1].toString('base64'));
+ test.finish();
+ });
+ }
+ });
+ });
+};
+
exports.testLong = function(test, assert) {
connect(function(err, con) {
if (err) {
==============================================================================
Revision: 252c01c314aa
Author: Gary Dusbabek <gdusba...@gmail.com>
Date: Wed Jan 11 09:03:09 2012
Log: Merge branch '25/select_count'
http://code.google.com/a/apache-extras.org/p/cassandra-node/source/detail?r=252c01c314aa
Modified:
/lib/decoder.js
/test/test_driver.js
=======================================
--- /lib/decoder.js Wed Jan 11 08:05:25 2012
+++ /lib/decoder.js Wed Jan 11 09:03:09 2012
@@ -147,6 +147,9 @@
},
'org.apache.cassandra.db.marshal.LexicalUUIDType': function(bytes) {
return converters['org.apache.cassandra.db.marshal.UUIDType'](bytes);
+ },
+ 'select count': function(bytes) {
+ return converters['org.apache.cassandra.db.marshal.LongType'](bytes);
}
};
@@ -180,7 +183,9 @@
} else if (which == 'comparator') {
className = this.validators.comparator;
} else if (which == 'validator') {
- if (column && this.validators.specificValidators[column]) {
+ if (this.options.select_count) {
+ className = 'select count';
+ } else if (column && this.validators.specificValidators[column]) {
className = this.validators.specificValidators[column];
} else {
className = this.validators.defaultValidator;
=======================================
--- /test/test_driver.js Wed Jan 11 08:05:25 2012
+++ /test/test_driver.js Wed Jan 11 09:03:09 2012
@@ -209,7 +209,8 @@
function executeCountQuery(callback) {
con.execute('SELECT COUNT(*) FROM CfLong', [], function(err, rows) {
assert.ifError(err);
- assert.equal(rows[0].cols[0].value, 5);
+ console.log(rows[0].cols);
+ assert.strictEqual(rows[0].cols[0].value, 5);
callback();
});
},