libpq-PostgreSQLクライアントプログラミングインターフェース(一)----libpqのデータベース接続関数
24885 ワード
PostgreSQLは、現在最も優れたプラットフォーム間オープンソースデータベースとして、その紹介と利点はここでは説明しません.my*,ms*を最も速く忘れることができます.libpqはPostgreSQLのCアプリケーションインタフェースであり、クライアント・プログラムがPostgreSQLサーバ・プロセスにクエリーを送信し、クエリーの結果を得ることができます.私の実験環境は:オペレーティングシステム:Linux wheezy 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2 x86_64 GNU/Linuxデータベース:EnterpriseDB(PostgreSQL Plus Advanced Server)9.2.1.3例言語:c++ツール:cmake 2.8.9,g++(Debian 4.7.2-5)4.7.2 PostgreSQLしか知らないかもしれませんが、EnterpriseDBについてはよく知らないので、ここではEnterpriseDBについて簡単に紹介します.EnterpriseDBはPostgreSQLの基礎の上で、企業レベルの応用に対して専門的な最適化を行って、同時に一連の例えば動態性能のチューニング(DynaTune)、EDB Loader、高効率の大量SQL処理などの高級な特性を増加しました;また、EnterpriseDBとOracleの完璧な互換性に近いことや、Oracleに比べて安い価格が注目されています.これらの優れた特徴にIBMとRedhatの巨額の投資が加わり、私はそれを見ています.EnterpriseDBのlibpqはPostgreSQLのオープンソースバージョンと完全に一致しているので、ここではPostgreSQLも使用できます.
一、プロジェクトファイルCMakeListsを準備する.txt、libpqの依存項目を設定libpqを使用するフロントエンドプログラムは、ヘッダファイルlibpq-feを含む必要がある.h libpqライブラリにリンクする必要があります.簡単なサンプルプロジェクトを作成し、cmakeをプロジェクト管理ツールとして使用することで、前に紹介したcmakeに関する知識を同時に復習することができます.
CMakeListsを作成する.txtファイル、中身は以下の通りです.
簡単な説明:INCLUDE_DIRECTORIES("${PG_BASE}/include")は、コンパイラがPostgreSQLのヘッダファイルをどこで探しているかを教えてくれます.私のEnterpriseDBインストールディレクトリは/opt/PostgresPlus/9.2 AS、INCLUDE_DIRECTORIES("/opt/PostgresPlus/9.2 AS/include")と書いても同じです.LINK_DIRECTORIES("/opt/PostgresPlus/9.2 AS/lib")は、コンパイラの外部依存ライブラリ、すなわちlibpqの位置を最後にコンパイラ依存項目TARGET_に伝えることを忘れないでください.LINK_LIBRARIES(${PROJECT_NAME} "/opt/PostgresPlus/9.2AS/lib/libpq.so")
二、c++でlibpqを通じてPostgreSQLデータベースに接続するように、hello worldから新しいプログラミング言語を学ぶ!まず、データベースへの接続から始めます.今回demoは開発言語としてc++を使用しており、PostgreSQLに関するC#のメモを続々と書きます.
libpq-feを含むことを忘れないでください.hヘッダファイル.libpqを使用してPostgreSQLに接続するには、まずPGconnオブジェクトを作成します.PGconn *conn;1、PQconnectdb定義:PGconn*PQconnectdb(const char*conninfo);関数PQconnectdbのパラメータconninfoは次のように定義されます.
conninfo文字列は、データベースの接続情報を指定し、各パラメータ間をスペースで区切ります.パラメータhostaddrはデータベースホストのIPアドレスを指定し、portはEnterpriseDBのポートを指定し、dbnameは接続されたデータベースを指定し、userとpassword....conn = PQconnectdb(conninfo); 2、PQsetlogin定義:PGconn*PQsetdbLogin(const char*pghost,const char*pgport,const char*pgoptions,const char*pgtty,const char*dbName,const char*login,const char*pwd);固定パラメータにデフォルト値を指定しない場合は、NULLまたは空の文字列を書けばいいです.
PQconnectdbとPQsetdbLogin関数の違いは大きくなく、使いやすいように使います.
三、接続状態関数1、接続確立時のパラメータを返し、これらの値は固定的に接続を返すデータベース名char*PQdb(const PGconn*conn)である.接続したユーザー名char*PQuser(const PGconn*conn)を返します.接続されたパスワードchar*PQpass(const PGconn*conn)を返します.接続したサーバーホスト名char*PQhost(const PGconn*conn)を返します.接続されたポートchar*PQport(const PGconn*conn)を返します.2、PGconnオブジェクトに対する操作時の状態データを返して接続の状態を返します.ConnStatusType PQstatus(const PGconn *conn);ConnStatusTypeの値で最もよく使われる2つはCONNECTION_ですOKまたはCONNECTION_BAD.
クエリサーバの現在のパラメータ設定const char*PQparameterStatus(const PGconn*conn,const char*paramName);パラメータparamNameで使用できる値は、server_です.version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimesとstandard_conforming_strings
接続中の操作で発生した最近のエラー情報を返します.char *PQerrorMessage(const PGconn *conn);
現在接続されているプロセスID(PID)int PQbackendPID(const PGconn*conn)を返します.
ここまでlibpqでPostgreSQLデータベースに接続できるようになりました.
サンプルコード:
一、プロジェクトファイルCMakeListsを準備する.txt、libpqの依存項目を設定libpqを使用するフロントエンドプログラムは、ヘッダファイルlibpq-feを含む必要がある.h libpqライブラリにリンクする必要があります.簡単なサンプルプロジェクトを作成し、cmakeをプロジェクト管理ツールとして使用することで、前に紹介したcmakeに関する知識を同時に復習することができます.
CMakeListsを作成する.txtファイル、中身は以下の通りです.
project(edbconn)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
SET(PG_BASE "/opt/PostgresPlus/9.2AS")
INCLUDE_DIRECTORIES("${PG_BASE}/include")
LINK_DIRECTORIES("${PG_BASE}/lib")
TARGET_LINK_LIBRARIES(${PROJECT_NAME} "${PG_BASE}/lib/libpq.so")
簡単な説明:INCLUDE_DIRECTORIES("${PG_BASE}/include")は、コンパイラがPostgreSQLのヘッダファイルをどこで探しているかを教えてくれます.私のEnterpriseDBインストールディレクトリは/opt/PostgresPlus/9.2 AS、INCLUDE_DIRECTORIES("/opt/PostgresPlus/9.2 AS/include")と書いても同じです.LINK_DIRECTORIES("/opt/PostgresPlus/9.2 AS/lib")は、コンパイラの外部依存ライブラリ、すなわちlibpqの位置を最後にコンパイラ依存項目TARGET_に伝えることを忘れないでください.LINK_LIBRARIES(${PROJECT_NAME} "/opt/PostgresPlus/9.2AS/lib/libpq.so")
二、c++でlibpqを通じてPostgreSQLデータベースに接続するように、hello worldから新しいプログラミング言語を学ぶ!まず、データベースへの接続から始めます.今回demoは開発言語としてc++を使用しており、PostgreSQLに関するC#のメモを続々と書きます.
libpq-feを含むことを忘れないでください.hヘッダファイル.libpqを使用してPostgreSQLに接続するには、まずPGconnオブジェクトを作成します.PGconn *conn;1、PQconnectdb定義:PGconn*PQconnectdb(const char*conninfo);関数PQconnectdbのパラメータconninfoは次のように定義されます.
char *conninfo = "hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb";
conninfo文字列は、データベースの接続情報を指定し、各パラメータ間をスペースで区切ります.パラメータhostaddrはデータベースホストのIPアドレスを指定し、portはEnterpriseDBのポートを指定し、dbnameは接続されたデータベースを指定し、userとpassword....conn = PQconnectdb(conninfo); 2、PQsetlogin定義:PGconn*PQsetdbLogin(const char*pghost,const char*pgport,const char*pgoptions,const char*pgtty,const char*dbName,const char*login,const char*pwd);固定パラメータにデフォルト値を指定しない場合は、NULLまたは空の文字列を書けばいいです.
conn = PQsetdbLogin("localhost","5444",NULL,NULL,"mydb","enterprisedb","edb");
PQconnectdbとPQsetdbLogin関数の違いは大きくなく、使いやすいように使います.
三、接続状態関数1、接続確立時のパラメータを返し、これらの値は固定的に接続を返すデータベース名char*PQdb(const PGconn*conn)である.接続したユーザー名char*PQuser(const PGconn*conn)を返します.接続されたパスワードchar*PQpass(const PGconn*conn)を返します.接続したサーバーホスト名char*PQhost(const PGconn*conn)を返します.接続されたポートchar*PQport(const PGconn*conn)を返します.2、PGconnオブジェクトに対する操作時の状態データを返して接続の状態を返します.ConnStatusType PQstatus(const PGconn *conn);ConnStatusTypeの値で最もよく使われる2つはCONNECTION_ですOKまたはCONNECTION_BAD.
// PostgreSQL
if (PQstatus(conn) != CONNECTION_OK)
{
// do nothing...
}
クエリサーバの現在のパラメータ設定const char*PQparameterStatus(const PGconn*conn,const char*paramName);パラメータparamNameで使用できる値は、server_です.version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimesとstandard_conforming_strings
1 // PQparameterStatus
2 //
3 cout << "server_version : " << PQparameterStatus(conn,"server_version") << endl;
4 cout << "server_encoding : " << PQparameterStatus(conn,"server_encoding") << endl;
5 cout << "client_encoding : " << PQparameterStatus(conn,"client_encoding") << endl;
6 cout << "session_authorization : " << PQparameterStatus(conn,"session_authorization") << endl;
7 cout << "DateStyle : " << PQparameterStatus(conn,"DateStyle") << endl;
8 cout << "TimeZone : " << PQparameterStatus(conn,"TimeZone") << endl;
9 cout << "integer_datetimes : " << PQparameterStatus(conn,"integer_datetimes") << endl;
10 cout << "standard_conforming_strings : " << PQparameterStatus(conn,"standard_conforming_strings") << endl;
接続中の操作で発生した最近のエラー情報を返します.char *PQerrorMessage(const PGconn *conn);
現在接続されているプロセスID(PID)int PQbackendPID(const PGconn*conn)を返します.
ここまでlibpqでPostgreSQLデータベースに接続できるようになりました.
サンプルコード:
1 #include <iostream>
2 #include "libpq-fe.h"
3 using namespace std;
4
5 static void exit_nicely(PGconn *conn)
6 {
7 PQfinish(conn);
8 }
9
10 int main()
11 {
12 PGconn *conn;
13
14 /*
15 * PGconn *PQconnectdb(const char *conninfo);
16 */
17
18 //const char *conninfo = "hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb";
19 // conn = PQconnectdb(conninfo);
20 conn = PQconnectdb("hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb");
21
22 /*
23 *PGconn *PQsetdbLogin(const char *pghost,
24 const char *pgport,
25 const char *pgoptions,
26 const char *pgtty,
27 const char *dbName,
28 const char *login,
29 const char *pwd);
30 */
31
32 /* Make a connection to the database */
33 //conn = PQsetdbLogin("localhost","5444",NULL,NULL,"mydb","enterprisedb","edb");
34
35 /* Check to see that the backend connection was successfully made */
36 if (PQstatus(conn) != CONNECTION_OK)
37 {
38 cout << "connect failed. PQstatus : " << PQstatus(conn) << endl;
39 // char *PQerrorMessage(const PGconn *conn);
40 cout << PQerrorMessage(conn) << endl;
41 exit_nicely(conn);
42
43 return 0;
44 }
45
46 // PQdb
47 cout << " : " << PQdb(conn) << endl;
48
49 // PQuser
50 cout << " : " << PQuser(conn) << endl;
51
52 // PQpass
53 cout << " : " << PQpass(conn) << endl;
54
55 switch(PQstatus(conn))
56 {
57 case CONNECTION_STARTED:
58 cout << " ..." << endl;
59 break;
60
61 case CONNECTION_MADE:
62 cout << " ..." << endl;
63 break;
64
65 case CONNECTION_AUTH_OK:
66 cout << "auth is ok." << endl;
67 break;
68
69 case CONNECTION_OK:
70 cout << "connected." << endl;
71 break;
72
73 default:
74 cout << " ..." << endl;
75 }
76
77 cout << "---------- ---------- " << endl;
78 //
79 // PQparameterStatus
80 // server_version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimes standard_conforming_strings
81 cout << "server_version : " << PQparameterStatus(conn,"server_version") << endl;
82 cout << "server_encoding : " << PQparameterStatus(conn,"server_encoding") << endl;
83 cout << "client_encoding : " << PQparameterStatus(conn,"client_encoding") << endl;
84 cout << "session_authorization : " << PQparameterStatus(conn,"session_authorization") << endl;
85 cout << "DateStyle : " << PQparameterStatus(conn,"DateStyle") << endl;
86 cout << "TimeZone : " << PQparameterStatus(conn,"TimeZone") << endl;
87 cout << "integer_datetimes : " << PQparameterStatus(conn,"integer_datetimes") << endl;
88 cout << "standard_conforming_strings : " << PQparameterStatus(conn,"standard_conforming_strings") << endl;
89
90 // PQprotocolVersion
91 cout << "PQprotocolVersion : " << PQprotocolVersion(conn) << endl;
92
93 // PQbackendPID
94 cout << "PQbackendPID : " << PQbackendPID(conn) << endl;
95
96 // PQgetssl
97 cout << "PQgetssl : " << PQgetssl(conn) << endl;
98
99 PQfinish(conn);
100
101 return 0;
102 }