Can you provide an example program that omits the glib.h dependency?

On Sun, Feb 9, 2014 at 10:50 AM, gwenn <gwenn.k...@gmail.com> wrote:

> Hello,
> I am not sure but it seems there is a regression between versions
> 3.7.17 and 3.8.0.
> It's impacting custom/user declared function and auxiliary data.
>
> sqlite-amalgamation-3071700 gwen$ gcc
> -I/usr/local/Cellar/glib/2.38.2/include/glib-2.0
> -I/usr/local/Cellar/glib/2.38.2/lib/glib-2.0/include sqlite3.c
> auxdata.c -o auxdata -L/usr/local/Cellar/glib/2.38.2/lib -lglib-2.0
> sqlite-amalgamation-3071700 gwen$ ./auxdata
> loop 1
> (0) compiling...
> zzzzz
> (0) reusing...
> yyyyy
> loop 2
> (0) reusing...
> zzzzz
> (0) reusing...
> yyyyy
>
> sqlite-amalgamation-3080300 gwen$ gcc
> -I/usr/local/Cellar/glib/2.38.2/include/glib-2.0
> -I/usr/local/Cellar/glib/2.38.2/lib/glib-2.0/include sqlite3.c
> auxdata.c -o auxdata -L/usr/local/Cellar/glib/2.38.2/lib -lglib-2.0
> sqlite-amalgamation-3080300 gwen$ ./auxdata
> loop 1
> (0) compiling...
> zzzzz
> (0) reusing...
> yyyyy
> loop 2
> (0) compiling...
> zzzzz
> (0) reusing...
> yyyyy
>
> The auxiliary data is reused in the second loop with SQLite 3.7.17 but
> not with SQLite 3.8.0.
> What is the expected/correct behaviour?
>
> Regards
>
> Here is the content of auxdata.c:
> #include <stdlib.h>
> #include <stdio.h>
> #include <glib.h>
> #include "sqlite3.h"
>
> static void log(void *pArg, int iErrCode, const char *zMsg) {
> printf("(%d) %s\n", iErrCode, zMsg);
> }
>
> static void glibRegexpDelete(void *p){
>   GRegex *pRegex = (GRegex *)p;
>   g_regex_unref(pRegex);
> }
>
> static void glibReplaceAllFunc(
>   sqlite3_context *ctx,
>   int argc,
>   sqlite3_value **argv
> ){
> GError *err = NULL;
> GRegex *p;
> gchar *result = NULL;
>
> (void)argc;  /* Unused parameter */
>
> const gchar *str = (const gchar *) sqlite3_value_text(argv[1]);
> if (!str) {
> return;
> }
>
> const gchar *replacement = (const gchar *) sqlite3_value_text(argv[2]);
> if (!replacement) {
> sqlite3_result_error(ctx, "no replacement string", -1);
> return;
> }
>
> p = sqlite3_get_auxdata(ctx, 0);
> if( !p ){
> const gchar *re = (const gchar *) sqlite3_value_text(argv[0]);
> if( !re ){
> //sqlite3_result_error(ctx, "no regexp", -1);
> return;
> }
> p = g_regex_new(re, 0, 0, &err);
>
> if( p ){
> sqlite3_set_auxdata(ctx, 0, p, glibRegexpDelete);
> }else{
> char *e2 = sqlite3_mprintf("%s: %s", re, err->message);
> sqlite3_result_error(ctx, e2, -1);
> sqlite3_free(e2);
> g_error_free(err);
> return;
> }
> sqlite3_log(0, "compiling...");
> } else {
> sqlite3_log(0, "reusing...");
> }
>
> result = g_regex_replace(p, str, -1, 0, replacement, 0, &err);
> if (err) {
> sqlite3_result_error(ctx, err->message, -1);
> g_error_free(err);
> return;
> }
> sqlite3_result_text(ctx, result, -1, g_free);
> }
>
> int main(int argc, char **argv) {
> sqlite3_config(SQLITE_CONFIG_LOG, log, NULL);
> sqlite3 *db = NULL;
> sqlite3_stmt *stmt = NULL;
> char *zErrMsg = NULL;
> const char *z;
> int rc = 0;
> rc = sqlite3_open_v2(":memory:", &db, SQLITE_OPEN_FULLMUTEX |
> SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
> if (db == NULL || SQLITE_OK != rc) {
> fprintf(stderr, "Error: unable to open database: %s\n",
> sqlite3_errmsg(db));
> exit(1);
> }
> sqlite3_create_function_v2(db, "regex_replace", 3, SQLITE_UTF8, 0,
> glibReplaceAllFunc, NULL, NULL, NULL);
>   rc = sqlite3_prepare_v2(db, "select regex_replace('.', 'abcde', r)
> from (select 'z' as r union all select 'y')", -1, &stmt, NULL);
>   if (stmt == NULL || SQLITE_OK != rc) {
> fprintf(stderr, "Error: prepare stmt: %s\n", sqlite3_errmsg(db));
> exit(1);
>   }
>   for (int i = 1; i <= 2; i++) {
>   printf("loop %d\n", i);
>  rc = sqlite3_step(stmt);
>  while (rc == SQLITE_ROW) {
>   z = (const char*)sqlite3_column_text(stmt, 0);
>   printf("%s\n", z);
>   rc = sqlite3_step(stmt);
>  }
>  if (SQLITE_OK != rc && SQLITE_DONE != rc) {
> fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
> exit(1);
> }
>  rc = sqlite3_reset(stmt);
>  if (SQLITE_OK != rc) {
> fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
> exit(1);
> }
> }
>   sqlite3_finalize(stmt);
> sqlite3_close(db);
> }
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
D. Richard Hipp
d...@sqlite.org
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to