Add loadExtension() · sqlcipher/sqlcipher-android@274e357

@@ -341,6 +341,34 @@ static void nativeRegisterCustomFunction(JNIEnv* env, jclass clazz, jlong connec

341341

}

342342

}

343343344+

// from https://github.com/requery/sqlite-android/blob/665608662eaa0071465cb0887f34ae177e52f130/sqlite-android/src/main/jni/sqlite/android_database_SQLiteConnection.cpp#L953

345+

static void nativeLoadExtension(JNIEnv* env, jobject clazz,

346+

jlong connectionPtr, jstring file, jstring proc) {

347+

char* errorMessage;

348+349+

auto* connection = reinterpret_cast<SQLiteConnection*>(connectionPtr);

350+

int result = sqlite3_enable_load_extension(connection->db, 1);

351+

if (result == SQLITE_OK) {

352+

const char* fileChars = env->GetStringUTFChars(file, NULL);

353+

const char* procChars = NULL;

354+

if (proc) {

355+

procChars = env->GetStringUTFChars(proc, NULL);

356+

}

357+

result = sqlite3_load_extension(connection->db, fileChars, procChars, &errorMessage);

358+

env->ReleaseStringUTFChars(file, fileChars);

359+

if (proc) {

360+

env->ReleaseStringUTFChars(proc, procChars);

361+

}

362+

}

363+

if (result != SQLITE_OK) {

364+

char* formattedError = sqlite3_mprintf("Could not register extension: %s", errorMessage);

365+

sqlite3_free(errorMessage);

366+367+

throw_sqlite3_exception_errcode(env, result, formattedError);

368+

sqlite3_free(formattedError);

369+

}

370+

}

371+344372

static void nativeRegisterLocalizedCollators(JNIEnv* env, jclass clazz, jlong connectionPtr,

345373

jstring localeStr) {

346374

/* Localized collators are not supported. */

@@ -839,6 +867,8 @@ static JNINativeMethod sMethods[] =

839867

(void*)nativeClose },

840868

{ "nativeRegisterCustomFunction", "(JLnet/zetetic/database/sqlcipher/SQLiteCustomFunction;)V",

841869

(void*)nativeRegisterCustomFunction },

870+

{ "nativeLoadExtension", "(JLjava/lang/String;Ljava/lang/String;)V",

871+

(void*) nativeLoadExtension },

842872

{ "nativeRegisterLocalizedCollators", "(JLjava/lang/String;)V",

843873

(void*)nativeRegisterLocalizedCollators },

844874

{ "nativePrepareStatement", "(JLjava/lang/String;)J",