Exemplo n.º 1
0
/*
** Compile the UTF-16 encoded SQL statement zSql into a statement handle.
*/
int sqlite3_prepare16(
  sqlite3 *db,              /* Database handle. */ 
  const void *zSql,         /* UTF-8 encoded SQL statement. */
  int nBytes,               /* Length of zSql in bytes. */
  sqlite3_stmt **ppStmt,    /* OUT: A pointer to the prepared statement */
  const void **pzTail       /* OUT: End of parsed string */
){
  /* This function currently works by first transforming the UTF-16
  ** encoded string to UTF-8, then invoking sqlite3_prepare(). The
  ** tricky bit is figuring out the pointer to return in *pzTail.
  */
  char *zSql8;
  const char *zTail8 = 0;
  int rc = SQLITE_OK;

  if( sqlite3SafetyCheck(db) ){
    return SQLITE_MISUSE;
  }
  zSql8 = sqlite3utf16to8(zSql, nBytes);
  if( zSql8 ){
    rc = sqlite3_prepare(db, zSql8, -1, ppStmt, &zTail8);
  }

  if( zTail8 && pzTail ){
    /* If sqlite3_prepare returns a tail pointer, we calculate the
    ** equivalent pointer into the UTF-16 string by counting the unicode
    ** characters between zSql8 and zTail8, and then returning a pointer
    ** the same number of characters into the UTF-16 string.
    */
    int chars_parsed = sqlite3utf8CharLen(zSql8, zTail8-zSql8);
    *pzTail = (u8 *)zSql + sqlite3utf16ByteLen(zSql, chars_parsed);
  }
  sqliteFree(zSql8); 
  return sqlite3ApiExit(db, rc);
}
/*
** Compile the UTF-16 encoded SQL statement zSql into a statement handle.
*/
int sqlite3_prepare16(
  sqlite3 *db,              /* Database handle. */ 
  const void *zSql,         /* UTF-8 encoded SQL statement. */
  int nBytes,               /* Length of zSql in bytes. */
  sqlite3_stmt **ppStmt,    /* OUT: A pointer to the prepared statement */
  const void **pzTail       /* OUT: End of parsed string */
){
  /* This function currently works by first transforming the UTF-16
  ** encoded string to UTF-8, then invoking sqlite3_prepare(). The
  ** tricky bit is figuring out the pointer to return in *pzTail.
  */
  char const *zSql8 = 0;
  char const *zTail8 = 0;
  int rc;
  sqlite3_value *pTmp;

  if( sqlite3SafetyCheck(db) ){
    return SQLITE_MISUSE;
  }
  pTmp = sqlite3GetTransientValue(db);
  sqlite3ValueSetStr(pTmp, -1, zSql, SQLITE_UTF16NATIVE, SQLITE_STATIC);
  zSql8 = sqlite3ValueText(pTmp, SQLITE_UTF8);
  if( !zSql8 ){
    sqlite3Error(db, SQLITE_NOMEM, 0);
    return SQLITE_NOMEM;
  }
  rc = sqlite3_prepare(db, zSql8, -1, ppStmt, &zTail8);

  if( zTail8 && pzTail ){
    /* If sqlite3_prepare returns a tail pointer, we calculate the
    ** equivalent pointer into the UTF-16 string by counting the unicode
    ** characters between zSql8 and zTail8, and then returning a pointer
    ** the same number of characters into the UTF-16 string.
    */
    int chars_parsed = sqlite3utf8CharLen(zSql8, zTail8-zSql8);
    *pzTail = (u8 *)zSql + sqlite3utf16ByteLen(zSql, chars_parsed);
  }
 
  return rc;
}
Exemplo n.º 3
0
/*
** Change the value of a Mem to be a string or a BLOB.
*/
int sqlite3VdbeMemSetStr(
    Mem *pMem,          /* Memory cell to set to string value */
    const char *z,      /* String pointer */
    int n,              /* Bytes in string, or negative */
    u8 enc,             /* Encoding of z.  0 for BLOBs */
    void (*xDel)(void*) /* Destructor function */
) {
    sqlite3VdbeMemRelease(pMem);
    if( !z ) {
        pMem->flags = MEM_Null;
        pMem->type = SQLITE_NULL;
        return SQLITE_OK;
    }

    pMem->z = (char *)z;
    if( xDel==SQLITE_STATIC ) {
        pMem->flags = MEM_Static;
    } else if( xDel==SQLITE_TRANSIENT ) {
        pMem->flags = MEM_Ephem;
    } else {
        pMem->flags = MEM_Dyn;
        pMem->xDel = xDel;
    }

    pMem->enc = enc;
    pMem->type = enc==0 ? SQLITE_BLOB : SQLITE_TEXT;
    pMem->n = n;

    switch( enc ) {
    case 0:
        pMem->flags |= MEM_Blob;
        break;

    case SQLITE_UTF8:
        pMem->flags |= MEM_Str;
        if( n<0 ) {
            pMem->n = strlen(z);
            pMem->flags |= MEM_Term;
        }
        break;

    case SQLITE_UTF16LE:
    case SQLITE_UTF16BE:
        pMem->flags |= MEM_Str;
        if( pMem->n<0 ) {
            pMem->n = sqlite3utf16ByteLen(pMem->z,-1);
            pMem->flags |= MEM_Term;
        }
        if( sqlite3VdbeMemHandleBom(pMem) ) {
            return SQLITE_NOMEM;
        }
        break;

    default:
        assert(0);
    }
    if( pMem->flags&MEM_Ephem ) {
        return sqlite3VdbeMemMakeWriteable(pMem);
    }
    return SQLITE_OK;
}