*** empty log message ***
[csql.git] / src / gateway / SqlGwConnection.cxx
blobb04171b93db0fc66c54674221d69c71e491464d4
1 /***************************************************************************
2 * Copyright (C) 2007 by Prabakaran Thirumalai *
3 * praba_tuty@yahoo.com *
4 * *
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. *
9 * *
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. *
14 * *
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 ***************************************************************************/
20 #include <os.h>
21 #include <SqlGwConnection.h>
22 #include<SqlOdbcConnection.h>
23 #include <CSql.h>
24 #include <Network.h>
26 List SqlGwConnection::cacheList;
28 SqlGwConnection::~SqlGwConnection()
30 struct MultiDSN *node=NULL, *prev=NULL;
31 node = multi_adapter_head;
32 while(node!=NULL){
33 if(node->isConnected) node->adapter->disconnect();
34 delete node->adapter;
35 prev=node;
36 node=node->next;
37 delete prev;
39 /* if (isAdapterConnected) {
40 adapter->disconnect();
41 isAdapterConnected = false;
42 } */
43 ListIterator it = cacheList.getIterator();
44 while(it.hasElement()) delete (CachedTable *) it.nextElement();
45 cacheList.reset();
46 // if (adapter) { delete adapter; adapter = NULL; }
49 //createAdapters
50 DbRetVal SqlGwConnection::createAdapters(SqlGwConnection *gwconn)
52 DbRetVal rv=OK;
53 FILE *fp = NULL;
54 fp = fopen(Conf::config.getDsConfigFile(),"r");
55 if(fp==NULL){
56 printError(ErrSysInit,"csqlds.conf file does not exist");
57 return ErrNotOpen;
60 char dsnname[IDENTIFIER_LENGTH];dsnname[0]='\0';
61 char tdb[IDENTIFIER_LENGTH];
62 char username[IDENTIFIER_LENGTH];
63 char password[IDENTIFIER_LENGTH];
65 while(!feof(fp)){
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");
69 fclose(fp);
70 return ErrNotReady;
72 AbsSqlConnection *adapterCon = new SqlOdbcConnection();
73 gwconn->setAdapter(adapterCon,dsnname);
75 fclose(fp);
76 return rv;
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;
86 new_node->next=NULL;
87 new_node->toCommit=false;
88 new_node->isConnected=false;
89 noOfCon++;
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;
95 return;
97 link_node = link_node->next;
101 //getAdapter
102 AbsSqlConnection* SqlGwConnection::getAdapterConnection(char *dsName)
104 struct MultiDSN *node;
105 node=multi_adapter_head;
106 while(node!=NULL){
107 if(strcmp(node->dsn,dsName)==0)
108 return node->adapter;
109 node=node->next;
111 return NULL;
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);
122 DbRetVal rv = OK;
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
127 while(node !=NULL ){
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;
134 node=node->next;
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;
140 return OK;
143 DbRetVal SqlGwConnection::disconnect()
145 DbRetVal rv = OK;
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){
151 while(node!=NULL){
152 if(node->isConnected) node->adapter->disconnect();
153 node=node->next;
156 // if (adapter && isAdapterConnected) rv = adapter->disconnect();
157 isCSqlConnected = false;
158 isAdapterConnected = false;
159 return rv;
161 DbRetVal SqlGwConnection::beginTrans(IsolationLevel isoLevel, TransSyncMode smode)
163 DbRetVal rv = OK;
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)
171 while(node!=NULL){
172 if(node->isConnected) node->adapter->beginTrans(isoLevel);
173 node=node->next;
176 //mode = smode;
177 txnHdlr = CSqlHandler;
178 return rv;
180 DbRetVal SqlGwConnection::commit()
182 struct MultiDSN *node = multi_adapter_head;
183 DbRetVal rv = OK;
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.
190 while(node != NULL){
191 // if (adapter && (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
192 if (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler){
193 if(node->toCommit){
194 rv = (node->adapter)->commit();
195 node->toCommit=false;
199 node=node->next;
201 if (!isAdapterConnected && !isCSqlConnected) return ErrNoConnection;
202 return rv;
204 DbRetVal SqlGwConnection::rollback()
206 DbRetVal rv = OK;
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))
214 while(node!=NULL){
215 if(node->isConnected) node->adapter->rollback();
216 node=node->next;
220 if (adapter && isAdapterConnected &&
221 (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
222 rv = adapter->rollback();
224 if (!isAdapterConnected && !isCSqlConnected) return ErrNoConnection;
225 return rv;
227 DbRetVal SqlGwConnection::connectCSqlIfNotConnected()
229 if (!isCSqlConnected) {
230 DbRetVal rv = innerConn->connect(username, password);
231 if (rv != OK) return rv;
232 isCSqlConnected = true;
234 return OK;
236 DbRetVal SqlGwConnection::connectAdapterIfNotConnected()
238 if (!isAdapterConnected) {
239 DbRetVal rv = adapter->connect(username, password);
240 if (rv != OK) return rv;
241 isAdapterConnected = true;
243 return OK;
246 bool SqlGwConnection::isTableCached(char *tblName)
248 if (NULL == tblName)
250 printError(ErrBadArg, "tblName passed is NULL\n");
251 return ErrBadArg;
253 ListIterator iter = cacheList.getIterator();
254 CachedTable *node;
255 while (iter.hasElement()) {
256 node = (CachedTable*)iter.nextElement();
257 if (strcmp(node->tableName, tblName) == 0)
259 return true;
262 return false;
264 DbRetVal SqlGwConnection::populateCachedTableList()
266 FILE *fp = NULL;
267 fp = fopen(Conf::config.getTableConfigFile(),"r");
268 if( fp == NULL ) {
269 printError(ErrSysInit, "cache.table file does not exist");
270 return ErrSysInit;
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';
277 int cmode = 0;
278 CachedTable *node = NULL;
279 while(!feof(fp))
281 fscanf(fp, "%d %s %s %s %s %s \n", &cmode, tablename, fieldname,
282 condition, field, dsnName);
283 if (cmode) {
284 node = new CachedTable();
285 strcpy(node->tableName, tablename);
286 cacheList.append(node);
289 fclose(fp);
290 return OK;