Skip to content

Commit

Permalink
Fix for U+0000 & some others below U+0020
Browse files Browse the repository at this point in the history
also using sqlite3_column_bytes to avoid possible trunction issue

address sidenote by @spacepope (Hannes Petersen <jhpetersen@gmx.de>)
about character values below 32 (U+0020) in
#2
  • Loading branch information
Christopher J. Brody committed Apr 6, 2018
1 parent 242fe23 commit 1b717e0
Showing 1 changed file with 25 additions and 5 deletions.
30 changes: 25 additions & 5 deletions native/sqlc.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ int sj(const char * j, int tl, char * a)
while (ti<tl) {
const uint8_t c = j[ti];
if (c == '\\') {
// XXX TODO TODO TODO TODO TODO
switch(j[ti+1]) {
case '\"':
a[ai++] = '\"';
Expand Down Expand Up @@ -217,6 +216,22 @@ int sj(const char * j, int tl, char * a)
ti += 2;
break;

case 'u':
// Needed for U+0000, vertical tab, and some others below U+0020:
{
char hex[5];
memcpy(hex, j+ti+2, 4);
hex[4] = '\0';
{
const n = strtol(hex, NULL, 16);
if (n < 128) a[ai++] = n;
// XXX TBD/TODO (???):
// else ...
}
}
ti += 6;
break;

default:
// XXX TODO what to do??
ti += 2;
Expand Down Expand Up @@ -455,7 +470,7 @@ const char *sqlc_evcore_qc_execute(sqlc_handle_t qc, const char * batch_json, in
rrlen += 5;
} else {
pptext = sqlite3_column_text(s, jj);
pplen = strlen(pptext);
pplen = sqlite3_column_bytes(s, jj);

// NOTE: add double pplen for JSON encoding
// XXX FUTURE TBD add 3x/4x pplen to deal with certain UTF-8 chars
Expand Down Expand Up @@ -507,6 +522,7 @@ const char *sqlc_evcore_qc_execute(sqlc_handle_t qc, const char * batch_json, in
rr[rrlen++] = pptext[pi++];
rr[rrlen++] = pptext[pi++];
} else if (pc >= 128) {
// XXX TBD ???:
sprintf(rr+rrlen, "?");
rrlen += strlen(rr+rrlen);
pi += 1;
Expand All @@ -530,10 +546,14 @@ const char *sqlc_evcore_qc_execute(sqlc_handle_t qc, const char * batch_json, in
rr[rrlen++] = '\\';
rr[rrlen++] = 'b';
pi += 1;
} else {
sprintf(rr+rrlen, "?%02x?", pc);
rrlen += strlen(rr+rrlen);
} else if (pc == 0) {
rr[rrlen++] = '\\';
rr[rrlen++] = '0';
pi += 1;
} else {
// other values in the range of:
// (pc >= 1 && pc < 32)
rr[rrlen++] = pptext[pi++];
}
}
strcpy(rr+rrlen, "\",");
Expand Down

0 comments on commit 1b717e0

Please sign in to comment.