On Thu, Nov 12, 2009 at 05:06:20PM +0100, galea...@korg.it scratched on the 
wall:

> int MyClass::xCompare (void*  v, int iLen1, const void* str1, int  
> iLen2, const void* str2)
> {


> and I registered it:
> sqlite3_create_collation(mpDB,?MYCOLLATE", SQLITE_UTF8, NULL, 
> MyClass::xCompare);

  You can't do that.

  C++ puts a silent "this" pointer in as the first argument, so you
  cannot use a non-static class method as a callback.

  You must create a static method, like this:

static int MyClass:xCompareCallback( void *v,
        int iLen1, const void *str1, int iLen2, const void* str2) 
{
        MyClass *ptr = v;
        return v->xCompare(NULL, iLen1, str1, iLen2, str2);
}

  And register like this:

  sqlite3_create_collation(mpDB, "MYCOLLATE", SQLITE_UTF8,
          PtrToClassInstance, MyClass::xCompareCallback);


  The "PtrToClassInstance" must be a pointer to the class instance you
  want called.  If you're registering this inside your C++ class, you
  can use "this".

   -j

-- 
Jay A. Kreibich < J A Y  @  K R E I B I.C H >

"Our opponent is an alien starship packed with atomic bombs.  We have
 a protractor."   "I'll go home and see if I can scrounge up a ruler
 and a piece of string."  --from Anathem by Neal Stephenson
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to