Initial commit

This commit is contained in:
Y.
2025-02-17 11:01:48 +01:00
committed by Yves
parent 305938d851
commit aec3a15ece
22 changed files with 951 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
#pragma once
#include "duckdb.hpp"
namespace duckdb {
class QuackExtension : public Extension {
public:
void Load(DuckDB &db) override;
std::string Name() override;
std::string Version() const override;
};
} // namespace duckdb

78
src/quack_extension.cpp Normal file
View File

@@ -0,0 +1,78 @@
#define DUCKDB_EXTENSION_MAIN
#include "quack_extension.hpp"
#include "duckdb.hpp"
#include "duckdb/common/exception.hpp"
#include "duckdb/common/string_util.hpp"
#include "duckdb/function/scalar_function.hpp"
#include "duckdb/main/extension_util.hpp"
#include <duckdb/parser/parsed_data/create_scalar_function_info.hpp>
// OpenSSL linked through vcpkg
#include <openssl/opensslv.h>
namespace duckdb {
inline void QuackScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
auto &name_vector = args.data[0];
UnaryExecutor::Execute<string_t, string_t>(
name_vector, result, args.size(),
[&](string_t name) {
return StringVector::AddString(result, "Quack "+name.GetString()+" 🐥");
});
}
inline void QuackOpenSSLVersionScalarFun(DataChunk &args, ExpressionState &state, Vector &result) {
auto &name_vector = args.data[0];
UnaryExecutor::Execute<string_t, string_t>(
name_vector, result, args.size(),
[&](string_t name) {
return StringVector::AddString(result, "Quack " + name.GetString() +
", my linked OpenSSL version is " +
OPENSSL_VERSION_TEXT );
});
}
static void LoadInternal(DatabaseInstance &instance) {
// Register a scalar function
auto quack_scalar_function = ScalarFunction("quack", {LogicalType::VARCHAR}, LogicalType::VARCHAR, QuackScalarFun);
ExtensionUtil::RegisterFunction(instance, quack_scalar_function);
// Register another scalar function
auto quack_openssl_version_scalar_function = ScalarFunction("quack_openssl_version", {LogicalType::VARCHAR},
LogicalType::VARCHAR, QuackOpenSSLVersionScalarFun);
ExtensionUtil::RegisterFunction(instance, quack_openssl_version_scalar_function);
}
void QuackExtension::Load(DuckDB &db) {
LoadInternal(*db.instance);
}
std::string QuackExtension::Name() {
return "quack";
}
std::string QuackExtension::Version() const {
#ifdef EXT_VERSION_QUACK
return EXT_VERSION_QUACK;
#else
return "";
#endif
}
} // namespace duckdb
extern "C" {
DUCKDB_EXTENSION_API void quack_init(duckdb::DatabaseInstance &db) {
duckdb::DuckDB db_wrapper(db);
db_wrapper.LoadExtension<duckdb::QuackExtension>();
}
DUCKDB_EXTENSION_API const char *quack_version() {
return duckdb::DuckDB::LibraryVersion();
}
}
#ifndef DUCKDB_EXTENSION_MAIN
#error DUCKDB_EXTENSION_MAIN not defined
#endif