C 我的_PG_init()似乎不';模块加载时不会被调用

C 我的_PG_init()似乎不';模块加载时不会被调用,c,postgresql,dll,open-source,C,Postgresql,Dll,Open Source,我正在尝试为PostgreSQL编写一个小的扩展 为了测试我的模块是否正确加载,我正在void\u PG\u init(void)和void\u PG\u fini(void)函数中的文件中编写一些内容。以下是这两个功能的代码: #include "postgres.h" #include "executor\executor.h" #include "fmgr.h" #include "funcapi.h" #include <stdio.h> PG_MODULE_MAGIC;

我正在尝试为PostgreSQL编写一个小的扩展

为了测试我的模块是否正确加载,我正在
void\u PG\u init(void)
void\u PG\u fini(void)
函数中的文件中编写一些内容。以下是这两个功能的代码:

#include "postgres.h"
#include "executor\executor.h"
#include "fmgr.h"
#include "funcapi.h"
#include <stdio.h>

PG_MODULE_MAGIC;

extern void _PG_init(void);
extern void _PG_fini(void);

static void myExecutorStart(QueryDesc *queryDesc, int eflags);
static void myExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count);
static void myExecutorFinish(QueryDesc *queryDesc);
static void myExecutorEnd(QueryDesc *queryDesc);

static ExecutorStart_hook_type prevExecutorStart = NULL;
static ExecutorRun_hook_type prevExecutorRun = NULL;
static ExecutorFinish_hook_type prevExecutorFinish = NULL;
static ExecutorEnd_hook_type prevExecutorEnd = NULL;    

void _PG_init(void) {
     FILE *file = NULL;
     file = fopen("F:\\init.txt", "a+");
     fprintf(file, "Init started!\n");
     fclose(file);

     prevExecutorStart = ExecutorStart_hook;
     ExecutorStart_hook = myExecutorStart;
     prevExecutorRun = ExecutorRun_hook;
     ExecutorRun_hook = myExecutorRun;
     prevExecutorFinish = ExecutorFinish_hook;
     ExecutorFinish_hook = myExecutorFinish;
     prevExecutorEnd = ExecutorEnd_hook;
     ExecutorEnd_hook = myExecutorEnd;
}


void _PG_fini(void) {
     FILE *file = NULL;
     file = fopen("F:\\fini.txt", "a+");
     fprintf(file, "Fini started!\n");
     fclose(file);

     ExecutorStart_hook = prevExecutorStart;
     ExecutorRun_hook = prevExecutorRun;
     ExecutorFinish_hook = prevExecutorFinish;
     ExecutorEnd_hook = prevExecutorEnd;
 }
static void myExecutorStart(QueryDesc *queryDesc, int eflags) {
    if (prevExecutorStart) prevExecutorStart(queryDesc, eflags);
    else standard_ExecutorStart(queryDesc, eflags);

    FILE *file = NULL;
    file = fopen("F:\\query.txt", "a+");

    fprintf(file, "Query: %s started!\n", queryDesc->sourceText);
    fclose(file);
}
我复制了“./PostgreSQL/9.6/lib”目录中的“myextension.dll”,并在“./PostgreSQL/9.6/share/extension”目录中添加了“myextension.control”和“myextension--1.0.sql”

myextension.control:

# pg_extension extension
comment = 'myextension!!!'
default_version = '1.0'
myextension--1.0.sql:

在“postgresql.conf”中,我添加了共享的预加载库='myextension'。之后,我连接到一个测试数据库并运行:CREATE EXTENSION myextension;,然后重新启动服务器


如果有人知道这可能是什么原因,请帮忙

让您走上正轨的几点意见:

  • \u PG_fini()
    永远不会被调用,因为模块不会被卸载
\u PG_init()
但是,在加载模块时确实会被调用。您的主要问题似乎是为什么不向
F:\init.txt
和其他用于日志记录的文件写入任何内容

  • 在Windows上,PostgreSQL通常作为服务运行。我怀疑操作系统用户没有写入这些文件的权限。我对Windows及其权限管理知之甚少,但我注意到您没有检查
    fopen()
    的返回代码,因此它很可能会自动失败

  • 我的建议是使用日志基础结构,例如

    elog(LOG, "Init started!");
    
    这样会将消息写入PostgreSQL server日志,而且更舒适,更不容易出错

还有两条评论:

  • 创建扩展没有意义,因为您的代码不提供任何SQL函数
    CREATE EXTENSION myextension
    是一个no操作

  • 更改
    共享\u预加载\u库后,不要忘记重新启动PostgreSQL server

elog(LOG, "Init started!");