OK, thanks, will have to study this carefully.
So, if I understand you well then the way I do it now I would need
sqlite3_free?

Not sure it is helpful, but this is the callback procedure as I have it. It
will find a specified string (second argument in SQL)
in the supplied field value (first argument) and produce a string as in the
first argument string, but leaving out all starting
at the start of the second argument string. I know all this can be done
quite simple with the built-in function substr and instr
and that is probably faster, but I just use this as test code:

Sub ClearStartAtStringX(ByVal lPtr_ObjContext As Long, _
                        ByVal lArgCount As Long, _
                        ByVal lPtr_ObjSQLite3_Value As Long)

        Dim lPtr1 As Long
        Dim lPtr2 As Long
        Dim lPtr3 As Long
        Dim lPtr4 As Long
        Dim str As String
        Dim str2 As String
        Dim lPos As Long
        Dim lBytes As Long

        'field value to alter
        '--------------------
10      lPtr1 = MemLong(lPtr_ObjSQLite3_Value) 'copy pointer
20      lPtr2 = sqlite3_value_text(lPtr1)
30      lBytes = sqlite3_value_bytes(lPtr1)
40      If lBytes = 0 Then
50        sqlite3_result_null lPtr_ObjContext
60        Exit Sub
70      End If
 'produce normal VB Unicode string
80      str = cSQL.PointerToString(lPtr2, CP_UTF8, lBytes, lBytes)

        'clear after finding this string
        '-------------------------------
90      lPtr3 = MemLong(lPtr_ObjSQLite3_Value + 4) 'copy pointer
100     lPtr4 = sqlite3_value_text(lPtr3)
110     lBytes = sqlite3_value_bytes(lPtr3)
 'produce normal VB Unicode string
120     str2 = cSQL.PointerToString(lPtr4, CP_UTF8, lBytes, lBytes)
130     lPos = InStr(1, str, str2, vbBinaryCompare) 'VB instr function

        'string not found, so return original field string
        '-------------------------------------------------
140     If lPos = 0 Then
150       sqlite3_result_value lPtr_ObjContext, lPtr1
160       Exit Sub
170     End If
180     sqlite3_result_text lPtr_ObjContext, StrPtr(str), _
       (lPos - 2) * 2, SQLITE_TRANSIENT

End Sub


RBS



On Mon, Dec 14, 2015 at 9:00 PM, Igor Tandetnik <igor at tandetnik.org> wrote:

> On 12/14/2015 3:09 PM, Bart Smissaert wrote:
>
>> It could be either a pointer to sqlite3_value_text of sqlite3_value*
>>
>
> No it can't be. sqlite3_result_text takes a char*, not a sqlite3_value* or
> a const unsigned char*(*)(sqlite3_value*)
>
> If you are saying that you plan to obtain the character pointer by calling
> sqlite3_value_text, then pass that exact pointer to sqlite3_result_text,
> then I would suggest you use sqlite3_result_value instead: it takes
> sqlite3_value* directly. If you insist on round-tripping through
> sqlite3_value_text, then you must pass SQLITE_TRANSIENT for the last
> parameter - the pointer returned by sqlite3_value_text is only guaranteed
> to be valid until the custom function returns.
>
> or it could be a pointer to a locally declared variable
>>
>
> In this case, you would also use SQLITE_TRANSIENT.
>
> --
> Igor Tandetnik
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>

Reply via email to