checkpoint server changes
[csql.git] / src / gateway / SqlGwConnection.cxx
blobcdf7cde34aa88e3d8c185519a30e4bf29d9af773
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 AbsSqlConnection *adapterCon = new SqlOdbcConnection();
67 fscanf(fp,"%s %s %s %s\n",dsnname,username,password,tdb);
68 if(strcmp(dsnname,"") == 0){
69 printError(ErrSysInternal, "Add entry to csqlds.conf file");
70 return ErrNotReady;
72 gwconn->setAdapter(adapterCon,dsnname);
74 fclose(fp);
75 return rv;
78 //Putting different "Adapter" object into List
79 void SqlGwConnection::setAdapter(AbsSqlConnection *conn, char *dsName)
81 struct MultiDSN *new_node=new struct MultiDSN;
82 struct MultiDSN *link_node=NULL;
83 strcpy(new_node->dsn,dsName);
84 new_node->adapter=conn;
85 new_node->next=NULL;
86 new_node->toCommit=false;
87 new_node->isConnected=false;
88 noOfCon++;
89 if(multi_adapter_head == NULL){ multi_adapter_head=new_node; return;}
90 link_node=multi_adapter_head;
91 while(link_node != NULL) {
92 if(link_node->next == NULL) {
93 link_node->next = new_node;
94 return;
96 link_node = link_node->next;
100 //getAdapter
101 AbsSqlConnection* SqlGwConnection::getAdapterConnection(char *dsName)
103 struct MultiDSN *node;
104 node=multi_adapter_head;
105 while(node!=NULL){
106 if(strcmp(node->dsn,dsName)==0)
107 return node->adapter;
108 node=node->next;
110 return NULL;
113 DbRetVal SqlGwConnection::connect (char *user, char * pass)
115 // SqlOdbcConnection *dsnAda=(SqlOdbcConnection*) adapter;
116 struct MultiDSN *node=multi_adapter_head;
117 isCSqlConnected = false;
118 isAdapterConnected = false;
119 strcpy(username, user);
120 strcpy(password, pass);
121 DbRetVal rv = OK;
122 if (innerConn) rv = innerConn->connect(user,pass);
123 if (rv == OK) isCSqlConnected = true;
124 if (rv == ErrNoPrivilege ) return rv;
125 // Get the appropriate "Adapter" object based on DSN from the MultiDsn List
126 while(node !=NULL ){
127 adapter=getAdapterConnection(node->dsn);
128 SqlOdbcConnection *dsnAda=(SqlOdbcConnection*) adapter;
129 dsnAda->setDsn(node->dsn);
130 //Below function will connect to TDB
131 if(adapter) rv = adapter->connect(user,pass);
132 if(OK == rv) node->isConnected = true;
133 node=node->next;
135 //if (adapter) rv = adapter->connect(user,pass);
136 if (0 == cacheList.size()) rv = populateCachedTableList();
137 if (rv == OK) isAdapterConnected = true;
138 if (!isAdapterConnected && !isCSqlConnected) return ErrNoConnection;
139 return OK;
142 DbRetVal SqlGwConnection::disconnect()
144 DbRetVal rv = OK;
145 if (innerConn && isCSqlConnected) rv =innerConn->disconnect();
146 if (rv != OK) return rv;
147 struct MultiDSN *node=NULL ;
148 node = multi_adapter_head;
149 if (isAdapterConnected){
150 while(node!=NULL){
151 if(node->isConnected) node->adapter->disconnect();
152 node=node->next;
155 // if (adapter && isAdapterConnected) rv = adapter->disconnect();
156 isCSqlConnected = false;
157 isAdapterConnected = false;
158 return rv;
160 DbRetVal SqlGwConnection::beginTrans(IsolationLevel isoLevel, TransSyncMode smode)
162 DbRetVal rv = OK;
163 if (!isAdapterConnected && !isCSqlConnected) return ErrNoConnection;
164 if (innerConn && isCSqlConnected) rv = innerConn->beginTrans(isoLevel, smode);
165 if (rv != OK) return rv;
166 struct MultiDSN *node=NULL;
167 node = multi_adapter_head;
168 if (isAdapterConnected)
170 while(node!=NULL){
171 if(node->isConnected) node->adapter->beginTrans(isoLevel);
172 node=node->next;
175 //mode = smode;
176 txnHdlr = CSqlHandler;
177 return rv;
179 DbRetVal SqlGwConnection::commit()
181 struct MultiDSN *node = multi_adapter_head;
182 DbRetVal rv = OK;
184 if (innerConn && isCSqlConnected)
185 //(txnHdlr == CSqlHandler || txnHdlr == CSqlAndAdapterHandler))
186 rv = innerConn->commit();
187 if (rv != OK) return rv;
188 //Commit happen in every TDB, those are present in "csqlds.conf" file.
189 while(node != NULL){
190 // if (adapter && (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
191 if (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler){
192 if(node->toCommit){
193 rv = (node->adapter)->commit();
194 node->toCommit=false;
198 node=node->next;
200 if (!isAdapterConnected && !isCSqlConnected) return ErrNoConnection;
201 return rv;
203 DbRetVal SqlGwConnection::rollback()
205 DbRetVal rv = OK;
206 if (innerConn && isCSqlConnected) //(txnHdlr == CSqlHandler || txnHdlr == CSqlAndAdapterHandler))
207 rv = innerConn->rollback();
208 if (rv != OK) return rv;
209 struct MultiDSN *node=NULL;
210 node = multi_adapter_head;
211 if (isAdapterConnected && (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
213 while(node!=NULL){
214 if(node->isConnected) node->adapter->rollback();
215 node=node->next;
219 if (adapter && isAdapterConnected &&
220 (txnHdlr == AdapterHandler || txnHdlr == CSqlAndAdapterHandler))
221 rv = adapter->rollback();
223 if (!isAdapterConnected && !isCSqlConnected) return ErrNoConnection;
224 return rv;
226 DbRetVal SqlGwConnection::connectCSqlIfNotConnected()
228 if (!isCSqlConnected) {
229 DbRetVal rv = innerConn->connect(username, password);
230 if (rv != OK) return rv;
231 isCSqlConnected = true;
233 return OK;
235 DbRetVal SqlGwConnection::connectAdapterIfNotConnected()
237 if (!isAdapterConnected) {
238 DbRetVal rv = adapter->connect(username, password);
239 if (rv != OK) return rv;
240 isAdapterConnected = true;
242 return OK;
245 bool SqlGwConnection::isTableCached(char *tblName)
247 if (NULL == tblName)
249 printError(ErrBadArg, "tblName passed is NULL\n");
250 return ErrBadArg;
252 ListIterator iter = cacheList.getIterator();
253 CachedTable *node;
254 while (iter.hasElement()) {
255 node = (CachedTable*)iter.nextElement();
256 if (strcmp(node->tableName, tblName) == 0)
258 return true;
261 return false;
263 DbRetVal SqlGwConnection::populateCachedTableList()
265 FILE *fp = NULL;
266 fp = fopen(Conf::config.getTableConfigFile(),"r");
267 if( fp == NULL ) {
268 printError(ErrSysInit, "cache.table file does not exist");
269 return ErrSysInit;
271 char tablename[IDENTIFIER_LENGTH];
272 char fieldname[IDENTIFIER_LENGTH];
273 char condition[IDENTIFIER_LENGTH];
274 char field[IDENTIFIER_LENGTH];
275 char dsnName[IDENTIFIER_LENGTH];
277 int cmode;
278 CachedTable *node;
279 while(!feof(fp))
281 fscanf(fp, "%d %s %s %s %s %s \n", &cmode, tablename,fieldname,condition,field,dsnName);
282 node = new CachedTable();
283 strcpy(node->tableName, tablename);
284 cacheList.append(node);
286 fclose(fp);
287 return OK;