@@ -1132,16 +1132,41 @@ static int register_genomicsqlite_functions(sqlite3 *db, const char **pzErrMsg,
11321132 rc =
11331133 sqlite3_create_function_v2 (db, fntab[i].fn , fntab[i].nArg , SQLITE_UTF8 | fntab[i].flags ,
11341134 nullptr , fntab[i].fp , nullptr , nullptr , nullptr );
1135- if (rc != SQLITE_OK)
1135+ if (rc != SQLITE_OK) {
1136+ if (pzErrMsg) {
1137+ *pzErrMsg =
1138+ sqlite3_mprintf (" Genomics Extension failed to register %s" , fntab[i].fn );
1139+ }
11361140 return rc;
1141+ }
11371142 }
11381143 rc = RegisterSQLiteVirtualTable<GenomicRangeIndexLevelsTVF>(db, " genomic_range_index_levels" );
1139- if (rc != SQLITE_OK)
1144+ if (rc != SQLITE_OK) {
1145+ if (pzErrMsg) {
1146+ *pzErrMsg =
1147+ sqlite3_mprintf (" Genomics Extension failed to register genomic_range_index_levels" );
1148+ }
11401149 return rc;
1150+ }
11411151 rc = RegisterSQLiteVirtualTable<GenomicRangeRowidsTVF>(db, " genomic_range_rowids" );
1142- if (rc != SQLITE_OK)
1152+ if (rc != SQLITE_OK) {
1153+ if (pzErrMsg) {
1154+ *pzErrMsg =
1155+ sqlite3_mprintf (" Genomics Extension failed to register genomic_range_rowids" );
1156+ }
1157+ return rc;
1158+ }
1159+ // genomicsqliteJson1Register() may return SQLITE_BUSY if JSON1 (possibly another version
1160+ // thereof) is already loaded, and the extension is being loaded by SELECT load_extension().
1161+ // That is tolerable.
1162+ rc = genomicsqliteJson1Register (db);
1163+ if (rc != SQLITE_OK && rc != SQLITE_BUSY) {
1164+ if (pzErrMsg) {
1165+ *pzErrMsg = sqlite3_mprintf (" Genomics Extension failed to register JSON1" );
1166+ }
11431167 return rc;
1144- return genomicsqliteJson1Register (db);
1168+ }
1169+ return SQLITE_OK;
11451170}
11461171
11471172/*
@@ -1156,25 +1181,29 @@ extern "C" int sqlite3_genomicsqlite_init(sqlite3 *db, char **pzErrMsg,
11561181 const string MIN_SQLITE_VERSION = " 3.31.0" ;
11571182 if (sqlite3_libversion_number () < MIN_SQLITE_VERSION_NUMBER) {
11581183 if (pzErrMsg) {
1159- string version_msg = " SQLite library version " + string (sqlite3_libversion ()) +
1160- " is older than " + MIN_SQLITE_VERSION +
1161- " which is required by Genomics Extension " GIT_REVISION;
1162- *pzErrMsg = (char *)sqlite3_malloc (version_msg.size () + 1 );
1163- if (*pzErrMsg) {
1164- strcpy (*pzErrMsg, version_msg.c_str ());
1165- }
1184+ *pzErrMsg = sqlite3_mprintf (
1185+ " SQLite library version %s is older than %s required by Genomics Extension %s" ,
1186+ sqlite3_libversion (), MIN_SQLITE_VERSION.c_str (), GIT_REVISION);
11661187 }
11671188 return SQLITE_ERROR;
11681189 }
11691190
11701191 int rc = (new ZstdVFS ())->Register (" zstd" );
1171- if (rc != SQLITE_OK)
1192+ if (rc != SQLITE_OK) {
1193+ if (pzErrMsg) {
1194+ *pzErrMsg = sqlite3_mprintf (" Genomics Extension failed initializing zstd_vfs" );
1195+ }
11721196 return rc;
1173- rc = register_genomicsqlite_functions (db, nullptr , pApi);
1197+ }
1198+ rc = register_genomicsqlite_functions (db, (const char **)pzErrMsg, pApi);
11741199 if (rc != SQLITE_OK)
11751200 return rc;
11761201 rc = sqlite3_auto_extension ((void (*)(void ))register_genomicsqlite_functions);
1177- if (rc != SQLITE_OK)
1202+ if (rc != SQLITE_OK) {
1203+ if (pzErrMsg) {
1204+ *pzErrMsg = sqlite3_mprintf (" Genomics Extension failed sqlite3_auto_extension" );
1205+ }
11781206 return rc;
1207+ }
11791208 return SQLITE_OK_LOAD_PERMANENTLY;
11801209}
0 commit comments