Обсуждение: Error running custom plugin: “output plugins have to declare the _PG_output_plugin_init symbol”
Hi, I'm kind of new to Postgres and I'm trying to create a custom output
plugin for logical replication (Postgres is 9.5.4 version and I'm building
the project from a Windows 8/64 bit machine - same machine where the db is
installed).
I started from the code of the sample test_decoding, and I was trying to
simply rebuild it under a new name and install it into Postgres to see if
the module works. Once done, I will start modifying the code.
My project is built in Visual Studio 2013 and the only steps I took were to
copy the built assembly under Postgres lib folder. When I run the command:
postgres=# SELECT * FROM
pg_create_logical_replication_slot('regression_slot', 'my_decoding');
I get an error saying that "output plugins have to declare the
_PG_output_plugin_init symbol".
In my code, I have the function declared as extern:
extern void _PG_init(void);
extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);
and the body of the function is defined somewhere below it.
The actual code is just a copy of the test_decoding sample:
https://github.com/postgres/postgres/blob/REL9_5_STABLE/contrib/test_decoding/test_decoding.c
I'm not sure if the deployment process is ok (just copying the dll) or if
there is some other step to take. Can anyone shed some light?
thanks -
--
View this message in context:
http://postgresql.nabble.com/Error-running-custom-plugin-output-plugins-have-to-declare-the-PG-output-plugin-init-symbol-tp5921145.html
Sent from the PostgreSQL - hackers mailing list archive at Nabble.com.
On Wed, Sep 14, 2016 at 4:03 PM, valeriof <valerio_farruggio@hotmail.com> wrote:
> Hi, I'm kind of new to Postgres and I'm trying to create a custom output
> plugin for logical replication (Postgres is 9.5.4 version and I'm building
> the project from a Windows 8/64 bit machine - same machine where the db is
> installed).
> I started from the code of the sample test_decoding, and I was trying to
> simply rebuild it under a new name and install it into Postgres to see if
> the module works. Once done, I will start modifying the code.
>
> My project is built in Visual Studio 2013 and the only steps I took were to
> copy the built assembly under Postgres lib folder. When I run the command:
>
> postgres=# SELECT * FROM
> pg_create_logical_replication_slot('regression_slot', 'my_decoding');
>
> I get an error saying that "output plugins have to declare the
> _PG_output_plugin_init symbol".
>
The error comes from LoadOutputPlugin(), when the call to
load_external_function() fails. load_external_function() tries to
search for given function in the given file. The file name is same as
plugin name. So, it may be that it doesn't find a file with
my_decoding library in the installation. If test_decoding plugin is
working in your case, please check if you can find my_decoding library
in the same location. If not, that's the problem.
> In my code, I have the function declared as extern:
>
> extern void _PG_init(void);
> extern void _PG_output_plugin_init(OutputPluginCallbacks *cb);
>
> and the body of the function is defined somewhere below it.
>
> The actual code is just a copy of the test_decoding sample:
> https://github.com/postgres/postgres/blob/REL9_5_STABLE/contrib/test_decoding/test_decoding.c
>
> I'm not sure if the deployment process is ok (just copying the dll) or if
> there is some other step to take. Can anyone shed some light?
>
It's hard to tell what's wrong exactly, without seeing the changes you
have made. But, it looks like while copying test_decoding directory,
you have forgot to replace some instance/s of test_decoding with
my_decoding.
--
Best Wishes,
Ashutosh Bapat
EnterpriseDB Corporation
The Postgres Database Company
Hi Ashutosh, Thank you for your answer. At the end I realized that the PGDLLEXPORT keyword was missing from the functions definitions. As a side question, what are the options to debug the plugin while it's being executing? I've seen a debug plugin for Postgres but it seems more for SQL functions and stored procedures. Is it possible to attach the process from Visual Studio debugger? Thanks, Valerio -- View this message in context: http://postgresql.nabble.com/Error-running-custom-plugin-output-plugins-have-to-declare-the-PG-output-plugin-init-symbol-tp5921145p5921898.html Sent from the PostgreSQL - hackers mailing list archive at Nabble.com.
On Tue, Sep 20, 2016 at 4:32 PM, valeriof <valerio_farruggio@hotmail.com> wrote: > Hi Ashutosh, > Thank you for your answer. At the end I realized that the PGDLLEXPORT > keyword was missing from the functions definitions. > > As a side question, what are the options to debug the plugin while it's > being executing? I've seen a debug plugin for Postgres but it seems more for > SQL functions and stored procedures. Is it possible to attach the process > from Visual Studio debugger? > I have never used Visual Studio, but you might find something useful at https://wiki.postgresql.org/wiki/Getting_a_stack_trace_of_a_running_PostgreSQL_backend_on_Windows. -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company
The link was very helpful. It's a standard 'Attach to process' approach with Visual Studio and it works just as expected. Thank you Ashutosh! -- View this message in context: http://postgresql.nabble.com/Error-running-custom-plugin-output-plugins-have-to-declare-the-PG-output-plugin-init-symbol-tp5921145p5922077.html Sent from the PostgreSQL - hackers mailing list archive at Nabble.com.