Postgres ECPG:在 main() 之外添加一个函数会破坏程序
Postgres ECPG: adding a function outside main() breaks the program
我已经使用我的 C 应用程序成功连接并从 Postgresql 获取数据。我的 connector.pgc
文件如下所示:
#include <stdlib.h>
#include <stdio.h>
//#include "connect.h" // PROBLEM
int connect(); //NO PROBLEM
EXEC SQL BEGIN DECLARE SECTION;
char dbname[1024];
const char *target = "dbname@host:port";
const char *user = "user";
const char *passwd = "password";
EXEC SQL END DECLARE SECTION;
int main() {
EXEC SQL CONNECT TO :target AS con1 USER :user USING :passwd;
EXEC SQL SELECT pg_catalog.set_config('search_path', 'schema_name', false); EXEC SQL COMMIT;
EXEC SQL SET CONNECTION con1;
EXEC SQL SELECT current_database() INTO :dbname;
printf("current database is '%s'\n", dbname);
EXEC SQL DISCONNECT ALL;
// connect();
return 0;
}
// PROBLEM
//int connect(){
// printf("A\n");
// return 0;
//}
当然 username/password/schema_name/etc 除外。被替换为实际值。
然后我执行以下操作:
ecpg connector.pgc && gcc connector.c -o connectorXec -lecpg -L/usr/pgsql-12/lib && ./connectorXec
我的操作系统是默认的 CentOS 8。
ecpg --version
returns ecpg (PostgreSQL) 13.2
psql --version
returns psql (PostgreSQL) 12.8
程序编译正常,我可以毫无问题地连接,我知道这是 printf 提取正确的数据库名称,我也 运行 other SQL SELECTS确认数据。
然而,一旦我取消int connect()
函数的注释,即使不使用它,它在实际程序之前被调用了3次,我不知道为什么。更准确地说,我看到字母 A 被打印了 3 次。此外,printf 不再显示正确的名称,而是 dbname
为空。
我试着把int connect()
函数放到一个单独的connect.c
文件中,然后通过connect.h
把它和这个程序链接在一起,结果是一样的。
如果我将 main()
的内容放入 connect()
,然后调用它,进程就会无限期地挂起。
真的,我很茫然,我根本不知道从哪里开始,因为这种情况似乎是不可能的。我检查了 ECPG 生成的 connector.c
文件,没有其他调用。我在网上可以找到的大多数参考文献都只包含 main() 函数,在极少数情况下它们不包含任何类似问题。
对发生的事情有什么想法吗?
好的,所以原来在某处使用了 connect()
函数,因为重命名它解决了问题。我在创建的 connector.c
文件中重命名它,这就是我错过这个明显解决方案的原因。
Laurenz Albe 说他自己试过了,一切正常,这意味着它在某种程度上对我的设置来说是独一无二的。
我已经使用我的 C 应用程序成功连接并从 Postgresql 获取数据。我的 connector.pgc
文件如下所示:
#include <stdlib.h>
#include <stdio.h>
//#include "connect.h" // PROBLEM
int connect(); //NO PROBLEM
EXEC SQL BEGIN DECLARE SECTION;
char dbname[1024];
const char *target = "dbname@host:port";
const char *user = "user";
const char *passwd = "password";
EXEC SQL END DECLARE SECTION;
int main() {
EXEC SQL CONNECT TO :target AS con1 USER :user USING :passwd;
EXEC SQL SELECT pg_catalog.set_config('search_path', 'schema_name', false); EXEC SQL COMMIT;
EXEC SQL SET CONNECTION con1;
EXEC SQL SELECT current_database() INTO :dbname;
printf("current database is '%s'\n", dbname);
EXEC SQL DISCONNECT ALL;
// connect();
return 0;
}
// PROBLEM
//int connect(){
// printf("A\n");
// return 0;
//}
当然 username/password/schema_name/etc 除外。被替换为实际值。 然后我执行以下操作:
ecpg connector.pgc && gcc connector.c -o connectorXec -lecpg -L/usr/pgsql-12/lib && ./connectorXec
我的操作系统是默认的 CentOS 8。
ecpg --version
returns ecpg (PostgreSQL) 13.2
psql --version
returns psql (PostgreSQL) 12.8
程序编译正常,我可以毫无问题地连接,我知道这是 printf 提取正确的数据库名称,我也 运行 other SQL SELECTS确认数据。
然而,一旦我取消int connect()
函数的注释,即使不使用它,它在实际程序之前被调用了3次,我不知道为什么。更准确地说,我看到字母 A 被打印了 3 次。此外,printf 不再显示正确的名称,而是 dbname
为空。
我试着把int connect()
函数放到一个单独的connect.c
文件中,然后通过connect.h
把它和这个程序链接在一起,结果是一样的。
如果我将 main()
的内容放入 connect()
,然后调用它,进程就会无限期地挂起。
真的,我很茫然,我根本不知道从哪里开始,因为这种情况似乎是不可能的。我检查了 ECPG 生成的 connector.c
文件,没有其他调用。我在网上可以找到的大多数参考文献都只包含 main() 函数,在极少数情况下它们不包含任何类似问题。
对发生的事情有什么想法吗?
好的,所以原来在某处使用了 connect()
函数,因为重命名它解决了问题。我在创建的 connector.c
文件中重命名它,这就是我错过这个明显解决方案的原因。
Laurenz Albe 说他自己试过了,一切正常,这意味着它在某种程度上对我的设置来说是独一无二的。