Erstellung einer PostgreSQL-fähigen DLL in c++ / externe C++-Funktionen
-
Hallo Leute,
im Rahmen meines Praxissemesters soll ich über einen Testversuch herausfinden, ob PostgreSQL (Windows nicht Linux!, wir nutzen pgAdmin III) über das Microsoft Visual Studio 2010 erstellte externe Funktionen ( in C++) aufrufen kann. Weder ich noch mein Betreuer finden einen Lösungsweg oder einen Anhaltspunkt zum Vorgehen.
Einfach gesagt: PostgreSQL muss eine externe C++-Funktion ausführen können.
Die Frage ist bloß wie ich das anstelle und ob es überhaupt geht.Allgemein zu sagen ist es nur eine Idee, die mein Betreuer hatte und ich soll testen ob es geht und falls es geht, wie es sich auf die Performance auswirkt.
Für jeden Anhaltspunkt oder Tipp wäre ich sehr dankbar

-
Laut Wikipedia bietet PostgreSQL auch eine Schnittstelle zu C/C++. Zudem ist es OpenSource, klar sollte das gehen.
-
Ihr meint das hier: http://www.postgresql.org/docs/9.4/static/xfunc-c.html
Richtig?
Und was ist da jetzt der Haken, dass das mit Windows und VS2010 nicht funktionieren sollte?
-
Das weiß ich auch noch nicht. Ich bin noch nicht so tief in die Programmierszene involviert. Habe nur Java-Kenntnisse und muss jetzt im Praxissemester auf C++ programmieren.
Ich zitier einfach mal den Schritt in der Aufgabenstellung aus der ich ehrlich gesagt auch nicht so richtig schlau werde. (Mein Betreuer ist grad nicht da)
"2.0. Compiler u. Linker Optionen/Flags zum Erstellen einer PostgreSQL-fähigen DLL,SQL Funktionen als Schnittstelle zu den C/C++ Funktionen aus der DLL."
Eine Test-DLL habe ich schon erstellt, doch versteh ich diesen Schritt einfach nicht wirklich.

Aber Danke schon mal für die Antworten

-
Nach einem Tipp habe ich folgende Internetadresse als Anleitung bekommen.
http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/
Doch egal was ich mache es will einfach nicht im Release bauen.

Daher meine Frage : Funktioniert es bei euch ?
-
Natürlich geht das.
Ich kenne sogar zwei komplett verschiedene Wege das zu ermöglichen.
Funktioniert auf jeder Platform mit libpq Bindings, also auch unter Windows.Die Frage ist einzig und allein, was wollt ihr damit erreichen?
-
Dann wäre es sehr nett zu sagen wie das geht und vllt eine Anleitung zu geben.
Es ist ein Testprojekt um zu schauen ob sich die Performance verbessert, da die hier entwickelte Software ständig in Verbindung mit der Datenbank steht und jedesmal über 2 TB an Daten auslesen muss. Wir wollen halt schauen ob es sich an der Auslesegeschwindigkeit was tut wenn wir die Funktionen auslagern.
-
saitaide soll eine C/C++ Extension für PostgreSQL schreiben - es geht hier nicht
darum Abfragen an die Datenbank zu stellen - und nur dafür ist doch libpq, oder?@saitaide
wenn es im Debug kompiliert fehlen dir im Release nur die Einstellungen die du für den Debug-Build schon gemacht hast, also deine Include/Lib-Pfade - sonst kann es nichts sein
-
Ja der Fehler ist mittlerweile behoben. Ich bin mittlerweile schon am Schluss doch im pgAdmin wird mir immer wieder die Fehlermeldung angezeigt :
FEHLER: konnte Bibliothek »C:/Program Files/PostgreSQL/9.1/lib/postgresqllibfunctions.dll« nicht laden: %1 is not a valid Win32 application.
SQL Status:58P01Der Sinn der Fehlermeldung ist mir schon klar doch warum ... Ich habe es genauso gemacht wie es in dieser Anleitung steht.
http://blog.2ndquadrant.com/compiling-postgresql-extensions-visual-studio-windows/
Aber ich danke für euer Interesse und eure Bereitschaft zu helfen

-
woher kommt die postgresqllibfunctions.dll?
-liegt die auch dort?
-ist die von dir?
-x86 oder x64-Kompatiblitätsprobleme (wie gebaut)?
-
schau mal mit dem
http://www.dependencywalker.com/
ob alle dependencies der postgresqllibfunctions.dll erfuellt sind
sonst kann man dich auch nicht laden
-
Die habe ich erstellt bzw abkopiert von dem Beispiel auf dieser Seite. Ich hab den Dependency Walker runtergeladen, doch richtig schlau werd ich aus ihm auch nicht.
include "postgres.h"
#include <string.h>
#include "fmgr.h"
#include "utils/geo_decls.h"#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endifPG_FUNCTION_INFO_V1(add_one);
PGDLLEXPORT /* Insert this line before every extension function */
Datum
add_one(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);PG_RETURN_INT32(arg + 1);
}Das ist mein Code. Wie gesagt komplett abkopiert...
-
in den zwei Posts von mir waren bestimmt 4-5 Fragen drinn (Fragezeichen zählen) - welche hast du davon beantwortet?
wenn eine Dll auf anderen Dlls basiert muessen diese vorhanden sein sonst kann man diese Dll nicht laden - der Dependecy-Walker zeigt in gelb/rot ob irgendwas fehlt
dein Code sieht schön aus - was auch immer der bei deinem Dll-Ladeproblem helfen soll