私は、私たちのニーズにlibpqのラッパーを書きました。私は長い間、Zeoslib(http://sourceforge.net/projects/zeoslib/)でしたが、最後に問題を抱えていました。キャッシュされたデータセットをサポートしていないし、遅いです。
libpqは非常に高速です。
私は単純にPostgresのWindows版をダウンロードし、すべてのDLLをlibディレクトリにコピーして呼び出しをエクスポートし、それに応じて.hとリンクをインクルードします。
私はこれが非常に低いレベルであることを認識していますが、私が結果として実現しているパフォーマンスの向上を十分に強調することはできません。
私たちのアプリケーションはかなり大きなインストールベースを持つ会計/ ERPタイプのビジネスアプリケーションであり、相当数の同時並行した多数のユーザーベース(60,100接続)...これは非常にうまくいっています... libpqをどのようにラップし、キャッシュされた更新を処理するかについての詳細が必要です。ここでは、要求から
UPDATE:
はlibpqのラップまたは直接の窓の下にそれを利用する手順は次のとおりです。
まず、レベルを設定するために、私はEmbarcadero RAD XEを使用しています。そのため、以下のコマンドはRAD XEに付属のコマンドラインツールです。コマンドラインツールがPATH環境変数に含まれていない場合は、それも必ず確認する必要があります。 Visual Studioを使用している場合は、同等のコマンドを実行する必要があります。基本的に私は.DLLから.libファイルを作成しています
TEST.Cは私がlibpqの使い方を理解し、また私の成功をテストするために書いた最小限のテストコードです。
1. Put all the DLLs into a directory and copy the include directory.
これらのDLLを取得するには、MSIビルドを使用してPostgreSQLをインストールする必要はありませんが、これも機能します。バイナリビルドからDLLをコピーしました。 .Hファイルもバイナリビルドから取得されました。だから私のディレクトリは次のようになります:
include\
libpq-fe.h
postgres_ext.h
libeay32.dll
libiconv-2.dll
libintl-8.dll
libpq.dll
ssleay32.dll
zlib1.dll
2. Create an import library against LIBPQ.DLL as follows:
implib -c -a libpq.lib libpq.dll
は、DLLと同じディレクトリにlibpq.libファイルを持つはずです。
3. build the test program (or any program) as follows:
bcc32 test.c -l libpq.lib
私は単純にすべての新しいRAD-XEプロジェクトにlibpq.libファイルをコピーし、プロジェクトにlibpq.libを追加PostgreSQLのシステムにアクセスするためのtest.cの今
#include <stdio.h>
#include "include/libpq-fe.h"
char *db = "mydatabasename";
char *dbserver = "hostname";
char *uname = "username";
char *pass = "password";
char *SQL = "select * from public.auditlog;";
// char *SQL = "select userid, stationid from public.auditlog";
char buff[200];
PGconn *dbconn;
PGresult *res;
void main(void)
{
int nFields, i, j;
printf("Attempting to Connect to Database Server:\n");
printf("Database: %s\n", db);
printf("Server : %s\n", dbserver);
sprintf(buff, "dbname=%s host=%s port=5432 user=%s password=%s",
db, dbserver, uname, pass);
dbconn = PQconnectdb(buff);
if(PQstatus(dbconn) != CONNECTION_OK)
printf("Connection Failed: %s\n", PQerrorMessage(dbconn));
else
{
printf("Connected Successfully!\n");
sprintf(buff, "BEGIN; DECLARE my_portal CURSOR FOR %s", SQL);
res = PQexec(dbconn, buff);
if(PQresultStatus(res) != PGRES_COMMAND_OK)
{
printf("Error executing SQL!: %s\n", PQerrorMessage(dbconn));
PQclear(res);
}
else
{
PQclear(res);
res = PQexec(dbconn, "FETCH ALL in my_portal");
if(PQresultStatus(res) != PGRES_TUPLES_OK)
{
printf("ERROR, Fetch All Failed: %s", PQerrorMessage(dbconn));
PQclear(res);
}
else
{
nFields = PQnfields(res);
// Print out the field names
for(i=0; i<nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n");
// Print out the rows
for(i=0; i<PQntuples(res); i++)
{
for(j=0; j<nFields; j++)
printf("%-15s", PQgetvalue(res, i, j));
printf("\n");
}
res = PQexec(dbconn, "END");
PQclear(res);
}
}
}
PQfinish(dbconn);
}
。私はデータベース転送ドライバにlibpqをラップして、私のデータベースアクセスコードを分けています。
次のスクリーンショットは、libpqを使用してPostgreSQLサポートを提供するptidbというRAD-XEプロジェクトを示しています。私はSQLiteをサポートしていますが、データベースを直接コンパイルするだけです。
次に、上記のDLLと、最終製品と一緒に、DLLが私の製品と同じディレクトリにあることを確認します。
これはあなたに行くはずです。あなたがC++のラッピングに興味があるなら、私に知らせてください。そして私はいくつかのもので別のアップデートを投稿します。
あなたが列挙されているもののすべての間で人気がありますか? – sivabudh
私はそれらをすべて別の状況で使用しました – joe
SQLAPI ++は、ライセンスが必要なシェアウェア製品です。 – tadman