add first code for postgresql plugin: resourcepool type implementation webdav

Sat, 22 Jan 2022 19:13:40 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 22 Jan 2022 19:13:40 +0100
branch
webdav
changeset 270
4cfaa02055cd
parent 269
3dfbd0b91950
child 271
fd5765c5068c

add first code for postgresql plugin: resourcepool type implementation

Makefile file | annotate | diff | comparison | revisions
configure file | annotate | diff | comparison | revisions
make/install.mk file | annotate | diff | comparison | revisions
make/project.xml file | annotate | diff | comparison | revisions
src/server/daemon/config.c file | annotate | diff | comparison | revisions
src/server/daemon/resourcepool.c file | annotate | diff | comparison | revisions
src/server/plugins/postgresql/Makefile file | annotate | diff | comparison | revisions
src/server/plugins/postgresql/init.c file | annotate | diff | comparison | revisions
src/server/plugins/postgresql/init.h file | annotate | diff | comparison | revisions
src/server/plugins/postgresql/init.o file | annotate | diff | comparison | revisions
src/server/plugins/postgresql/resource.c file | annotate | diff | comparison | revisions
src/server/plugins/postgresql/resource.h file | annotate | diff | comparison | revisions
src/server/public/nsapi.h file | annotate | diff | comparison | revisions
--- a/Makefile	Sat Jan 22 11:06:11 2022 +0100
+++ b/Makefile	Sat Jan 22 19:13:40 2022 +0100
@@ -53,3 +53,5 @@
 install: all
 	cd make; $(MAKE) -f install.mk install
 
+install-bin: all
+	cd make; $(MAKE) -f install.mk install-bin
--- a/configure	Sat Jan 22 11:06:11 2022 +0100
+++ b/configure	Sat Jan 22 19:13:40 2022 +0100
@@ -251,6 +251,11 @@
         CFLAGS="$CFLAGS `$PKG_CONFIG --cflags libpq`"
         LDFLAGS="$LDFLAGS `$PKG_CONFIG --libs libpq`"
         CFLAGS="$CFLAGS -DENABLE_POSTGRESQL"    
+		cat >> $TEMP_DIR/make.mk << __EOF__
+# Dependency: libpq		
+PLUGINS += postgresql
+
+__EOF__
 		echo yes
         return 0
     done
@@ -464,6 +469,26 @@
 fi
 
 # Features
+
+
+echo >> $TEMP_DIR/config.mk
+if [ ! -z "${CFLAGS}" ]; then
+    echo "CFLAGS  += $CFLAGS" >> $TEMP_DIR/config.mk
+fi
+if [ ! -z "${CXXFLAGS}" ]; then
+    echo "CXXFLAGS += $CXXFLAGS" >> $TEMP_DIR/config.mk
+fi
+if [ ! -z "${LDFLAGS}" ]; then
+    echo "LDFLAGS += $LDFLAGS" >> $TEMP_DIR/config.mk
+fi
+
+# Target: postgresql
+CFLAGS=
+LDFLAGS=
+CXXFLAGS=
+
+
+# Features
 if [ ! -z "$FEATURE_POSTGRESQL" ]; then
 	# check dependency
 	dependency_libpq
@@ -479,13 +504,13 @@
 
 echo >> $TEMP_DIR/config.mk
 if [ ! -z "${CFLAGS}" ]; then
-    echo "CFLAGS  += $CFLAGS" >> $TEMP_DIR/config.mk
+    echo "POSTGRESQL_CFLAGS  += $CFLAGS" >> $TEMP_DIR/config.mk
 fi
 if [ ! -z "${CXXFLAGS}" ]; then
-    echo "CXXFLAGS += $CXXFLAGS" >> $TEMP_DIR/config.mk
+    echo "POSTGRESQL_CXXFLAGS += $CXXFLAGS" >> $TEMP_DIR/config.mk
 fi
 if [ ! -z "${LDFLAGS}" ]; then
-    echo "LDFLAGS += $LDFLAGS" >> $TEMP_DIR/config.mk
+    echo "POSTGRESQL_LDFLAGS += $LDFLAGS" >> $TEMP_DIR/config.mk
 fi
 
 if [ $ERROR -ne 0 ]; then
--- a/make/install.mk	Sat Jan 22 11:06:11 2022 +0100
+++ b/make/install.mk	Sat Jan 22 19:13:40 2022 +0100
@@ -30,25 +30,13 @@
 
 include ../config.mk
 
-install:
-	@echo "install Webserver to $(WS_INSTALL_DIR)"
-	mkdir -p $(INSTALL_DIR)/bin
-	mkdir -p $(INSTALL_DIR)/lib
-	mkdir -p $(INSTALL_DIR)/config
-	mkdir -p $(INSTALL_DIR)/docs
-	mkdir -p $(INSTALL_DIR)/logs
-	mkdir -p $(INSTALL_DIR)/include
+install: install-dir install-bin
 	@echo "copy config"
 	cp ../templates/config/init.conf $(INSTALL_DIR)/config/init.conf
 	cp ../templates/config/obj.conf $(INSTALL_DIR)/config/obj.conf
 	cp ../templates/config/mime.types $(INSTALL_DIR)/config/mime.types
 	cp ../templates/config/acl.conf $(INSTALL_DIR)/config/acl.conf
 	sed s:%%WS_HOST%%:$(HOST):g ../templates/config/server.template > $(INSTALL_DIR)/config/server.conf
-	@echo "copy binaries"
-	cp ../build/bin/webservd$(APP_EXT) $(INSTALL_DIR)/bin/
-	cp ../build/bin/wstool$(APP_EXT) $(INSTALL_DIR)/bin/
-	cp ../build/lib/libucx$(LIB_EXT) $(INSTALL_DIR)/lib/
-	cp ../build/lib/libwscfg$(LIB_EXT) $(INSTALL_DIR)/lib/
 	@echo "copy includes"
 	cp ../src/server/public/nsapi.h $(INSTALL_DIR)/include/nsapi.h
 	cp ../src/server/public/auth.h $(INSTALL_DIR)/include/auth.h
@@ -64,3 +52,18 @@
 	chmod +x $(INSTALL_DIR)/bin/reconfig
 	@echo "copy docs"
 	cp -R ../templates/docs $(INSTALL_DIR)/
+	
+install-dir:
+	@echo "install Webserver to $(WS_INSTALL_DIR)"
+	mkdir -p $(INSTALL_DIR)/bin
+	mkdir -p $(INSTALL_DIR)/lib
+	mkdir -p $(INSTALL_DIR)/config
+	mkdir -p $(INSTALL_DIR)/docs
+	mkdir -p $(INSTALL_DIR)/logs
+	mkdir -p $(INSTALL_DIR)/include
+
+install-bin: install-dir
+	@echo "copy binaries"
+	cp ../build/bin/webservd$(APP_EXT) $(INSTALL_DIR)/bin/
+	cp ../build/bin/wstool$(APP_EXT) $(INSTALL_DIR)/bin/
+	cp ../build/lib/* $(INSTALL_DIR)/lib/
--- a/make/project.xml	Sat Jan 22 11:06:11 2022 +0100
+++ b/make/project.xml	Sat Jan 22 19:13:40 2022 +0100
@@ -81,13 +81,19 @@
 	<dependency name="libpq">
 		<pkgconfig>libpq</pkgconfig>
 		<cflags>-DENABLE_POSTGRESQL</cflags>
+		<make>
+PLUGINS += postgresql
+		</make>
 	</dependency>
 	
 	<target>
+		<dependencies>libxml2,openssl</dependencies>
+	</target>
+	
+	<target name="postgresql">
 		<feature name="postgresql" default="false">
 			<dependencies>libpq</dependencies>
 		</feature>
-		<dependencies>libxml2,openssl</dependencies>
 	</target>
 </project>
 
--- a/src/server/daemon/config.c	Sat Jan 22 11:06:11 2022 +0100
+++ b/src/server/daemon/config.c	Sat Jan 22 19:13:40 2022 +0100
@@ -429,7 +429,7 @@
     scstr_t type = serverconfig_directive_value(obj, SC("Type"));
     
     int ret = 0;
-    if(resourcepool_new(cfg, name, type, obj)) {
+    if(resourcepool_new(cfg, type, name, obj)) {
         ret = 1;
     }
     
--- a/src/server/daemon/resourcepool.c	Sat Jan 22 11:06:11 2022 +0100
+++ b/src/server/daemon/resourcepool.c	Sat Jan 22 19:13:40 2022 +0100
@@ -42,6 +42,14 @@
     return resource_pool_types ? 0 : 1;
 }
 
+int resourcepool_register_type(const char *type_name, ResourceType *type_info) {
+    if(ucx_map_cstr_put(resource_pool_types, type_name, type_info)) {
+        log_ereport(LOG_CATASTROPHE, "resourcepool_register_type: OOM");
+        return 1;
+    }
+    return 0;
+}
+
 
 
 int resourcepool_new(ServerConfiguration *cfg, scstr_t type, scstr_t name, ConfigNode *node) {
@@ -67,7 +75,7 @@
     }
     respool->pool = cfg->pool;
     
-    void *respool_data = restype->init(cfg->pool, param);
+    void *respool_data = restype->init(cfg->pool, name.ptr, param);
     if(!respool_data) {
         log_ereport(LOG_FAILURE, "Cannot create resource pool data: pool: %s type: %s", name.ptr, type.ptr);
         return 1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server/plugins/postgresql/Makefile	Sat Jan 22 19:13:40 2022 +0100
@@ -0,0 +1,52 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 2022 Olaf Wintermann. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#   1. Redistributions of source code must retain the above copyright
+#      notice, this list of conditions and the following disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in the
+#      documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+BUILD_ROOT = ../../../..
+
+include $(BUILD_ROOT)/config.mk
+
+# list of source files
+SRC  = init.c
+SRC += resource.c
+
+OBJ = $(SRC:%.c=$(BUILD_ROOT)/build/server/plugins/postgresql/%$(OBJ_EXT))
+	
+BUILD_DIR = $(BUILD_ROOT)/build/server/plugins/postgresql
+
+PLUGIN_TARGET = $(BUILD_ROOT)/build/lib/libwspostgresql$(LIB_EXT)
+
+all: $(PLUGIN_TARGET)
+
+$(BUILD_DIR):
+	mkdir -p $(BUILD_DIR)
+
+$(PLUGIN_TARGET): $(BUILD_DIR) $(OBJ)
+	$(CC) $(POSTGRESQL_LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OBJ)
+
+$(BUILD_DIR)/%.o: %.c
+	$(CC) $(CFLAGS) $(POSTGRESQL_CFLAGS) $(SHLIB_CFLAGS) -c -o $@ $<
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server/plugins/postgresql/init.c	Sat Jan 22 19:13:40 2022 +0100
@@ -0,0 +1,40 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2022 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "init.h"
+
+#include "resource.h"
+
+int pg_init(pblock *pb, Session *sn, Request *Rq) {
+    if(resourcepool_register_type("postgresql", pg_get_resource_type())) {
+        log_ereport(LOG_FAILURE, "pg-init: Cannot register resourcepool type");
+        return REQ_ABORTED;
+    }
+    
+    return REQ_PROCEED;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server/plugins/postgresql/init.h	Sat Jan 22 19:13:40 2022 +0100
@@ -0,0 +1,48 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2022 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WS_PG_INIT_H
+#define WS_PG_INIT_H
+
+#include "../../public/nsapi.h"
+
+#include <libpq-fe.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int pg_init(pblock *pb, Session *sn, Request *Rq);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* WS_PG_INIT_H */
+
Binary file src/server/plugins/postgresql/init.o has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server/plugins/postgresql/resource.c	Sat Jan 22 19:13:40 2022 +0100
@@ -0,0 +1,130 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2022 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "resource.h"
+
+static ResourceType pg_resource_type = {
+    (resource_pool_init_func)pg_resourcepool_init,
+    (resource_pool_destroy_func)pg_resourcepool_destroy,
+    (resource_pool_createresource_func)pg_resourcepool_createresource,
+    (resource_pool_freeresource_func)pg_resourcepool_freeresource,
+    (resource_pool_prepare_func)pg_resourcepool_prepare,
+    (resource_pool_finish_func)pg_resourcepool_finish,
+    (resource_pool_getresourcedata_func)pg_resourcepool_getresourcedata
+};
+
+ResourceType* pg_get_resource_type(void) {
+    return &pg_resource_type;
+}
+
+void * pg_resourcepool_init(pool_handle_t *pool, const char *rpname, pblock *pb) {
+    char *connection = pblock_findval("Connection", pb);
+    if(!connection) {
+        log_ereport(LOG_MISCONFIG, "Resource pool %s: Missing Connection parameter", rpname);
+        return NULL;
+    }
+    
+    // test connection
+    PGconn *test_connection = PQconnectdb(connection);
+    if(pg_check_connection(rpname, test_connection)) {
+        return NULL; // error, pg_check_connection does the logging
+    }
+    PQfinish(test_connection);
+    
+    PgResourcePool *pg = pool_malloc(pool, sizeof(PgResourcePool));
+    if(!pg) {
+        return NULL;
+    }
+    pg->pool = pool;
+    pg->name = rpname;
+    pg->connection = connection;
+    
+    return pg;
+    
+}
+
+int pg_check_connection(const char *rpname, PGconn *connection) {
+    if(!connection) {
+        log_ereport(LOG_FAILURE, "Resource pool %s: Cannot create PQ connection", rpname);
+        return 1;
+    }
+    if(PQstatus(connection) != CONNECTION_OK) {
+        char *err = PQerrorMessage(connection);
+        int errlen = 0;
+        if(err) {
+            errlen = strlen(err);
+            if(errlen > 0 && err[errlen-1] == '\n') {
+                errlen--;
+            }
+        }
+        log_ereport(LOG_FAILURE, "Resource pool %s: Failed to connect to database: %.*s", rpname, errlen, err);
+        PQfinish(connection);
+        return 1;
+    }
+    return 0;
+}
+
+
+void   pg_resourcepool_destroy(PgResourcePool *pg) {
+    // unused
+}
+    
+void * pg_resourcepool_createresource(PgResourcePool *pg) {
+    PGconn *connection = PQconnectdb(pg->connection);
+    if(pg_check_connection(pg->name, connection)) {
+        return NULL;
+    }
+    
+    PgResource *res = pool_malloc(pg->pool, sizeof(PgResource));
+    if(!res) {
+        PQfinish(connection);
+        log_ereport(LOG_CATASTROPHE, "pg_resourcepool_createresource: OOM");
+        return NULL;
+    }
+    res->connection = connection;
+    
+    return res;
+}
+
+void   pg_resourcepool_freeresource(PgResourcePool *pg, PgResource *res) {
+    if(res->connection) {
+        PQfinish(res->connection);
+    }
+}
+
+int    pg_resourcepool_prepare(PgResourcePool *pg, PgResource *res) {
+    return 0;
+}
+
+int    pg_resourcepool_finish(PgResourcePool *pg, PgResource *res) {
+    return 0;
+}
+
+void * pg_resourcepool_getresourcedata(PgResource *res) {
+    return res->connection;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/server/plugins/postgresql/resource.h	Sat Jan 22 19:13:40 2022 +0100
@@ -0,0 +1,91 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2022 Olaf Wintermann. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RESOURCE_H
+#define RESOURCE_H
+
+#include "../../public/nsapi.h"
+
+#include <libpq-fe.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct PgResourcePool {
+    /*
+     * ResourcePool parameters
+     */
+    pblock *param;
+    
+    /*
+     * Cfg memorypool
+     */
+    pool_handle_t *pool;
+    
+    /*
+     * ResourcePool name
+     */
+    const char *name;
+    
+    /*
+     * connection string used for PQconnectdb
+     */
+    char *connection;
+    
+    
+} PgResourcePool;
+
+typedef struct PgResource {
+    PGconn *connection;
+} PgResource;
+    
+ResourceType* pg_get_resource_type(void);
+
+void * pg_resourcepool_init(pool_handle_t *pool, const char *rpname, pblock *pb);
+void   pg_resourcepool_destroy(PgResourcePool *pg);
+void * pg_resourcepool_createresource(PgResourcePool *pg);
+void   pg_resourcepool_freeresource(PgResourcePool *pg, PgResource *res);
+int    pg_resourcepool_prepare(PgResourcePool *pg, PgResource *res);
+int    pg_resourcepool_finish(PgResourcePool *pg, PgResource *res);
+void * pg_resourcepool_getresourcedata(PgResource *res);
+
+/*
+ * checks if conn is a working connection and logs an error message if not
+ * conn can be null (resulting in an error message)
+ * if conn is not null but the status is not CONNECTION_OK,
+ * conn will be destroyed
+ */
+int pg_check_connection(const char *rpname, PGconn *connection);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RESOURCE_H */
+
--- a/src/server/public/nsapi.h	Sat Jan 22 11:06:11 2022 +0100
+++ b/src/server/public/nsapi.h	Sat Jan 22 19:13:40 2022 +0100
@@ -358,9 +358,6 @@
 #ifndef HPUX
 #include <sys/select.h>
 #endif
-#ifndef BSD
-#include <alloca.h> /* new */
-#endif
 #include <sys/socket.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -770,14 +767,22 @@
 typedef struct ResourceType ResourceType;
 typedef struct ResourceData ResourceData;
 
+typedef void * (*resource_pool_init_func)(pool_handle_t *, const char *, pblock *);
+typedef void   (*resource_pool_destroy_func)(void *); 
+typedef void * (*resource_pool_createresource_func)(void *);
+typedef void   (*resource_pool_freeresource_func)(void *, void *);
+typedef int    (*resource_pool_prepare_func)(void *, void *);
+typedef int    (*resource_pool_finish_func)(void *, void *);
+typedef void * (*resource_pool_getresourcedata_func)(void *);
+
 struct ResourceType {
-    void * (*init)(pool_handle_t *, pblock *);
+    void * (*init)(pool_handle_t *, const char *, pblock *);
     void   (*destroy)(void *);
-    
     void * (*createresource)(void *);
     void   (*freeresource)(void *, void *);
     int    (*prepare)(void *, void *);
     int    (*finish)(void *, void *);
+    void * (*getresourcedata)(void *);
 };
 
 struct ResourceData {
@@ -785,6 +790,8 @@
     void *data;
 };
 
+int resourcepool_register_type(const char *type_name, ResourceType *type_info);
+
 //////
 /*
  * VSInitFunc, VSDestroyFunc, VSDirectiveInitFunc and VSDirectiveDestroyFunc

mercurial