簡體   English   中英

Postgres ECPG:在 main() 之外添加 function 會破壞程序

[英]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;
//}

當然,用戶名/密碼/schema_name/等除外。 被替換為實際值。 然后我執行以下操作:

ecpg connector.pgc && gcc connector.c -o connectorXec -lecpg -L/usr/pgsql-12/lib && ./connectorXec

我的操作系統默認是CentOS 8。
ecpg --version返回ecpg (PostgreSQL) 13.2
psql --version返回psql (PostgreSQL) 12.8

該程序編譯正常,我可以毫無問題地連接,我知道這是printf提取正確的數據庫名稱的方式,我還運行其他 SQL SELECTS 來確認數據。

但是,一旦我取消注釋int connect() function,即使不使用它,它在實際程序之前被調用了 3 次,我不知道為什么。 更准確地說,我看到字母 A 被打印了 3 次。 此外, printf不再顯示正確的名稱,而是dbname為空。

我嘗試將int connect() function 放入單獨的connect.c文件中,然后通過connect.h將其與該程序鏈接在一起,結果是相同的。

如果我將main()的內容放入connect()中,然后調用它,進程就會無限期地掛起。

真的,我不知所措,我什至不知道從哪里開始,因為這種情況似乎是不可能的。 我檢查了 ECPG 生成的connector.c文件,沒有其他調用。 我可以在網上找到的大多數參考資料僅包含 main() function,在極少數情況下它們不包含,也沒有提及任何類似的問題。

關於發生了什么的任何想法?

好的,結果是connect() function 在某處使用,因為重命名它解決了問題。 我在創建的connector.c文件中重命名它,這就是我錯過這個明顯解決方案的原因。

Laurenz Albe 說他自己試過了,一切正常,這意味着它在某種程度上對我的設置來說是獨一無二的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM