On Mon, Dec 05, 2005 at 08:23:19AM -0500, [EMAIL PROTECTED] wrote:
> > OK, so 1.11 is on CPAN which fixes this. However I have another bug 
> > report about this not working for user defined functions, where I do 
> > this:
> > 
> >          s = SvPV(result, len);
> >          sqlite3_result_text( context, s, len, SQLITE_TRANSIENT );

I'm the original reporter of that bug, and I can confirm that while it
did not work in DBD::SQLite 1.09, it works without problem in 1.11.

sqlite3_result_text() appears to deal fine with embedded NUL's.
Attached is a tiny C program I just used to confirm this to myself.

Large thanks to Matt and Richard for so quickly ending up with a great
solution that just transparently works!

--nate


#include <stdio.h>
#include <sqlite3.h>

/* gcc test_blob_as_text.c -lsqlite3 -o test_blob_as_text */


static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

char blob[] = { 'b', 'l', 0, 'o', 'b'};

void blob_as_text(sqlite3_context *context,
                  int argc,
                  sqlite3_value **argv) {
    sqlite3_result_text( context, blob, sizeof(blob), SQLITE_TRANSIENT );
}

void blob_as_blob(sqlite3_context *context,
                  int argc,
                  sqlite3_value **argv) {
    sqlite3_result_blob( context, blob, sizeof(blob), SQLITE_TRANSIENT );
}

void bytes(sqlite3_context *context,
           int argc,
           sqlite3_value **argv) {
    int length = sqlite3_value_bytes(argv[0]);
    sqlite3_result_int( context, length );
}


int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  if( argc!=2 ){
    fprintf(stderr, "Usage: %s DATABASE\n", argv[0]);
    exit(1);
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }

  rc = sqlite3_create_function(db, "blob_as_text", 0, SQLITE_UTF8,
                               db, blob_as_text, 0, 0);
  if( rc!=SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
  }

  rc = sqlite3_create_function(db, "blob_as_blob", 0, SQLITE_UTF8,
                               db, blob_as_text, 0, 0);
  if( rc!=SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
  }

  rc = sqlite3_create_function(db, "bytes", 1, SQLITE_UTF8,
                               db, bytes, 0, 0);
  if( rc!=SQLITE_OK ){
      fprintf(stderr, "SQL error: %s\n", zErrMsg);
  }

  char query[1000];
  sprintf(query, "SELECT %d as 'Correct Answer', "
          "bytes(blob_as_text()), bytes(blob_as_blob())", sizeof(blob));

  rc = sqlite3_exec(db, query,callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
  }

  sqlite3_close(db);
  return 0;
}

Reply via email to