static void test_destructor( sqlite3_context *pCtx, int nArg, sqlite3_value **argv ){ char *zVal; int len; sqlite3 *db = sqlite3_user_data(pCtx); test_destructor_count_var++; assert( nArg==1 ); if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; len = sqlite3ValueBytes(argv[0], ENC(db)); zVal = sqliteMalloc(len+3); zVal[len] = 0; zVal[len-1] = 0; assert( zVal ); zVal++; memcpy(zVal, sqlite3ValueText(argv[0], ENC(db)), len); if( ENC(db)==SQLITE_UTF8 ){ sqlite3_result_text(pCtx, zVal, -1, destructor); #ifndef SQLITE_OMIT_UTF16 }else if( ENC(db)==SQLITE_UTF16LE ){ sqlite3_result_text16le(pCtx, zVal, -1, destructor); }else{ sqlite3_result_text16be(pCtx, zVal, -1, destructor); #endif /* SQLITE_OMIT_UTF16 */ } }
ikptr ik_sqlite3_result_text16be (ikptr s_context, ikptr s_text_data, ikptr s_text_start, ikptr s_text_len, ikptr s_destructor, ikpcb * pcb) { #ifdef HAVE_SQLITE3_RESULT_TEXT16BE sqlite3_context * context = IK_SQLITE_CONTEXT(s_context); void * ptr; int start; int len; sqlite3_destructor_type destructor; if (IK_IS_BYTEVECTOR(s_text_data)) { ptr = IK_BYTEVECTOR_DATA_VOIDP(s_text_data); if (IK_FALSE_OBJECT == s_text_len) len = IK_BYTEVECTOR_LENGTH(s_text_data); else len = ik_integer_to_int(s_text_len); } else if (IK_IS_POINTER(s_text_data)) { ptr = IK_POINTER_DATA_VOIDP(s_text_data); len = ik_integer_to_int(s_text_len); } else { /* we assume it is a memory-block */ ptr = IK_MBLOCK_DATA_VOIDP(s_text_data); if (IK_FALSE_OBJECT == s_text_len) len = IK_MBLOCK_SIZE_T(s_text_data); else len = ik_integer_to_int(s_text_len); } start = ik_integer_to_int(s_text_start); destructor = IK_DESTRUCTOR(s_destructor); sqlite3_result_text16be(context, ptr+start, len, destructor); return IK_VOID_OBJECT; #else feature_failure(__func__); #endif }
static void testHexToUtf16be( sqlite3_context *pCtx, int nArg, sqlite3_value **argv ){ int n; const char *zIn; char *zOut; assert( nArg==1 ); n = sqlite3_value_bytes(argv[0]); zIn = (const char*)sqlite3_value_text(argv[0]); zOut = sqlite3_malloc( n/2 ); if( zOut==0 ){ sqlite3_result_error_nomem(pCtx); }else{ testHexToBin(zIn, zOut); sqlite3_result_text16be(pCtx, zOut, n/2, sqlite3_free); } }
static int recoverColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ RecoverCursor *pCursor = (RecoverCursor*)cur; Recover *pRecover = (Recover*)pCursor->base.pVtab; u64 iColType; unsigned char *pColData; int shouldFree; int rc; FNENTRY(); if( i>=pRecover->nCols ){ return SQLITE_ERROR; } if( (pRecover->pTypes[i]&MASK_ROWID) ){ sqlite3_result_int64(ctx, leafCursorCellRowid(pCursor->pLeafCursor)); return SQLITE_OK; } pColData = NULL; shouldFree = 0; rc = leafCursorCellColInfo(pCursor->pLeafCursor, i, &iColType, &pColData, &shouldFree); if( rc!=SQLITE_OK ){ return rc; } if( !SerialTypeIsCompatible(iColType, pRecover->pTypes[i]) ){ if( shouldFree ){ sqlite3_free(pColData); } return SQLITE_ERROR; } switch( iColType ){ case 0 : sqlite3_result_null(ctx); break; case 1 : sqlite3_result_int64(ctx, decodeSigned(pColData, 1)); break; case 2 : sqlite3_result_int64(ctx, decodeSigned(pColData, 2)); break; case 3 : sqlite3_result_int64(ctx, decodeSigned(pColData, 3)); break; case 4 : sqlite3_result_int64(ctx, decodeSigned(pColData, 4)); break; case 5 : sqlite3_result_int64(ctx, decodeSigned(pColData, 6)); break; case 6 : sqlite3_result_int64(ctx, decodeSigned(pColData, 8)); break; case 7 : sqlite3_result_double(ctx, decodeFloat64(pColData)); break; case 8 : sqlite3_result_int(ctx, 0); break; case 9 : sqlite3_result_int(ctx, 1); break; case 10 : assert( iColType!=10 ); break; case 11 : assert( iColType!=11 ); break; default : { u32 l = SerialTypeLength(iColType); sqlite3_destructor_type pFn = SQLITE_TRANSIENT; if( shouldFree ){ pFn = sqlite3_free; shouldFree = 0; } if( SerialTypeIsBlob(iColType) ){ sqlite3_result_blob(ctx, pColData, l, pFn); }else{ if( pCursor->iEncoding==SQLITE_UTF16LE ){ sqlite3_result_text16le(ctx, (const void*)pColData, l, pFn); }else if( pCursor->iEncoding==SQLITE_UTF16BE ){ sqlite3_result_text16be(ctx, (const void*)pColData, l, pFn); }else{ sqlite3_result_text(ctx, (const char*)pColData, l, pFn); } } } break; } if( shouldFree ){ sqlite3_free(pColData); } return SQLITE_OK; }