Merge pull request #163 from duckdb/yl/new-ext-loader

Add support for new extension loader
This commit is contained in:
Y.
2025-06-11 05:35:50 -04:00
committed by GitHub
3 changed files with 41 additions and 0 deletions

View File

@@ -6,7 +6,12 @@ namespace duckdb {
class UiExtension : public Extension {
public:
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
void Load(ExtensionLoader &loader) override;
#else
void Load(DuckDB &db) override;
#endif
std::string Name() override;
std::string Version() const override;
};

View File

@@ -1,7 +1,9 @@
#pragma once
#include <duckdb.hpp>
#ifndef DUCKDB_CPP_EXTENSION_ENTRY
#include <duckdb/main/extension_util.hpp>
#endif
#include <type_traits>
namespace duckdb {
@@ -64,6 +66,15 @@ void TableFunc(ClientContext &context, TableFunctionInput &input,
output.SetValue(0, 0, result);
}
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
template <typename Func, Func func>
void RegisterTF(ExtensionLoader &loader, const char *name) {
TableFunction tf(name, {}, internal::TableFunc<Func, func>,
internal::SingleStringResultBind,
RunOnceTableFunctionState::Init);
loader.RegisterFunction(tf);
}
#else
template <typename Func, Func func>
void RegisterTF(DatabaseInstance &instance, const char *name) {
TableFunction tf(name, {}, internal::TableFunc<Func, func>,
@@ -71,10 +82,16 @@ void RegisterTF(DatabaseInstance &instance, const char *name) {
RunOnceTableFunctionState::Init);
ExtensionUtil::RegisterFunction(instance, tf);
}
#endif
} // namespace internal
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
#define REGISTER_TF(name, func) \
internal::RegisterTF<decltype(&func), &func>(loader, name)
#else
#define REGISTER_TF(name, func) \
internal::RegisterTF<decltype(&func), &func>(instance, name)
#endif
} // namespace duckdb

View File

@@ -13,6 +13,7 @@
#ifdef _WIN32
#define OPEN_COMMAND "start"
#undef CreateDirectory // avoid being transformed to `CreateDirectoryA`
#elif __linux__
#define OPEN_COMMAND "xdg-open"
#else
@@ -81,7 +82,12 @@ void InitStorageExtension(duckdb::DatabaseInstance &db) {
config.storage_extensions[STORAGE_EXTENSION_KEY] = std::move(ext);
}
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
static void LoadInternal(ExtensionLoader &loader) {
auto &instance = loader.GetDatabaseInstance();
#else
static void LoadInternal(DatabaseInstance &instance) {
#endif
InitStorageExtension(instance);
// If the server is already running we need to update the database instance
@@ -128,11 +134,20 @@ static void LoadInternal(DatabaseInstance &instance) {
TableFunction tf("ui_is_started", {}, IsUIStartedTableFunc,
internal::SingleBoolResultBind,
RunOnceTableFunctionState::Init);
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
loader.RegisterFunction(tf);
#else
ExtensionUtil::RegisterFunction(instance, tf);
#endif
}
}
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
void UiExtension::Load(ExtensionLoader &loader) { LoadInternal(loader); }
#else
void UiExtension::Load(DuckDB &db) { LoadInternal(*db.instance); }
#endif
std::string UiExtension::Name() { return "ui"; }
std::string UiExtension::Version() const { return UI_EXTENSION_VERSION; }
@@ -141,10 +156,14 @@ std::string UiExtension::Version() const { return UI_EXTENSION_VERSION; }
extern "C" {
#ifdef DUCKDB_CPP_EXTENSION_ENTRY
DUCKDB_CPP_EXTENSION_ENTRY(ui, loader) { duckdb::LoadInternal(loader); }
#else
DUCKDB_EXTENSION_API void ui_init(duckdb::DatabaseInstance &db) {
duckdb::DuckDB db_wrapper(db);
db_wrapper.LoadExtension<duckdb::UiExtension>();
}
#endif
DUCKDB_EXTENSION_API const char *ui_version() {
return duckdb::DuckDB::LibraryVersion();