Created
September 3, 2016 12:18
-
-
Save chjj/bc6b30e228f7af93fe4cbd1528a0b71c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function serializeList(items) { | |
var size = 0; | |
var i, p, data; | |
for (i = 0; i < items.length; i++) | |
size += 4 + items[i].length; | |
data = new Buffer(size); | |
p = 0; | |
for (i = 0; i < items.length; i++) { | |
data.writeUInt32LE(items[i].length, p); // ideally a varint | |
p += 4; | |
data.write(items[i], p, 'ascii'); | |
p += items[i].length; | |
} | |
return data; | |
} | |
function parseItem(data, index) { | |
var p = 0; | |
var i = 0; | |
var len; | |
// Skip over every item until we | |
// find the one we're looking for. | |
while (p < data.length) { | |
len = data.readUInt32LE(p); | |
p += 4; | |
// Found the item. | |
if (i === index) | |
return data.toString('ascii', p, p + len); | |
// Not ours, skip to the next item. | |
p += len; | |
i++; | |
} | |
// Not found. | |
return null; | |
} | |
function putList(items, callback) { | |
db.put('list', serializeList(items), callback); | |
} | |
function getItem(index, callback) { | |
db.get('list', function(err, data) { | |
if (err) | |
return callback(err); | |
return callback(null, parseItem(data, index)); | |
}); | |
} | |
var items = [ | |
'large string0', | |
'large string1', | |
'large string2' | |
]; | |
putList(items, function(err) { | |
if (err) | |
throw err; | |
getItem(1, function(err, item) { | |
if (err) | |
throw err; | |
console.log(item); // large string 1 | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment