/* * src/test/examples/testlibpq.c * * * testlibpq.c * * C言語PostgreSQLフロントエンドライブラリlibpqの試験 */ #include #include #include #include "libpq-fe.h" static void exit_nicely(PGconn *conn) { PQfinish(conn); exit(1); } int main(int argc, char **argv) { // const char *conninfo; PGconn *local; PGconn *remote; PGresult *localres; PGresult *remoteres; int i; char select[256]=""; char buff[256]=""; char insert[409600]=""; /* * ユーザがコマンドラインでパラメータを提供した場合、conninfo文字列として使用する。 * 提供されない場合はデフォルトでdbname=postgresを使用する。 * その他の接続パラメータについては環境変数やデフォルトを使用する。 */ // conninfo="dbname=kenon"; /* データベースとの接続を確立する */ local = PQconnectdb("dbname=kenon"); remote = PQconnectdb("dbname=kenon2"); /* バックエンドとの接続確立に成功したかを確認する */ if (PQstatus(local) != CONNECTION_OK) { fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(local)); exit_nicely(local); } /*ローカルDBで最新の記録を検索*/ localres = PQexec(local, "SELECT max(記録日時) FROM 体温記録 ;"); if (PQresultStatus(localres) != PGRES_TUPLES_OK) { fprintf(stderr, "SELECT Statement failed: %s", PQerrorMessage(local)); PQclear(localres); exit_nicely(local); } /*リモートDBからローカルDBより新しいものだけ抽出*/ sprintf(select, "SELECT * FROM 体温記録 WHERE 記録日時>'%s';",PQgetvalue(localres, 0, 0)); remoteres = PQexec(remote, select); PQclear(localres); printf("更新予定数 %d件\n",PQntuples(remoteres)); if(PQntuples(remoteres)>0){//ローカルDBを更新 sprintf(insert,"BEGIN;\nINSERT INTO 体温記録(sn,測定日時,体温,体調,詳細,記録日時) VALUES\n"); for (i = 0; i < PQntuples(remoteres); i++) { sprintf(buff,"('%s', '%s', %s, %s, '%s', '%s')%s\n", PQgetvalue(remoteres, i, 0),PQgetvalue(remoteres, i, 1),PQgetvalue(remoteres, i, 2), PQgetvalue(remoteres, i, 3),PQgetvalue(remoteres, i, 4),PQgetvalue(remoteres, i, 5), (i==(PQntuples(remoteres)-1)?";":",") ); strcat(insert,buff); } // strcat(insert,"ABORT;\n"); strcat(insert,"COMMIT;\n"); localres = PQexec(local, insert); if (PQresultStatus(localres) == PGRES_COMMAND_OK){ printf("ローカルDBが更新されました\n"); } else {//更新失敗 fprintf(stderr, "SELECT Statement failed: %s", PQerrorMessage(local)); PQclear(localres); exit_nicely(local); } PQclear(localres); } else {//ローカルDB更新なし printf("更新対象なし\n"); } PQclear(remoteres); /*ローカルDBで最新の記録を検索*/ localres = PQexec(local, "SELECT max(記録日時) FROM 体温記録 ;"); printf("最新の記録日時は%s\n",PQgetvalue(localres, 0, 0)); PQclear(localres); /* データベースとの接続を閉じ、後始末を行う。 */ PQfinish(local); PQfinish(remote); return 0; }