Commit 72b2667b by Konstantin Käfer

support named columns in results

parent 01a5a040
...@@ -729,15 +729,18 @@ Local<Array> Statement::RowToJS(Data::Row* row) { ...@@ -729,15 +729,18 @@ Local<Array> Statement::RowToJS(Data::Row* row) {
Data::Row::const_iterator end = row->end(); Data::Row::const_iterator end = row->end();
for (int i = 0; it < end; it++, i++) { for (int i = 0; it < end; it++, i++) {
Data::Field* field = *it; Data::Field* field = *it;
Local<Value> value;
switch (field->type) { switch (field->type) {
case SQLITE_INTEGER: { case SQLITE_INTEGER: {
result->Set(i, Local<Integer>(Integer::New(((Data::Integer*)field)->value))); value = Local<Value>(Integer::New(((Data::Integer*)field)->value));
} break; } break;
case SQLITE_FLOAT: { case SQLITE_FLOAT: {
result->Set(i, Local<Number>(Number::New(((Data::Float*)field)->value))); value = Local<Value>(Number::New(((Data::Float*)field)->value));
} break; } break;
case SQLITE_TEXT: { case SQLITE_TEXT: {
result->Set(i, Local<String>(String::New(((Data::Text*)field)->value.c_str(), ((Data::Text*)field)->value.size()))); value = Local<Value>(String::New(((Data::Text*)field)->value.c_str(), ((Data::Text*)field)->value.size()));
} break; } break;
case SQLITE_BLOB: { case SQLITE_BLOB: {
#if NODE_VERSION_AT_LEAST(0,3,0) #if NODE_VERSION_AT_LEAST(0,3,0)
...@@ -746,12 +749,15 @@ Local<Array> Statement::RowToJS(Data::Row* row) { ...@@ -746,12 +749,15 @@ Local<Array> Statement::RowToJS(Data::Row* row) {
Buffer *buffer = Buffer::New(((Data::Blob*)field)->length); Buffer *buffer = Buffer::New(((Data::Blob*)field)->length);
memcpy(buffer->data(), ((Data::Blob*)field)->value, buffer->length()); memcpy(buffer->data(), ((Data::Blob*)field)->value, buffer->length());
#endif #endif
result->Set(i, buffer->handle_); value = Local<Value>::New(buffer->handle_);
} break; } break;
case SQLITE_NULL: { case SQLITE_NULL: {
result->Set(i, Local<Value>::New(Null())); value = Local<Value>::New(Null());
} break; } break;
} }
result->Set(i, value);
result->Set(String::NewSymbol(field->name.c_str()), value);
} }
return result; return result;
...@@ -762,25 +768,26 @@ void Statement::GetRow(Data::Row* row, sqlite3_stmt* stmt) { ...@@ -762,25 +768,26 @@ void Statement::GetRow(Data::Row* row, sqlite3_stmt* stmt) {
for (int i = 0; i < rows; i++) { for (int i = 0; i < rows; i++) {
int type = sqlite3_column_type(stmt, i); int type = sqlite3_column_type(stmt, i);
const char* name = sqlite3_column_name(stmt, i);
switch (type) { switch (type) {
case SQLITE_INTEGER: { case SQLITE_INTEGER: {
row->push_back(new Data::Integer(i, sqlite3_column_int(stmt, i))); row->push_back(new Data::Integer(name, sqlite3_column_int(stmt, i)));
} break; } break;
case SQLITE_FLOAT: { case SQLITE_FLOAT: {
row->push_back(new Data::Float(i, sqlite3_column_double(stmt, i))); row->push_back(new Data::Float(name, sqlite3_column_double(stmt, i)));
} break; } break;
case SQLITE_TEXT: { case SQLITE_TEXT: {
const char* text = (const char*)sqlite3_column_text(stmt, i); const char* text = (const char*)sqlite3_column_text(stmt, i);
int length = sqlite3_column_bytes(stmt, i); int length = sqlite3_column_bytes(stmt, i);
row->push_back(new Data::Text(i, length, text)); row->push_back(new Data::Text(name, length, text));
} break; } break;
case SQLITE_BLOB: { case SQLITE_BLOB: {
const void* blob = sqlite3_column_blob(stmt, i); const void* blob = sqlite3_column_blob(stmt, i);
int length = sqlite3_column_bytes(stmt, i); int length = sqlite3_column_bytes(stmt, i);
row->push_back(new Data::Blob(i, length, blob)); row->push_back(new Data::Blob(name, length, blob));
} break; } break;
case SQLITE_NULL: { case SQLITE_NULL: {
row->push_back(new Data::Null(i)); row->push_back(new Data::Null(name));
} break; } break;
default: default:
assert(false); assert(false);
......
var sqlite3 = require('sqlite3');
var assert = require('assert');
exports['test named columns'] = function(beforeExit) {
var db = new sqlite3.Database(':memory:');
var finished = false;
db.serialize(function() {
db.run("CREATE TABLE foo (txt TEXT, num INT)");
db.run("INSERT INTO foo VALUES($text, $id)", {
$id: 1,
$text: "Lorem Ipsum"
});
db.get("SELECT txt, num FROM foo ORDER BY num", function(err, row) {
if (err) throw err;
assert.equal(row.txt, "Lorem Ipsum");
assert.equal(row.num, 1);
finished = true;
});
});
beforeExit(function() {
assert.ok(finished);
});
};
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment