Skip to content

Commit a711d39

Browse files
committed
Fixup patch, now allowing installing from other repositories via 'INSTALL x FROM community'
1 parent 60eadb4 commit a711d39

File tree

1 file changed

+84
-9
lines changed

1 file changed

+84
-9
lines changed

patches/duckdb/extension_install_rework.patch

Lines changed: 84 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
diff --git a/src/include/duckdb/main/database.hpp b/src/include/duckdb/main/database.hpp
2+
index 222a36c051..fb895920ef 100644
3+
--- a/src/include/duckdb/main/database.hpp
4+
+++ b/src/include/duckdb/main/database.hpp
5+
@@ -91,6 +91,10 @@ private:
6+
ValidChecker db_validity;
7+
unique_ptr<DatabaseFileSystem> db_file_system;
8+
shared_ptr<DatabaseCacheEntry> db_cache_entry;
9+
+public:
10+
+ static void SetPreferredRepository(const string& extension, const string &repository);
11+
+ static string GetPreferredRepository(const string& extension);
12+
+ static unordered_map<string, string> extensionsRepos;
13+
};
14+
15+
//! The database object. This object holds the catalog and all the
116
diff --git a/src/include/duckdb/main/extension_install_info.hpp b/src/include/duckdb/main/extension_install_info.hpp
217
index 6ccd1a1156..8040f537b6 100644
318
--- a/src/include/duckdb/main/extension_install_info.hpp
@@ -15,19 +30,52 @@ index 6ccd1a1156..8040f537b6 100644
1530

1631
//! Debugging repositories (target local, relative paths that are produced by DuckDB's build system)
1732
static constexpr const char *BUILD_DEBUG_REPOSITORY_PATH = "./build/debug/repository";
33+
diff --git a/src/main/database.cpp b/src/main/database.cpp
34+
index 4308c4a016..fe23c36ead 100644
35+
--- a/src/main/database.cpp
36+
+++ b/src/main/database.cpp
37+
@@ -328,6 +328,28 @@ DuckDB::DuckDB(DatabaseInstance &instance_p) : instance(instance_p.shared_from_t
38+
DuckDB::~DuckDB() {
39+
}
40+
41+
+unordered_map<string, string> DatabaseInstance::extensionsRepos = {};
42+
+
43+
+void DatabaseInstance::SetPreferredRepository(const string& extension, const string &repository) {
44+
+ auto &x = extensionsRepos;
45+
+ auto it = x.find(extension);
46+
+ if (it != x.end()) {
47+
+ it->second=repository;
48+
+ } else {
49+
+ x.emplace(extension, repository);
50+
+ }
51+
+}
52+
+
53+
+string DatabaseInstance::GetPreferredRepository(const string& extension) {
54+
+ const auto &x = extensionsRepos;
55+
+ auto it = x.find(extension);
56+
+ if (it != x.end()) {
57+
+ return it->second;
58+
+ }
59+
+ return "";
60+
+}
61+
+
62+
+
63+
SecretManager &DatabaseInstance::GetSecretManager() {
64+
return *config.secret_manager;
65+
}
1866
diff --git a/src/main/extension/extension_helper.cpp b/src/main/extension/extension_helper.cpp
19-
index c821caedea..aae791b786 100644
67+
index 494832417e..17a39d04b4 100644
2068
--- a/src/main/extension/extension_helper.cpp
2169
+++ b/src/main/extension/extension_helper.cpp
22-
@@ -319,7 +319,6 @@ vector<ExtensionUpdateResult> ExtensionHelper::UpdateExtensions(ClientContext &c
70+
@@ -328,7 +328,6 @@ vector<ExtensionUpdateResult> ExtensionHelper::UpdateExtensions(ClientContext &c
2371
vector<ExtensionUpdateResult> result;
2472
DatabaseInstance &db = DatabaseInstance::GetDatabase(context);
2573

2674
-#ifndef WASM_LOADABLE_EXTENSIONS
2775
case_insensitive_set_t seen_extensions;
2876

2977
// scan the install directory for installed extensions
30-
@@ -336,7 +335,6 @@ vector<ExtensionUpdateResult> ExtensionHelper::UpdateExtensions(ClientContext &c
78+
@@ -345,7 +344,6 @@ vector<ExtensionUpdateResult> ExtensionHelper::UpdateExtensions(ClientContext &c
3179

3280
result.push_back(UpdateExtensionInternal(context, db, fs, fs.JoinPath(ext_directory, path), extension_name));
3381
});
@@ -36,10 +84,30 @@ index c821caedea..aae791b786 100644
3684
return result;
3785
}
3886
diff --git a/src/main/extension/extension_install.cpp b/src/main/extension/extension_install.cpp
39-
index d190ea197c..157db58641 100644
87+
index b0ca9fb775..67dfcdfb26 100644
4088
--- a/src/main/extension/extension_install.cpp
4189
+++ b/src/main/extension/extension_install.cpp
42-
@@ -204,7 +204,7 @@ string ExtensionHelper::ExtensionUrlTemplate(optional_ptr<const DatabaseInstance
90+
@@ -144,6 +144,9 @@ bool ExtensionHelper::CreateSuggestions(const string &extension_name, string &me
91+
unique_ptr<ExtensionInstallInfo> ExtensionHelper::InstallExtension(DatabaseInstance &db, FileSystem &fs,
92+
const string &extension,
93+
ExtensionInstallOptions &options) {
94+
+ if (options.repository) {
95+
+ DatabaseInstance::SetPreferredRepository(extension, options.repository->path);
96+
+ }
97+
#ifdef WASM_LOADABLE_EXTENSIONS
98+
// Install is currently a no-op
99+
return nullptr;
100+
@@ -154,6 +157,9 @@ unique_ptr<ExtensionInstallInfo> ExtensionHelper::InstallExtension(DatabaseInsta
101+
102+
unique_ptr<ExtensionInstallInfo> ExtensionHelper::InstallExtension(ClientContext &context, const string &extension,
103+
ExtensionInstallOptions &options) {
104+
+ if (options.repository) {
105+
+ DatabaseInstance::SetPreferredRepository(extension, options.repository->path);
106+
+ }
107+
#ifdef WASM_LOADABLE_EXTENSIONS
108+
// Install is currently a no-op
109+
return nullptr;
110+
@@ -198,7 +204,7 @@ string ExtensionHelper::ExtensionUrlTemplate(optional_ptr<const DatabaseInstance
43111
versioned_path = "/${REVISION}/${PLATFORM}/${NAME}.duckdb_extension";
44112
}
45113
#ifdef WASM_LOADABLE_EXTENSIONS
@@ -49,10 +117,10 @@ index d190ea197c..157db58641 100644
49117
#else
50118
string default_endpoint = ExtensionRepository::DEFAULT_REPOSITORY_URL;
51119
diff --git a/src/main/extension/extension_load.cpp b/src/main/extension/extension_load.cpp
52-
index 7fe4fcb3db..3bdedd191c 100644
120+
index c0a37ea97a..6410048fc1 100644
53121
--- a/src/main/extension/extension_load.cpp
54122
+++ b/src/main/extension/extension_load.cpp
55-
@@ -295,7 +295,13 @@ bool ExtensionHelper::TryInitialLoad(DatabaseInstance &db, FileSystem &fs, const
123+
@@ -301,7 +301,20 @@ bool ExtensionHelper::TryInitialLoad(DatabaseInstance &db, FileSystem &fs, const
56124
direct_load = false;
57125
string extension_name = ApplyExtensionAlias(extension);
58126
#ifdef WASM_LOADABLE_EXTENSIONS
@@ -63,11 +131,18 @@ index 7fe4fcb3db..3bdedd191c 100644
63131
+ if (!custom_endpoint.empty()) {
64132
+ repository = ExtensionRepository("custom", custom_endpoint);
65133
+ }
134+
+ {
135+
+ auto preferredRepo = DatabaseInstance::GetPreferredRepository(extension);
136+
+ if (!preferredRepo.empty()) {
137+
+ repository = ExtensionRepository("x", preferredRepo);
138+
+ }
139+
+ }
140+
+
66141
+ string url_template = ExtensionUrlTemplate(db, repository, "");
67142
string url = ExtensionFinalizeUrlTemplate(url_template, extension_name);
68143

69144
char *str = (char *)EM_ASM_PTR(
70-
@@ -336,73 +342,223 @@ bool ExtensionHelper::TryInitialLoad(DatabaseInstance &db, FileSystem &fs, const
145+
@@ -342,73 +355,223 @@ bool ExtensionHelper::TryInitialLoad(DatabaseInstance &db, FileSystem &fs, const
71146
direct_load = true;
72147
filename = fs.ExpandPath(filename);
73148
}
@@ -345,7 +420,7 @@ index 7fe4fcb3db..3bdedd191c 100644
345420
#else
346421
auto dopen_from = filename;
347422
#endif
348-
@@ -420,25 +576,27 @@ bool ExtensionHelper::TryInitialLoad(DatabaseInstance &db, FileSystem &fs, const
423+
@@ -426,25 +589,27 @@ bool ExtensionHelper::TryInitialLoad(DatabaseInstance &db, FileSystem &fs, const
349424
result.lib_hdl = lib_hdl;
350425

351426
if (!direct_load) {

0 commit comments

Comments
 (0)