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 void SqlGwConnection::createAdapters(SqlGwConnection
*gwconn
)
53 fp
= fopen(Conf::config
.getDsConfigFile(),"r");
55 printError(ErrSysInit
,"csqlds.conf file does not exist");
59 char dsnname
[IDENTIFIER_LENGTH
];dsnname
[0]='\0';
60 char tdb
[IDENTIFIER_LENGTH
];
61 char username
[IDENTIFIER_LENGTH
];
62 char password
[IDENTIFIER_LENGTH
];
65 AbsSqlConnection
*adapterCon
= new SqlOdbcConnection();
66 fscanf(fp
,"%s %s %s %s\n",dsnname
,username
,password
,tdb
);
67 if(strcmp(dsnname
,"") == 0){
68 printf("Add entry to csqlds.conf file\n");
71 gwconn
->setAdapter(adapterCon
,dsnname
);
76 //Putting different "Adapter" object into List
77 void SqlGwConnection::setAdapter(AbsSqlConnection
*conn
, char *dsName
)
79 struct MultiDSN
*new_node
=new struct MultiDSN
;
80 struct MultiDSN
*link_node
=NULL
;
81 strcpy(new_node
->dsn
,dsName
);
82 new_node
->adapter
=conn
;
84 new_node
->toCommit
=false;
85 new_node
->isConnected
=false;
87 if(multi_adapter_head
== NULL
){ multi_adapter_head
=new_node
; return;}
88 link_node
=multi_adapter_head
;
89 while(link_node
!= NULL
) {
90 if(link_node
->next
== NULL
) {
91 link_node
->next
= new_node
;
94 link_node
= link_node
->next
;
99 AbsSqlConnection
* SqlGwConnection::getAdapterConnection(char *dsName
)
101 struct MultiDSN
*node
;
102 node
=multi_adapter_head
;
104 if(strcmp(node
->dsn
,dsName
)==0)
105 return node
->adapter
;
111 DbRetVal
SqlGwConnection::connect (char *user
, char * pass
)
113 // SqlOdbcConnection *dsnAda=(SqlOdbcConnection*) adapter;
114 struct MultiDSN
*node
=multi_adapter_head
;
115 isCSqlConnected
= false;
116 isAdapterConnected
= false;
117 strcpy(username
, user
);
118 strcpy(password
, pass
);
120 if (innerConn
) rv
= innerConn
->connect(user
,pass
);
121 if (rv
== OK
) isCSqlConnected
= true;
122 if (rv
== ErrNoPrivilege
) return rv
;
123 // Get the appropriate "Adapter" object based on DSN from the MultiDsn List
125 adapter
=getAdapterConnection(node
->dsn
);
126 SqlOdbcConnection
*dsnAda
=(SqlOdbcConnection
*) adapter
;
127 dsnAda
->setDsn(node
->dsn
);
128 //Below function will connect to TDB
129 if(adapter
) rv
= adapter
->connect(user
,pass
);
130 if(OK
== rv
) node
->isConnected
= true;
133 //if (adapter) rv = adapter->connect(user,pass);
134 if (0 == cacheList
.size()) rv
= populateCachedTableList();
135 if (rv
== OK
) isAdapterConnected
= true;
136 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
140 DbRetVal
SqlGwConnection::disconnect()
143 if (innerConn
&& isCSqlConnected
) rv
=innerConn
->disconnect();
144 if (rv
!= OK
) return rv
;
145 struct MultiDSN
*node
=NULL
;
146 node
= multi_adapter_head
;
147 if (isAdapterConnected
){
149 if(node
->isConnected
) node
->adapter
->disconnect();
153 // if (adapter && isAdapterConnected) rv = adapter->disconnect();
154 isCSqlConnected
= false;
155 isAdapterConnected
= false;
158 DbRetVal
SqlGwConnection::beginTrans(IsolationLevel isoLevel
, TransSyncMode smode
)
161 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
162 if (innerConn
&& isCSqlConnected
) rv
= innerConn
->beginTrans(isoLevel
, smode
);
163 if (rv
!= OK
) return rv
;
164 struct MultiDSN
*node
=NULL
;
165 node
= multi_adapter_head
;
166 if (isAdapterConnected
)
169 if(node
->isConnected
) node
->adapter
->beginTrans(isoLevel
);
174 txnHdlr
= CSqlHandler
;
177 DbRetVal
SqlGwConnection::commit()
179 struct MultiDSN
*node
= multi_adapter_head
;
182 if (innerConn
&& isCSqlConnected
)
183 //(txnHdlr == CSqlHandler || txnHdlr == CSqlAndAdapterHandler))
184 rv
= innerConn
->commit();
185 if (rv
!= OK
) return rv
;
186 //Commit happen in every TDB, those are present in "csqlds.conf" file.
188 // if (adapter && (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
189 if (txnHdlr
== AdapterHandler
|| txnHdlr
== CSqlAndAdapterHandler
){
191 rv
= (node
->adapter
)->commit();
192 node
->toCommit
=false;
198 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
201 DbRetVal
SqlGwConnection::rollback()
204 if (innerConn
&& isCSqlConnected
) //(txnHdlr == CSqlHandler || txnHdlr == CSqlAndAdapterHandler))
205 rv
= innerConn
->rollback();
206 if (rv
!= OK
) return rv
;
207 struct MultiDSN
*node
=NULL
;
208 node
= multi_adapter_head
;
209 if (isAdapterConnected
&& (txnHdlr
== AdapterHandler
|| txnHdlr
== CSqlAndAdapterHandler
))
212 if(node
->isConnected
) node
->adapter
->rollback();
217 if (adapter && isAdapterConnected &&
218 (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
219 rv = adapter->rollback();
221 if (!isAdapterConnected
&& !isCSqlConnected
) return ErrNoConnection
;
224 DbRetVal
SqlGwConnection::connectCSqlIfNotConnected()
226 if (!isCSqlConnected
) {
227 DbRetVal rv
= innerConn
->connect(username
, password
);
228 if (rv
!= OK
) return rv
;
229 isCSqlConnected
= true;
233 DbRetVal
SqlGwConnection::connectAdapterIfNotConnected()
235 if (!isAdapterConnected
) {
236 DbRetVal rv
= adapter
->connect(username
, password
);
237 if (rv
!= OK
) return rv
;
238 isAdapterConnected
= true;
243 bool SqlGwConnection::isTableCached(char *tblName
)
247 printError(ErrBadArg
, "tblName passed is NULL\n");
250 ListIterator iter
= cacheList
.getIterator();
252 while (iter
.hasElement()) {
253 node
= (CachedTable
*)iter
.nextElement();
254 if (strcmp(node
->tableName
, tblName
) == 0)
261 DbRetVal
SqlGwConnection::populateCachedTableList()
264 fp
= fopen(Conf::config
.getTableConfigFile(),"r");
266 printError(ErrSysInit
, "cache.table file does not exist");
269 char tablename
[IDENTIFIER_LENGTH
];
270 char fieldname
[IDENTIFIER_LENGTH
];
271 char condition
[IDENTIFIER_LENGTH
];
272 char field
[IDENTIFIER_LENGTH
];
273 char dsnName
[IDENTIFIER_LENGTH
];
279 fscanf(fp
, "%d %s %s %s %s %s \n", &cmode
, tablename
,fieldname
,condition
,field
,dsnName
);
280 node
= new CachedTable();
281 strcpy(node
->tableName
, tablename
);
282 cacheList
.append(node
);