Comparing version 0.6.7 to 0.6.8
@@ -239,2 +239,10 @@ 0.0.1 / 2011-12-22 | ||
* Add support for tunable consistency on a per-query basis for CQL [ @mrvisser #130 ] | ||
* Add support for tunable consistency on a per-query basis for CQL [ @mrvisser #130 ] | ||
0.6.8 / 2013-12-15 | ||
================== | ||
* Fixed issues with Deserialization of collection types | ||
* README Updates [ @Rudeg #132 ] | ||
* Add Date Type Support [ @tim-dev #131 ] | ||
@@ -19,2 +19,6 @@ | ||
var NOOP = function(){}; | ||
/** | ||
* Adds zero left-padding to numbers, when necessary | ||
*/ | ||
var zero_pad = function(n){ return n < 10 ? "0" + n : n } | ||
@@ -106,2 +110,20 @@ /** | ||
if(val instanceof Date){ | ||
_val = val.getTime() | ||
if(isNaN(_val)){ | ||
throw errors.create(new Error('Invalid Date')); | ||
} | ||
// C* < 2.0.2 doesn't work with negative longs | ||
if(_val<0){ | ||
return "'" + val.getUTCFullYear() | ||
+ '-' + zero_pad(val.getUTCMonth() + 1) | ||
+ '-' + zero_pad(val.getUTCDate()) | ||
+ ' ' + zero_pad(val.getUTCHours()) | ||
+ ':' + zero_pad(val.getUTCMinutes()) | ||
+ ':' + zero_pad(val.getUTCSeconds()) | ||
+ "'" | ||
} | ||
return _val | ||
} | ||
if(typeof val === 'number' || typeof val === 'boolean'){ | ||
@@ -108,0 +130,0 @@ return val.toString(); |
@@ -49,46 +49,2 @@ var UUID = require('../uuid').UUID, | ||
// https://github.com/simplereach/helenus/issues/96 | ||
Deserializers.decodeCollection = function (deserializers) { | ||
return function(str) { | ||
if(str === null || str === undefined) { | ||
return null; | ||
} | ||
var buf = new Buffer(str, 'binary'), | ||
pos = 3, len, keys = [], vals = [], i = 0, result; | ||
while(pos < buf.length){ | ||
if(i > deserializers.length - 1) { | ||
i = 0; | ||
} | ||
len = buf.readUInt16BE(pos); | ||
pos += 2; | ||
if(i == 0 && deserializers.length == 2) { | ||
keys.push(deserializers[i](buf.slice(pos, len + pos))); | ||
} | ||
else if(i == 0 && deserializers.length == 1 || i == 1 && deserializers.length == 2) { | ||
vals.push(deserializers[i](buf.slice(pos, len + pos))); | ||
} | ||
i += 1; | ||
pos += len; | ||
} | ||
if(keys.length === vals.length) { | ||
result = {} | ||
for(var i = 0, len = keys.length; i < len; i++) { | ||
result[keys[i]] = vals[i]; | ||
} | ||
} | ||
else { | ||
result = vals; | ||
} | ||
return result; | ||
}; | ||
}; | ||
/** | ||
@@ -95,0 +51,0 @@ * Decodes a Long (Int64) |
@@ -61,11 +61,14 @@ var Serializers = require('./serializers'), | ||
function getMapType(str){ | ||
return 'MapType'; | ||
var index = str.indexOf('<'); | ||
return index > 0 ? getCompositeTypes(str.substring(index + 1, str.length - 1)) : str; | ||
} | ||
function getSetType(str){ | ||
return 'SetType'; | ||
var index = str.indexOf('<'); | ||
return index > 0 ? getType(str.substring(index + 1, str.length - 1)) : str; | ||
} | ||
function getListType(str){ | ||
return 'ListType'; | ||
var index = str.indexOf('<'); | ||
return index > 0 ? getType(str.substring(index + 1, str.length - 1)) : str; | ||
} | ||
@@ -112,19 +115,19 @@ | ||
if (type.indexOf('CompositeType') > -1){ | ||
return getCompositeTypes(type); | ||
return { baseType: 'CompositeType', subType: getCompositeTypes(type) }; | ||
} else if(type.indexOf('ReversedType') > -1){ | ||
return getType(getInnerType(type)); | ||
return { baseType: 'ReversedType', subType: getType(getInnerType(type)) }; | ||
} | ||
else if(type.indexOf('org.apache.cassandra.db.marshal.SetType') > -1){ | ||
return getSetType(type); | ||
return { baseType: 'SetType', subType: getType(getInnerType(type)) }; | ||
} | ||
else if(type.indexOf('org.apache.cassandra.db.marshal.ListType') > -1){ | ||
return getListType(type); | ||
return { baseType: 'ListType', subType: getType(getInnerType(type)) }; | ||
} | ||
else if(type.indexOf('org.apache.cassandra.db.marshal.MapType') > -1){ | ||
return getMapType(type); | ||
return { baseType: 'MapType', subType: getCompositeTypes(type) }; | ||
} | ||
else if(type === null || type === undefined) { | ||
return 'BytesType'; | ||
return { baseType: null, subType: 'BytesType' }; | ||
} else { | ||
return getType(type); | ||
return {baseType: null, subType: getType(type) }; | ||
} | ||
@@ -229,2 +232,52 @@ } | ||
/** | ||
* Descodes SetType and ListType | ||
* @private | ||
* @memberOf Marshal | ||
*/ | ||
function listDeserializer(deserializer){ | ||
return function(str){ | ||
var buf = new Buffer(str, 'binary'), | ||
pos = 2, len, vals = [], key, value; | ||
while( pos < buf.length){ | ||
len = buf.readUInt16BE(pos); | ||
pos += 2 | ||
value = deserializer(buf.slice(pos, len + pos)); | ||
pos += len | ||
vals.push(value) | ||
} | ||
return vals; | ||
}; | ||
} | ||
/** | ||
* Descodes MapType | ||
* @private | ||
* @memberOf Marshal | ||
*/ | ||
function mapDeserializer(deserializers){ | ||
return function(str){ | ||
var buf = new Buffer(str, 'binary'), | ||
pos = 2, len, vals = {}, key, value; | ||
while( pos < buf.length){ | ||
len = buf.readUInt16BE(pos); | ||
pos += 2 | ||
key = deserializers[0](buf.slice(pos, len + pos)) | ||
pos += len | ||
len = buf.readUInt16BE(pos); | ||
pos += 2; | ||
value = deserializers[1](buf.slice(pos, len + pos)) | ||
pos += len | ||
vals[key] = value; | ||
} | ||
return vals; | ||
}; | ||
} | ||
/** | ||
* Gets the serializer(s) for a specific type | ||
@@ -235,11 +288,15 @@ * @private | ||
function getSerializer(type){ | ||
if (Array.isArray(type)){ | ||
var i = 0, typeLength = type.length, serializers = []; | ||
if (type.baseType === 'CompositeType'){ | ||
var i = 0, typeLength = type.subType.length, serializers = []; | ||
for(; i < typeLength; i += 1){ | ||
serializers.push( getSerializer(type[i])); | ||
serializers.push( getSerializer(type.subType[i])); | ||
} | ||
return compositeSerializer(serializers); | ||
} else if (type.baseType === 'ListType' || type.baseType == 'SetType' || type.baseType === 'MapType'){ | ||
return function(){ | ||
throw('Serializing MapType, ListType and SetType is not currently supported'); | ||
} | ||
} else { | ||
return TYPES[type.replace(/^\s+|\s+$/g,'')].ser; | ||
return TYPES[type.subType.replace(/^\s+|\s+$/g,'')].ser; | ||
} | ||
@@ -254,12 +311,19 @@ } | ||
function getDeserializer(type){ | ||
if (Array.isArray(type)){ | ||
var i = 0, typeLength = type.length, deserializers = []; | ||
if (type.baseType === 'CompositeType'){ | ||
var i = 0, typeLength = type.subType.length, deserializers = []; | ||
for(; i < typeLength; i += 1){ | ||
deserializers.push( getDeserializer(type[i])); | ||
deserializers.push( TYPES[type.subType[i].subType].de ); | ||
} | ||
return compositeDeserializer(deserializers); | ||
} else if (type.baseType === 'ListType' || type.baseType == 'SetType'){ | ||
var subtypeDeserializer = getDeserializer({ baseType:null, subType: type.subType }); | ||
return listDeserializer(subtypeDeserializer); | ||
} else if (type.baseType === 'MapType'){ | ||
var subtypeDeserializers = type.subType.map(function(t){ return getDeserializer(t) }); | ||
return mapDeserializer(subtypeDeserializers); | ||
} else { | ||
return function(val) { | ||
return val !== null ? TYPES[type].de(val) : null; | ||
return val !== null ? TYPES[type.subType].de(val) : null; | ||
}; | ||
@@ -277,3 +341,6 @@ } | ||
this.type = parsedType; | ||
this.isComposite = Array.isArray(parsedType); | ||
this.isComposite = parsedType.baseType === 'CompositeType' | ||
this.isMap = parsedType.baseType === 'MapType'; | ||
this.isList = parsedType.baseType === 'ListType'; | ||
this.isSet = parsedType.baseType === 'SetType'; | ||
@@ -280,0 +347,0 @@ /** |
{ | ||
"name": "helenus" | ||
, "version": "0.6.7" | ||
, "version": "0.6.8" | ||
, "description": "NodeJS Bindings for Cassandra" | ||
@@ -5,0 +5,0 @@ , "keywords": ["cassandra"] |
@@ -102,3 +102,3 @@ # Helenus | ||
//the driver will return a helenus.Row object just like CQL | ||
cf.get('foo', {consistency:helenus.ConsistencyLevel.ONE} function(err, row){ | ||
cf.get('foo', {consistency:helenus.ConsistencyLevel.ONE}, function(err, row){ | ||
if(err){ | ||
@@ -105,0 +105,0 @@ throw(err); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
15292
643713
41