1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.com *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
21 #include <SqlGwConnection.h>
22 #include<SqlOdbcConnection.h>
26 List
SqlGwConnection::cacheList
;
28 SqlGwConnection::~SqlGwConnection()
30 struct MultiDSN
*node
=NULL
, *prev
=NULL
;
31 node
= multi_adapter_head
;
33 if(node
->isConnected
) node
->adapter
->disconnect();
39 /* if (isAdapterConnected) {
40 adapter->disconnect();
41 isAdapterConnected = false;
43 ListIterator it
= cacheList
.getIterator();
44 while(it
.hasElement()) delete (CachedTable
*) it
.nextElement();
46 // if (adapter) { delete adapter; adapter = NULL; }
50 DbRetVal
SqlGwConnection::createAdapters(SqlGwConnection
*gwconn
)
54 fp
= fopen(Conf::config
.getDsConfigFile(),"r");
56 printError(ErrSysInit
,"csqlds.conf file does not exist");
60 char dsnname
[IDENTIFIER_LENGTH
];dsnname
[0]='\0';
61 char tdb
[IDENTIFIER_LENGTH
];
62 char username
[IDENTIFIER_LENGTH
];
63 char password
[IDENTIFIER_LENGTH
];
66 fscanf(fp
,"%s %s %s %s\n",dsnname
,username
,password
,tdb
);
67 if(strcmp(dsnname
,"") == 0){
68 printError(ErrSysInternal
, "Add entry to csqlds.conf file");
72 AbsSqlConnection
*adapterCon
= new SqlOdbcConnection();
73 gwconn
->setAdapter(adapterCon
,dsnname
);
79 //Putting different "Adapter" object into List
80 void SqlGwConnection::setAdapter(AbsSqlConnection
*conn
, char *dsName
)
82 struct MultiDSN
*new_node
=new struct MultiDSN
;
83 struct MultiDSN
*link_node
=NULL
;
84 strcpy(new_node
->dsn
,dsName
);
85 new_node
->adapter
=conn
;
87 new_node
->toCommit
=false;
88 new_node
->isConnected
=false;
90 if(multi_adapter_head
== NULL
){ multi_adapter_head
=new_node
; return;}
91 link_node
=multi_adapter_head
;
92 while(link_node
!= NULL
) {
93 if(link_node
->next
== NULL
) {
94 link_node
->next
= new_node
;
97 link_node
= link_node
->next
;
102 AbsSqlConnection
* SqlGwConnection::getAdapterConnection(char *dsName
)
104 struct MultiDSN
*node
;
105 node
=multi_adapter_head
;
107 if(strcmp(node
->dsn
,dsName
)==0)
108 return node
->adapter
;
114 DbRetVal
SqlGwConnection::connect (char *user
, char * pass
)
116 // SqlOdbcConnection *dsnAda=(SqlOdbcConnection*) adapter;
117 struct MultiDSN
*node
=multi_adapter_head
;
118 isCSqlConnected
= false;
119 isAdapterConnected
= false;
120 strcpy(username
, user
);
121 strcpy(password
, pass
);
123 if (innerConn
) rv
= innerConn
->connect(user
,pass
);
124 if (rv
== OK
) isCSqlConnected
= true;
125 if (rv
== ErrNoPrivilege
) return rv
;
126 // Get the appropriate "Adapter" object based on DSN from the MultiDsn List
128 adapter
=getAdapterConnection(node
->dsn
);
129 SqlOdbcConnection
*dsnAda
=(SqlOdbcConnection
*) adapter
;
130 dsnAda
->setDsName(node
->dsn
);
131 //Below function will connect to TDB
132 if(adapter
) rv
= adapter
->connect(user
,pass
);
133 if(OK
== rv
) node
->isConnected
= true;
136 //if (adapter) rv = adapter->connect(user,pass);
137 if (0 == cacheList
.size()) rv
= populateCachedTableList();
138 if (rv
== OK
) isAdapterConnected
= true;
139 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
143 DbRetVal
SqlGwConnection::disconnect()
146 if (innerConn
&& isCSqlConnected
) rv
=innerConn
->disconnect();
147 if (rv
!= OK
) return rv
;
148 struct MultiDSN
*node
=NULL
;
149 node
= multi_adapter_head
;
150 if (isAdapterConnected
){
152 if(node
->isConnected
) node
->adapter
->disconnect();
156 // if (adapter && isAdapterConnected) rv = adapter->disconnect();
157 isCSqlConnected
= false;
158 isAdapterConnected
= false;
161 DbRetVal
SqlGwConnection::beginTrans(IsolationLevel isoLevel
, TransSyncMode smode
)
164 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
165 if (innerConn
&& isCSqlConnected
) rv
= innerConn
->beginTrans(isoLevel
, smode
);
166 if (rv
!= OK
) return rv
;
167 struct MultiDSN
*node
=NULL
;
168 node
= multi_adapter_head
;
169 if (isAdapterConnected
)
172 if(node
->isConnected
) node
->adapter
->beginTrans(isoLevel
);
177 txnHdlr
= CSqlHandler
;
180 DbRetVal
SqlGwConnection::commit()
182 struct MultiDSN
*node
= multi_adapter_head
;
185 if (innerConn
&& isCSqlConnected
)
186 //(txnHdlr == CSqlHandler || txnHdlr == CSqlAndAdapterHandler))
187 rv
= innerConn
->commit();
188 if (rv
!= OK
) return rv
;
189 //Commit happen in every TDB, those are present in "csqlds.conf" file.
191 // if (adapter && (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
192 if (txnHdlr
== AdapterHandler
|| txnHdlr
== CSqlAndAdapterHandler
){
194 rv
= (node
->adapter
)->commit();
195 node
->toCommit
=false;
201 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
204 DbRetVal
SqlGwConnection::rollback()
207 if (innerConn
&& isCSqlConnected
) //(txnHdlr == CSqlHandler || txnHdlr == CSqlAndAdapterHandler))
208 rv
= innerConn
->rollback();
209 if (rv
!= OK
) return rv
;
210 struct MultiDSN
*node
=NULL
;
211 node
= multi_adapter_head
;
212 if (isAdapterConnected
&& (txnHdlr
== AdapterHandler
|| txnHdlr
== CSqlAndAdapterHandler
))
215 if(node
->isConnected
) node
->adapter
->rollback();
220 if (adapter && isAdapterConnected &&
221 (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
222 rv = adapter->rollback();
224 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
227 DbRetVal
SqlGwConnection::connectCSqlIfNotConnected()
229 if (!isCSqlConnected
) {
230 DbRetVal rv
= innerConn
->connect(username
, password
);
231 if (rv
!= OK
) return rv
;
232 isCSqlConnected
= true;
236 DbRetVal
SqlGwConnection::connectAdapterIfNotConnected()
238 if (!isAdapterConnected
) {
239 DbRetVal rv
= adapter
->connect(username
, password
);
240 if (rv
!= OK
) return rv
;
241 isAdapterConnected
= true;
246 bool SqlGwConnection::isTableCached(char *tblName
)
250 printError(ErrBadArg
, "tblName passed is NULL\n");
253 ListIterator iter
= cacheList
.getIterator();
255 while (iter
.hasElement()) {
256 node
= (CachedTable
*)iter
.nextElement();
257 if (strcmp(node
->tableName
, tblName
) == 0)
264 DbRetVal
SqlGwConnection::populateCachedTableList()
267 fp
= fopen(Conf::config
.getTableConfigFile(),"r");
269 printError(ErrSysInit
, "cache.table file does not exist");
272 char tablename
[IDENTIFIER_LENGTH
]; tablename
[0] = '\0';
273 char fieldname
[IDENTIFIER_LENGTH
]; fieldname
[0] = '\0';
274 char condition
[IDENTIFIER_LENGTH
]; condition
[0] = '\0';
275 char field
[IDENTIFIER_LENGTH
]; field
[0] = '\0';
276 char dsnName
[IDENTIFIER_LENGTH
]; dsnName
[0] = '\0';
278 CachedTable
*node
= NULL
;
281 fscanf(fp
, "%d %s %s %s %s %s \n", &cmode
, tablename
, fieldname
,
282 condition
, field
, dsnName
);
284 node
= new CachedTable();
285 strcpy(node
->tableName
, tablename
);
286 cacheList
.append(node
);