From a340f4e1da354158e0236700d5105e2cdc84a532 Mon Sep 17 00:00:00 2001 From: Paul Reeves Date: Thu, 19 Jan 2023 16:52:45 +0100 Subject: [PATCH] Initial Commit --- sql/MyFirstUDRKit.sql | 33 ++++++++ src/MyFirstUDFKit.h | 172 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 sql/MyFirstUDRKit.sql create mode 100644 src/MyFirstUDFKit.h diff --git a/sql/MyFirstUDRKit.sql b/sql/MyFirstUDRKit.sql new file mode 100644 index 0000000..eead7fa --- /dev/null +++ b/sql/MyFirstUDRKit.sql @@ -0,0 +1,33 @@ +set term ^; + +create or alter package my_first_udr_kit +as +begin + +-- Add Procedure and Function Headers here +-- eg: +/* +procedure split_boolean ( + in_txt blob sub_type text, + in_separator varchar(31)) + returns ( + out_boolean boolean); +*/ + +end ^ + + +recreate package body my_first_udr_kit +as +begin + procedure split_boolean ( + in_txt blob sub_type text, + in_separator varchar(31)) + returns ( + out_boolean boolean) + external name 'my_first_udr_kit!split' engine udr; + +end ^ + + +set term ;^ diff --git a/src/MyFirstUDFKit.h b/src/MyFirstUDFKit.h new file mode 100644 index 0000000..804ef1e --- /dev/null +++ b/src/MyFirstUDFKit.h @@ -0,0 +1,172 @@ +/* + * License Boiler plate here + */ +#ifndef MY_FIRST_UDR_KIT_H +#define MY_FIRST_UDR_KIT_H + +#define FB_UDR_STATUS_TYPE ::Firebird::ThrowStatusWrapper + +#include "ibase.h" +#include "firebird/UdrCppEngine.h" +#include +#include + + + + + +// This is the basic stuff from UdrCppExample.h - seems to be declared in all UDR libraries + +namespace +{ + template + class AutoReleaseClear + { + public: + static void clear(T* ptr) + { + if (ptr) + ptr->release(); + } + }; + + template + class AutoDisposeClear + { + public: + static void clear(T* ptr) + { + if (ptr) + ptr->dispose(); + } + }; + + template + class AutoDeleteClear + { + public: + static void clear(T* ptr) + { + delete ptr; + } + }; + + template + class AutoArrayDeleteClear + { + public: + static void clear(T* ptr) + { + delete [] ptr; + } + }; + + template + class AutoImpl + { + public: + AutoImpl(T* aPtr = NULL) + : ptr(aPtr) + { + } + + ~AutoImpl() + { + Clear::clear(ptr); + } + + AutoImpl& operator =(T* aPtr) + { + Clear::clear(ptr); + ptr = aPtr; + return *this; + } + + operator T*() + { + return ptr; + } + + operator const T*() const + { + return ptr; + } + + bool operator !() const + { + return !ptr; + } + + bool hasData() const + { + return ptr != NULL; + } + + T* operator ->() + { + return ptr; + } + + T* release() + { + T* tmp = ptr; + ptr = NULL; + return tmp; + } + + void reset(T* aPtr = NULL) + { + if (aPtr != ptr) + { + Clear::clear(ptr); + ptr = aPtr; + } + } + + private: + // not implemented + AutoImpl(AutoImpl&); + void operator =(AutoImpl&); + + private: + T* ptr; + }; + + template class AutoDispose : public AutoImpl > + { + public: + AutoDispose(T* ptr = NULL) + : AutoImpl >(ptr) + { + } + }; + + template class AutoRelease : public AutoImpl > + { + public: + AutoRelease(T* ptr = NULL) + : AutoImpl >(ptr) + { + } + }; + + template class AutoDelete : public AutoImpl > + { + public: + AutoDelete(T* ptr = NULL) + : AutoImpl >(ptr) + { + } + }; + + template class AutoArrayDelete : public AutoImpl > + { + public: + AutoArrayDelete(T* ptr = NULL) + : AutoImpl >(ptr) + { + } + }; +} + +#endif // MY_FIRST_UDR_KIT_H