here でlibpq-fe
説明されているように、SQLサーバーに接続するために使用しています。
このAPIを使用してログインを確認するための小さなファイルを作成しました。
ファイル psql.cpp は次のとおりです。
#include <iostream>
#include <libpq-fe.h>
#include <string>
using namespace std;
void CloseConn(PGconn *conn)
{
PQfinish(conn);
getchar();
}
PGconn *ConnectDB(string user="postgres",string password="123321",string dbname="bridge",string hostaddr="127.0.0.1",string port="5432")
{
PGconn *conn = NULL;
string s = "user=" + user + " password=" + password + " dbname=" +dbname + " hostaddr=" + hostaddr + " port=" + port;
// Make a connection to the database
conn = PQconnectdb(s.c_str());
// Check to see that the backend connection was successfully made
if (PQstatus(conn) != CONNECTION_OK)
{
cout << "Connection to database failed.\n";
CloseConn(conn);
}
cout << "Connection to database - OK\n";
return conn;
}
void login_check(PGconn *conn, string username, string password)
{
string query = "SELECT * FROM login where plid='" + username + "'";
PGresult *res = PQexec(conn,query.c_str());
if(PQresultStatus(res) == PGRES_TUPLES_OK)//successful completion of a command returning data
{
cout << "query executed successfully\n";
int row = PQntuples(res); // number of rows in the output of the query
cout<<row<<endl;
if (row != 1)
{
//wrong username
}
else
{
cout<<PQgetvalue(res,0,1)<<endl;
if( !(string(PQgetvalue(res,0,1)).compare(password)) )//return 0 on equality
{
cout<<"valid user";
}
}
}
// Clear result
PQclear(res);
}
このファイルにヒットのメイン関数を配置すると、すべて正常に動作します。
int main()
{
PGconn *conn = NULL;
//conn = ConnectDB("postgres","123321","bridge","127.0.0.1","5432");
conn = ConnectDB("postgres","123321","bridge","127.0.0.1","5432");
if (conn != NULL) {
login(conn, "11111000", "abcd");
CloseConn(conn);
}
return 0;
}
このファイルを別のファイルに含めたいので、ファイル .cpp
を作成しました。psql.h
#include <libpq-fe.h>
#include <string>
using namespace std;
PGconn *ConnectDB(string ,string, string, string, string);
void login_check(PGconn, string, string);
void CloseConn(PGconn);
psql.h
ファイルを使用するために、psql.cpp
ヘッダーで行った変更は次のとおりです。
#include "psql.h"
#include <iostream>
void CloseConn(PGconn *conn)
{
...
...
main
そして、これから関数を削除しました。
新しいファイルに -dispatcher.cpp
このファイルを含めたいので、ヘッダーを変更します。
#include "psql.h"
そして、main
先に述べた関数の内容main
をこのファイルの関数に入れます。このファイルをコンパイルすると、次のエラーが発生しました。
dispatcher.cpp: In function ‘void login(int)’:
dispatcher.cpp:154:45: error: parameter 1 of ‘void login_check(PGconn, std::string, std::string)’ has incomplete type ‘PGconn {aka pg_conn}’
dispatcher.cpp:155:23: error: parameter 1 of ‘void CloseConn(PGconn)’ has incomplete type ‘PGconn {aka pg_conn}’
私のメイクファイル:
dispatcher:dispatcher.o access.o psql.o
g++ dispatcher.o access.o psql.o -pthread -I /usr/include/postgresql -lpq -o ./bin/dispatcher
dispatcher.o:dispatcher.cpp
g++ -I /usr/include/postgresql -lpq -c dispatcher.cpp
access.o:access.cpp access.h
g++ -c access.cpp
psql.o:psql.cpp psql.h
g++ -c psql.cpp -I /usr/include/postgresql -lpq
付属品のみで無視access.o
して構いません。c
を使用してプログラミングしていることは知っていますc++
。このエラーが発生する理由。それはCPPに固有のものですか?はlogin()
から呼び出す単純な関数でdispatcher's main
あり、その定義は上記の と同じmain
です。