Обсуждение: C-functions using SPI Missing Magic Block Error
Hello,
I've got a problem with user defined functions in C using SPI.
Using: PostgreSQL 8.3.7, Codeblocks (GNU GCC Compiler), Windows Server 2003 R2
I compiled the file "pgExampleSPI.c" with the following code without any error:
/* Use 32-bit timer (provided header file uses 64-bit timer, not
* compatible with Windows postgreSQL versions */
#define _USE_32BIT_TIME_T
#include "postgres.h"
#include "executor\spi.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
extern Datum count_person (PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(count_person);
__declspec(dllexport) Datum count_person(PG_FUNCTION_ARGS) {
int32 ret;
SPI_connect();
ret = SPI_exec("SELECT count(*) FROM person", 0);
SPI_finish();
PG_RETURN_INT32(ret);
}
- then I've copied the resulting file "pgExampleSPI.dll" into the directory "G:\PostgreSQL\8.3\lib"
- I tried to load to function into PostgreSQL with the command:
CREATE FUNCTION count_person() RETURNS int
AS 'G:/PostgreSQL/8.3/lib/pgExampleSPI.dll', 'count_person'
LANGUAGE C STRICT;
- and received the following error description:
ERROR: incompatible library "G:/PostgreSQL/8.3/lib/pgExampleSPI.dll": missing magic block
TIP: Extension libraries are required to use the PG_MODULE_MAGIC macro.
After searching google for about 5 hours in couldn't find a way to solve this problem.
Can anybody help me, please?
Thanks, Max.
___________________________________________________________
WEB.DE DSL ab 19,99 Euro/Monat. Bis zu 150,- Euro Startguthaben und
50,- Euro Geldprämie inklusive! https://freundschaftswerbung.web.de
Saitenheini@web.de writes:
> I compiled the file "pgExampleSPI.c" with the following code without any error:
> /* Use 32-bit timer (provided header file uses 64-bit timer, not
> * compatible with Windows postgreSQL versions */
> #define _USE_32BIT_TIME_T
> #include "postgres.h"
> #include "executor\spi.h"
> #ifdef PG_MODULE_MAGIC
> PG_MODULE_MAGIC;
> #endif
That's not going to do anything because you didn't #include the header
that defines PG_MODULE_MAGIC. I think it's fmgr.h but not sure offhand.
I'd suggest taking out the #ifdef so you actually get an error if the
definition isn't provided.
regards, tom lane
Thanks for reply Tom!
I've tried several version:
#define _USE_32BIT_TIME_T
#include "postgres.h"
#include "fmgr.h"
#include "executor\spi.h"
/*
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
*/
extern Datum count_person (PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(count_person);
__declspec(dllexport)
Datum count_person(PG_FUNCTION_ARGS) {
int32 ret;
SPI_connect();
ret = SPI_exec("SELECT count(*) FROM person", 0);
SPI_finish();
PG_RETURN_INT32(ret);
}
but still the same error occurs.
I also tried to include pgmagic.h, which I found in here:
http://archives.postgresql.org/pgsql-committers/2006-05/msg00369.php
http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/include/Attic/pgmagic.h?rev=1.1&content-type=text/x-cvsweb-markup
but this produces a compiler error:
G:\PostgreSQL\8.3\include\server\pgmagic.h|40|error: conflicting types for 'Pg_magic_struct'|
G:\PostgreSQL\8.3\include\server\fmgr.h|367|error: previous declaration of 'Pg_magic_struct' was here|
G:\PostgreSQL\8.3\include\server\pgmagic.h|45|error: conflicting types for 'PGModuleMagicFunction'|
G:\PostgreSQL\8.3\include\server\fmgr.h|383|error: previous declaration of 'PGModuleMagicFunction' was here|
G:\PostgreSQL\8.3\include\server\pgmagic.h|50|warning: "PG_MODULE_MAGIC" redefined|
G:\PostgreSQL\8.3\include\server\fmgr.h|388|warning: this is the location of the previous definition|
G:\PostgreSQL\8.3\include\server\pgmagic.h|66|warning: "PG_MODULE_MAGIC_DATA" redefined|
G:\PostgreSQL\8.3\include\server\fmgr.h|370|warning: this is the location of the previous definition|
||=== Build finished: 4 errors, 4 warnings ===|
I tried to build it in Visual C++ Express 2010 but compiler error occur (SPI_connect())
Any Idea to solve the problem ?
___________________________________________________________
WEB.DE DSL ab 19,99 Euro/Monat. Bis zu 150,- Euro Startguthaben und
50,- Euro Geldprämie inklusive! https://freundschaftswerbung.web.de
On 07/02/2010 08:13 AM, Saitenheini@web.de wrote: > Thanks for reply Tom! > > I've tried several version: > > #define _USE_32BIT_TIME_T > > #include "postgres.h" > #include "fmgr.h" > #include "executor\spi.h" > > /* > #ifdef PG_MODULE_MAGIC > PG_MODULE_MAGIC; > #endif > */ > but still the same error occurs. You commented out PG_MODULE_MAGIC; -- don't do that. Just remove the #ifdef around it. HTH, Joe
Вложения
Thanks, I've already tried that. I doesn't make any difference. Still the same error. in Visual C++ I can't even compile it, although I set all links and compiler directories like it was told in this post: http://www.postgresql.org/docs/8.2/interactive/xfunc-c.html I don't have more ideas. What could I do? >On 07/02/2010 08:13 AM, Saitenheini@web.de wrote: >> Thanks for reply Tom! >> >> I've tried several version: >> >> #define _USE_32BIT_TIME_T >> >> #include "postgres.h" >> #include "fmgr.h" >> #include "executor\spi.h" >> >> /* >> #ifdef PG_MODULE_MAGIC >> PG_MODULE_MAGIC; >> #endif >> */ > >> but still the same error occurs. > >You commented out > > PG_MODULE_MAGIC; > > -- don't do that. Just remove the #ifdef around it. > >HTH, > >Joe > ___________________________________________________________ WEB.DE DSL ab 19,99 Euro/Monat. Bis zu 150,- Euro Startguthaben und 50,- Euro Geldprämie inklusive! https://freundschaftswerbung.web.de
Вложения
On 07/02/2010 08:36 AM, Saitenheini@web.de wrote: > Thanks, I've already tried that. I doesn't make any difference. Still the same error. > > in Visual C++ I can't even compile it, although I set all links and compiler directories like it was told in this post: > http://www.postgresql.org/docs/8.2/interactive/xfunc-c.html > > I don't have more ideas. > What could I do? Building extensions on Windows is a royal pain (at least for me it is). I would suggest either: a) switch to Linux (I know, probably not a helpful suggestion) -or- b) possibly try adding your function to an existing contrib, e.g. tablefunc, and see if you can compile that The build infrastructure on Windows with VC++ is difficult to work with. In order to get PL/R to compile with VC++ I had to hack the provided perl build scripts. That could be a third option for you, but (b) is probably far easier for you. Joe
Вложения
I'll try b) and hope I can find a solution. Thanks for your support Joe. Kind Regards, Max. >On 07/02/2010 08:36 AM, Saitenheini@web.de wrote: >> Thanks, I've already tried that. I doesn't make any difference. Still the same error. >> >> in Visual C++ I can't even compile it, although I set all links and compiler directories like it was told in this post: >> http://www.postgresql.org/docs/8.2/interactive/xfunc-c.html >> >> I don't have more ideas. >> What could I do? > >Building extensions on Windows is a royal pain (at least for me it is). >I would suggest either: > >a) switch to Linux (I know, probably not a helpful suggestion) > > -or- > >b) possibly try adding your function to an existing contrib, e.g. > tablefunc, and see if you can compile that > >The build infrastructure on Windows with VC++ is difficult to work with. >In order to get PL/R to compile with VC++ I had to hack the provided >perl build scripts. That could be a third option for you, but (b) is >probably far easier for you. > >Joe > > ___________________________________________________________ WEB.DE DSL ab 19,99 Euro/Monat. Bis zu 150,- Euro Startguthaben und 50,- Euro Geldprämie inklusive! https://freundschaftswerbung.web.de