Skip to content

Commit

Permalink
lc_ctype fixes, test, README.md update
Browse files Browse the repository at this point in the history
  • Loading branch information
xdenser committed Mar 7, 2021
1 parent 826ebe9 commit 0680cf6
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 13 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ Check also samples directory and [this sample application](https://github.com/xd

options = {
lc_ctype: string // alternative connection charset - default is "UTF8", see FB/IB documentation for possible values
lc_decode: (Buffer) => string // conversion function for text/varchar fields - this allows only to read fields, if not provided and lc_ctype is not UTF8 text fields will be returned as Buffer from FBResult
lc_ctype_decode: (Buffer) => string // conversion function for text/varchar fields - this allows only to read fields, if not provided and lc_ctype is not UTF8 text fields will be returned as Buffer from FBResult
}


Expand Down
16 changes: 8 additions & 8 deletions src/fb-bindings-connection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -380,12 +380,12 @@ NAN_METHOD(Connection::New)
if (info.Length() >= 1 && info[0]->IsObject() ) {
Local<Object> options = info[0]->ToObject(Nan::GetCurrentContext()).ToLocalChecked();

if (Nan::Has(options, Nan::New("lc_type").ToLocalChecked()).FromMaybe(false)) {
Nan::SetPrivate(info.This(), Nan::New("lc_type").ToLocalChecked(), Nan::Get(options, Nan::New("lc_type").ToLocalChecked()).ToLocalChecked());
if (Nan::Has(options, Nan::New(PROP_LC_CTYPE).ToLocalChecked()).FromMaybe(false)) {
Nan::SetPrivate(info.This(), Nan::New(PROP_LC_CTYPE).ToLocalChecked(), Nan::Get(options, Nan::New(PROP_LC_CTYPE).ToLocalChecked()).ToLocalChecked());
}

if (Nan::Has(options, Nan::New("lc_decode").ToLocalChecked()).FromMaybe(false)) {
Nan::SetPrivate(info.This(), Nan::New("lc_decode").ToLocalChecked(), Nan::Get( options, Nan::New("lc_decode").ToLocalChecked() ).ToLocalChecked());
if (Nan::Has(options, Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked()).FromMaybe(false)) {
Nan::SetPrivate(info.This(), Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked(), Nan::Get( options, Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked() ).ToLocalChecked());
}
}

Expand All @@ -410,8 +410,8 @@ NAN_METHOD(Connection::ConnectSync)
Nan::Utf8String Role(info[3]->ToString(Nan::GetCurrentContext()).ToLocalChecked());
Local<String> _lc_type = Nan::New<String>(connection->lc_type).ToLocalChecked();

if (Nan::HasPrivate(info.This(), Nan::New("lc_type").ToLocalChecked()).FromMaybe(false)) {
_lc_type = Nan::GetPrivate(info.This(), Nan::New("lc_type").ToLocalChecked()).ToLocalChecked()->ToString(Nan::GetCurrentContext()).ToLocalChecked();
if (Nan::HasPrivate(info.This(), Nan::New(PROP_LC_CTYPE).ToLocalChecked()).FromMaybe(false)) {
_lc_type = Nan::GetPrivate(info.This(), Nan::New(PROP_LC_CTYPE).ToLocalChecked()).ToLocalChecked()->ToString(Nan::GetCurrentContext()).ToLocalChecked();
}

bool r = connection->Connect(*Database,*User,*Password,*Role,*Nan::Utf8String(_lc_type));
Expand Down Expand Up @@ -500,9 +500,9 @@ NAN_METHOD(Connection::Connect)
conn_req->Password = new Nan::Utf8String(info[2]->ToString(Nan::GetCurrentContext()).ToLocalChecked());
conn_req->Role = new Nan::Utf8String(info[3]->ToString(Nan::GetCurrentContext()).ToLocalChecked());

if (Nan::HasPrivate(info.This(), Nan::New("lc_type").ToLocalChecked()).FromMaybe(false)) {
if (Nan::HasPrivate(info.This(), Nan::New(PROP_LC_CTYPE).ToLocalChecked()).FromMaybe(false)) {

conn_req->lc_type = new Nan::Utf8String(Nan::GetPrivate(info.This(), Nan::New("lc_type").ToLocalChecked()).ToLocalChecked()->ToString(Nan::GetCurrentContext()).ToLocalChecked());
conn_req->lc_type = new Nan::Utf8String(Nan::GetPrivate(info.This(), Nan::New(PROP_LC_CTYPE).ToLocalChecked()).ToLocalChecked()->ToString(Nan::GetCurrentContext()).ToLocalChecked());
} else {
conn_req->lc_type = new Nan::Utf8String(Nan::New(conn->lc_type).ToLocalChecked());
}
Expand Down
2 changes: 2 additions & 0 deletions src/fb-bindings-connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
#define MAX_USERNAME_LENGTH 31
#define MAX_ROLENAME_LENGTH 31
#define MAX_PASSWORD_LENGTH 20
#define PROP_LC_CTYPE "lc_ctype"
#define PROP_LC_CTYPE_DECODE "lc_ctype_decode"

#include <uv.h>
#include "./fb-bindings.h"
Expand Down
8 changes: 4 additions & 4 deletions src/fb-bindings-fbresult.cc
Original file line number Diff line number Diff line change
Expand Up @@ -388,9 +388,9 @@ Local<Value>
if (!conn->isUTF8lctype) {
js_field = Nan::CopyBuffer(var->sqldata, var->sqllen).ToLocalChecked();

if (Nan::HasPrivate(conn->handle(), Nan::New("lc_decode").ToLocalChecked()).FromMaybe(false)) {
if (Nan::HasPrivate(conn->handle(), Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked()).FromMaybe(false)) {
argv[0] = js_field;
js_field = Nan::Call(Local<Function>::Cast(Nan::GetPrivate(conn->handle(), Nan::New("lc_decode").ToLocalChecked()).ToLocalChecked()), conn->handle(), 1, argv).ToLocalChecked();
js_field = Nan::Call(Local<Function>::Cast(Nan::GetPrivate(conn->handle(), Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked()).ToLocalChecked()), conn->handle(), 1, argv).ToLocalChecked();
}
}
else {
Expand Down Expand Up @@ -418,9 +418,9 @@ Local<Value>
if (!conn->isUTF8lctype) {
js_field = Nan::CopyBuffer((const char*)(vary2->vary_string), vary2->vary_length).ToLocalChecked();

if (Nan::HasPrivate(conn->handle(), Nan::New("lc_decode").ToLocalChecked()).FromMaybe(false)) {
if (Nan::HasPrivate(conn->handle(), Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked()).FromMaybe(false)) {
argv[0] = js_field;
js_field = Nan::Call(Local<Function>::Cast(Nan::GetPrivate(conn->handle(), Nan::New("lc_decode").ToLocalChecked()).ToLocalChecked()), conn->handle(), 1, argv).ToLocalChecked();
js_field = Nan::Call(Local<Function>::Cast(Nan::GetPrivate(conn->handle(), Nan::New(PROP_LC_CTYPE_DECODE).ToLocalChecked()).ToLocalChecked()), conn->handle(), 1, argv).ToLocalChecked();
}
}
else {
Expand Down
17 changes: 17 additions & 0 deletions tests/def/test-binding.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,20 @@ exports.TransactionBinding = function (test) {
test.done();
}

exports.Lc_ctype = function(test) {
test.expect(3);
var conn = safe_con.createConnection({
lc_ctype : "ASCII",
lc_ctype_decode: function (buffer) {
// test buffer
test.ok(buffer instanceof Buffer, "buffer expected");
return buffer;
}
});
conn.connectSync(cfg.db, cfg.user, cfg.password, cfg.role);
var res = conn.querySync("select first 1 RDB$RELATION_NAME from rdb$relations").fetchSync("all",true);
test.ok(res,"Query");
test.ok(res[0]["RDB$RELATION_NAME"] instanceof Buffer,"Buffer returned");
test.done();
}

0 comments on commit 0680cf6

Please sign in to comment.