Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Developement Machine
- CentOS release 6.1 (Final)
- 2.6.32-131.0.15.el6.i686 {32bit machine}
- Deployment Machine (CentOS)
- Linux release 6.6 (Final)
- 2.6.32-573.el6.x86_64 {64bit machine}
- unixODBC 2.2.14
- /usr/lib/psqlodbcw.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
- #include "../boost_1_52_0/boost/property_tree/ptree.hpp"
- #include "../boost_1_52_0/boost/property_tree/ini_parser.hpp"
- #include <iostream>
- #include <string>
- #include <vector>
- #include <utility>
- #include <unistd.h>
- #include "../unixODBC-2.3.4/include/sql.h"
- #include "../unixODBC-2.3.4/include/sqlext.h"
- #include "../unixODBC-2.3.4/include/odbcinst.h"
- using boost::property_tree::ptree;
- using namespace std;
- void PopulateINI(const string& iniName, vector<pair<string, string> >& data);
- bool TestConnection(const string& connStringIn, string& connStringOut);
- static void extract_error(char *fn, SQLHANDLE handle, SQLSMALLINT type);
- void PrintIniFile(const string& iniName, const string& sDSN);
- int main(int argc, char* argv[])
- {
- if (argc != 2)
- {
- cout << "Enter the choice ofnt1 : Full run:- ntttpopulate incorrect datantttattempt to connectntttpopulate CORRECT datantttwait 15 secsntttattempt to connectnt2 : attempt to connect with existing ini data" << endl;
- return 0;
- }
- int iCh = atoi(argv[1]);
- if(iCh != 1 && iCh != 2)
- {
- cout << "Invalid choice !!nAcceptable values are - '1' OR '2' only" << endl;
- return 0;
- }
- string sDSN = "PostgresTest01";
- string sConnStrIn, sConnStrOut;
- sConnStrIn.append("DSN=").append(sDSN.c_str()).append(1, ';');
- string iniName = "/etc/odbc.ini";
- if (iCh == 1)
- {
- //Incorrect DSN data
- vector<pair<string, string> > vData;
- vData.push_back(make_pair(sDSN + ".Description", "Description"));
- vData.push_back(make_pair(sDSN + ".Driver", "PostgreSQL"));
- vData.push_back(make_pair(sDSN + ".Database", "dvdrental"));
- vData.push_back(make_pair(sDSN + ".Servername", "192.168.45.217"));
- vData.push_back(make_pair(sDSN + ".Port", "1234")); //INCORRECT PORT NUMBER; '1234' instead of '5432'
- vData.push_back(make_pair(sDSN + ".UserName", "postgres"));
- vData.push_back(make_pair(sDSN + ".Password", "postgres"));
- vData.push_back(make_pair(sDSN + ".Trace", "Off"));
- vData.push_back(make_pair(sDSN + ".TraceFile", "stderr"));
- vData.push_back(make_pair(sDSN + ".Protocol", "7.0"));
- vData.push_back(make_pair(sDSN + ".ReadOnly", "No"));
- vData.push_back(make_pair(sDSN + ".RowVersioning", "No"));
- vData.push_back(make_pair(sDSN + ".ShowSystemTables", "No"));
- vData.push_back(make_pair(sDSN + ".ShowOidColumn", "No"));
- vData.push_back(make_pair(sDSN + ".FakeOidIndex", "No"));
- vData.push_back(make_pair(sDSN + ".ConnSettings", ""));
- //Populate ini with Incorrect data
- PopulateINI(iniName, vData);
- sleep(5); //Just so I can see the ini file changing
- //First run - Call SQLDriverConnect
- PrintIniFile(iniName, sDSN);
- sConnStrOut.clear();
- if(TestConnection(sConnStrIn, sConnStrOut))
- {
- cout << "Test connection succeeded.nConnection String is [" << sConnStrOut << "]" << endl;
- }
- else
- {
- cout << "Test connection failed for sConnStrIn[" << sConnStrIn << "]" << endl;
- }
- cout << "nn====================================================================" << endl;
- cout << "Updating ini file with correct data..." << endl;
- vData[4].second = "5432"; //CORRECT PORT NUMBER
- PopulateINI(iniName, vData); //WRITE TO INI FILE
- cout << "nnWaiting for 15 secs" << endl;
- sleep(15); //15, so that I could manually change the odbc.ini, as I had some suspicions about ptree, read_ini() & write_ini()
- cout << "nn====================================================================" << endl;
- }
- //Second run - Call SQLDriverConnect
- PrintIniFile(iniName, sDSN);
- sConnStrOut.clear();
- if(TestConnection(sConnStrIn, sConnStrOut))
- {
- cout << "Test connection succeeded.nConnection String is [" << sConnStrOut << "]" << endl;;
- }
- else
- {
- cout << "Test connection failed for sConnStrIn[" << sConnStrIn << "]" << endl;
- }
- return 0;
- }
- void PrintVector(const string& label, vector<pair<string, string> >& data)
- {
- cout << "nn " << label << "n" << endl;
- for(vector<pair<string, string> >::iterator it = data.begin(); it != data.end(); ++it)
- {
- cout << "tt" << it->first << " : " << it->second << endl;
- }
- cout << "n===================================================" << endl;
- }
- void PopulateINI(const string& iniName, vector<pair<string, string> >& data)
- {
- ptree pt;
- read_ini(iniName.c_str(), pt);
- for(vector<pair<string, string> >::iterator it = data.begin(); it != data.end(); ++it)
- {
- pt.put(it->first.c_str(), it->second.c_str());
- }
- write_ini(iniName.c_str(), pt);
- }
- bool TestConnection(const string& connStringIn, string& connStringOut)
- {
- bool fRC = false;
- SQLRETURN retcode;
- SQLHENV env=NULL;
- SQLHDBC dbc=NULL;
- SQLSMALLINT siOutConnStrLen;
- connStringOut.resize(2048);
- SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
- SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
- SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc);
- retcode = SQLDriverConnect(dbc, NULL, (SQLCHAR*)connStringIn.c_str(), SQL_NTS, (SQLCHAR*)&connStringOut.at(0), 2048, &siOutConnStrLen, SQL_DRIVER_NOPROMPT);
- if(SQL_SUCCEEDED(retcode))
- {
- connStringOut.resize(siOutConnStrLen);
- fRC = true;
- if(retcode == SQL_SUCCESS_WITH_INFO)
- {
- cout << "Driver reported the following diagnostics:" << endl;
- extract_error("SQLDriverConnect", dbc, SQL_HANDLE_DBC);
- }
- SQLDisconnect(dbc);
- }
- else
- {
- cout << "Failed to connect:" << endl;
- extract_error("SQLDriverConnect", dbc, SQL_HANDLE_DBC);
- }
- SQLFreeHandle(SQL_HANDLE_DBC, dbc);
- SQLFreeHandle(SQL_HANDLE_ENV, env);
- return fRC;
- }
- void extract_error(char *fn, SQLHANDLE handle, SQLSMALLINT type)
- {
- SQLINTEGER i = 0;
- SQLINTEGER native;
- SQLCHAR state[ 7 ];
- SQLCHAR text[256];
- SQLSMALLINT len;
- SQLRETURN ret;
- fprintf(stderr, "nThe driver reported the following diagnostics whilst running %snn", fn);
- do
- {
- ret = SQLGetDiagRec(type, handle, ++i, state, &native, text, sizeof(text), &len );
- if (SQL_SUCCEEDED(ret))
- printf("%s:%ld:%ld:%sn", state, i, native, text);
- }
- while( ret == SQL_SUCCESS );
- }
- void PrintIniFile(const string& iniName, const string& sDSN)
- {
- ptree pt;
- read_ini(iniName.c_str(), pt);
- cout << "nn[" << sDSN << "]" << endl;
- cout << "Description : " << pt.get<string>((sDSN + "." + "Description").c_str()) <<endl;
- cout << "Driver : " << pt.get<string>((sDSN + "." + "Driver").c_str()) <<endl;
- cout << "Database : " << pt.get<string>((sDSN + "." + "Database").c_str()) <<endl;
- cout << "Servername : " << pt.get<string>((sDSN + "." + "Servername").c_str()) <<endl;
- cout << "Port : " << pt.get<string>((sDSN + "." + "Port").c_str()) <<endl;
- cout << "UserName : " << pt.get<string>((sDSN + "." + "UserName").c_str()) <<endl;
- cout << "Password : " << pt.get<string>((sDSN + "." + "Password").c_str()) <<endl;
- cout << "Trace : " << pt.get<string>((sDSN + "." + "Trace").c_str()) <<endl;
- cout << "TraceFile : " << pt.get<string>((sDSN + "." + "TraceFile").c_str()) <<endl;
- cout << "Protocol : " << pt.get<string>((sDSN + "." + "Protocol").c_str()) <<endl;
- cout << "ReadOnly : " << pt.get<string>((sDSN + "." + "ReadOnly").c_str()) <<endl;
- cout << "RowVersioning : " << pt.get<string>((sDSN + "." + "RowVersioning").c_str()) <<endl;
- cout << "ShowSystemTables : " << pt.get<string>((sDSN + "." + "ShowSystemTables").c_str()) <<endl;
- cout << "ShowOidColumn : " << pt.get<string>((sDSN + "." + "ShowOidColumn").c_str()) <<endl;
- cout << "FakeOidIndex : " << pt.get<string>((sDSN + "." + "FakeOidIndex").c_str()) <<endl;
- cout << "ConnSettings : " << pt.get<string>((sDSN + "." + "ConnSettings").c_str()) <<endl;
- cout << "nn" << endl;
- }
- 1 : Full run:-
- populate incorrect data
- attempt to connect
- populate CORRECT data
- wait 15 secs
- attempt to connect
- 2 : attempt to connect with existing ini data
- [PostgresTest01]
- Description : Description
- Driver : PostgreSQL
- Database : dvdrental
- Servername : 192.168.45.217
- Port : 1234
- UserName : postgres
- Password : postgres
- Trace : Off
- TraceFile : stderr
- Protocol : 7.0
- ReadOnly : No
- RowVersioning : No
- ShowSystemTables : No
- ShowOidColumn : No
- FakeOidIndex : No
- ConnSettings :
- Failed to connect:
- The driver reported the following diagnostics whilst running SQLDriverConnect
- 08001:1:101:[unixODBC]Could not connect to the server;
- Connection refused [192.168.45.217:1234]
- Test connection failed for sConnStrIn[DSN=PostgresTest01;]
- ====================================================================
- Updating ini file with correct data...
- Waiting for 15 secs
- ====================================================================
- [PostgresTest01]
- Description : Description
- Driver : PostgreSQL
- Database : dvdrental
- Servername : 192.168.45.217
- Port : 5432
- UserName : postgres
- Password : postgres
- Trace : Off
- TraceFile : stderr
- Protocol : 7.0
- ReadOnly : No
- RowVersioning : No
- ShowSystemTables : No
- ShowOidColumn : No
- FakeOidIndex : No
- ConnSettings :
- Failed to connect:
- The driver reported the following diagnostics whilst running SQLDriverConnect
- 08001:1:101:[unixODBC]Could not connect to the server;
- Connection refused [192.168.45.217:1234]
- Test connection failed for sConnStrIn[DSN=PostgresTest01;]
- [PostgresTest01]
- Description : Description
- Driver : PostgreSQL
- Database : dvdrental
- Servername : 192.168.45.217
- Port : 5432
- UserName : postgres
- Password : postgres
- Trace : Off
- TraceFile : stderr
- Protocol : 7.0
- ReadOnly : No
- RowVersioning : No
- ShowSystemTables : No
- ShowOidColumn : No
- FakeOidIndex : No
- ConnSettings :
- Test connection succeeded.
- Connection String is [DSN=PostgresTest01;DATABASE=dvdrental;SERVER=192.168.45.217;PORT=5432;UID=postgres;PWD=postgres;SSLmode=disable;ReadOnly=No;Protocol=7.0;FakeOidIndex=No;ShowOidColumn=No;RowVersioning=No;ShowSystemTables=No;ConnSettings=;Fetch=100;Socket=4096;UnknownSizes=0;MaxVarcharSize=255;MaxLongVarcharSize=8190;Debug=0;CommLog=0;Optimizer=0;Ksqo=1;UseDeclareFetch=0;TextAsLongVarchar=1;UnknownsAsLongVarchar=0;BoolsAsChar=1;Parse=0;CancelAsFreeStmt=0;ExtraSysTablePrefixes=dd_;;LFConversion=0;UpdatableCursors=1;DisallowPremature=0;TrueIsMinus1=0;BI=0;ByteaAsLongVarBinary=0;UseServerSidePrepare=0;LowerCaseIdentifier=0;]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement