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 ***************************************************************************/
17 #include <Statement.h>
20 #include <TableConfig.h>
22 CreateTblStatement::CreateTblStatement()
28 CreateTblStatement::~CreateTblStatement()
32 DbRetVal
CreateTblStatement::execute(int &rowsAffected
)
35 rv
= dbMgr
->createTable(tblName
, tblDef
);
36 if (rv
!= OK
) return rv
;
37 if (parsedData
->getFieldNameList().size() > 0)
39 HashIndexInitInfo
*idxInfo
= new HashIndexInitInfo();
40 strcpy(idxInfo
->tableName
, tblName
);
41 ListIterator iter
= parsedData
->getFieldNameList().getIterator();
42 FieldName
*name
= NULL
;
43 while (iter
.hasElement())
45 name
= (FieldName
*)iter
.nextElement();
46 idxInfo
->list
.append(name
->fldName
);
48 idxInfo
->indType
= hashIndex
;
49 idxInfo
->isPrimary
= true;
50 idxInfo
->isUnique
= true;
51 int bucket
= parsedData
->getBucketSize();
53 idxInfo
->bucketSize
= bucket
;
54 char indName
[IDENTIFIER_LENGTH
];
55 sprintf(indName
, "%s_idx1_Primary", tblName
);
56 rv
= dbMgr
->createIndex(indName
, idxInfo
);
59 dbMgr
->dropTable(tblName
);
65 if(parsedData
->getSecondaryIndexFieldList().size() > 0)
67 HashIndexInitInfo
*idxInfo
= new HashIndexInitInfo();
68 strcpy(idxInfo
->tableName
, tblName
);
69 ListIterator iter
= parsedData
->getSecondaryIndexFieldList().getIterator();
70 FieldInfo
*name
= NULL
;
71 while (iter
.hasElement())
73 name
= (FieldInfo
*)iter
.nextElement();
74 idxInfo
->list
.append(name
->fldName
);
76 idxInfo
->indType
= treeIndex
;
77 idxInfo
->isPrimary
= true;
78 idxInfo
->isUnique
= true;
79 char indName
[IDENTIFIER_LENGTH
];
80 sprintf(indName
, "%s_idx_Auto_increment", tblName
);
81 rv
= dbMgr
->createIndex(indName
, idxInfo
);
84 dbMgr
->dropTable(tblName
);
90 if(parsedData
->getForeignKeyList().size() > 0)
92 ForeignKeyInfo
*fkInfo
=NULL
;
94 ListIterator iter
= parsedData
->getForeignKeyList().getIterator();
95 while (iter
.hasElement())
97 fkInfo
= (ForeignKeyInfo
*)iter
.nextElement();
98 strcpy(fkInfo
->fkTableName
,tblName
);
99 char fkName
[IDENTIFIER_LENGTH
];
100 sprintf(fkName
, "%s_FKEY_%d", tblName
,++i
);
101 rv
= dbMgr
->createForeignKey(fkName
,fkInfo
);
104 dbMgr
->dropTable(tblName
);
112 DbRetVal
CreateTblStatement::checkForDot(char *name
)
115 while ( name
[i
] != '\0')
117 if (name
[i
++] == '.') { return ErrSyntaxError
; }
122 DbRetVal
CreateTblStatement::resolve()
125 strcpy(tblName
, parsedData
->getTableName());
126 rv
= checkForDot(tblName
);
129 printf("Check SQL Syntax: .\n");
132 FieldIterator iter
= parsedData
->getCreFldList().getIterator();
135 FieldName
*name
= NULL
;
136 ListIterator nIter
= parsedData
->getFieldNameList().getIterator();
137 while (iter
.hasElement())
139 FieldDef
*fDef
= iter
.nextElement();
141 while (nIter
.hasElement())
143 name
= (FieldName
*)nIter
.nextElement();
144 if (strcmp(name
->fldName
, fDef
->fldName_
) == 0) fDef
->isNull_
= true;
146 rv
= checkForDot(fDef
->fldName_
);
149 printf("Check SQL Syntax: .\n");
152 /* To check char field and restrict it for the max length 8kb(8000) */
153 if( (fDef
->type_
== 30) && (fDef
->length_
> 8000) ){
154 printError(ErrBadRange
,"Char data type length should be less than 8kb(8000).");
157 //TODO : need a new addField function which can take FieldDef as parameter.
158 if (!fDef
->isDefault_
|| fDef
->isDefault_
&& fDef
->defaultValueBuf_
[0] == '\0') {
159 i
= tblDef
.addField(fDef
->fldName_
, fDef
->type_
, fDef
->length_
,
160 NULL
,fDef
->isNull_
,fDef
->isAutoIncrement_
);
162 i
= tblDef
.addField(fDef
->fldName_
, fDef
->type_
, fDef
->length_
,
163 fDef
->defaultValueBuf_
,fDef
->isNull_
,fDef
->isAutoIncrement_
);
167 printError(ErrUnknown
, "Error while adding field");
174 /////////////////////////////////////
175 DbRetVal
CacheTblStatement::resolve()
179 TableConf::config
.init();
180 cacheLoader
.setConnParam(I_USER
, I_PASS
);
181 cacheLoader
.setTable(parsedData
->getTableName());
182 TableConf::config
.setTable(parsedData
->getTableName());
183 if(parsedData
->getHCondFld()){
184 cacheLoader
.setCondition(parsedData
->getHCondition());// new one
185 TableConf::config
.setCondition(parsedData
->getHCondition());
187 if(parsedData
->getVCondFld()) {
188 cacheLoader
.setFieldListVal(parsedData
->getVCondition());
189 TableConf::config
.setFieldListVal(parsedData
->getVCondition());
191 if(parsedData
->getPkFld()){
192 cacheLoader
.setFieldName(parsedData
->getIndexName());
193 TableConf::config
.setFieldName(parsedData
->getIndexName());
195 if(parsedData
->getDSN()){
196 cacheLoader
.setDsnName(parsedData
->getPKTableName());
197 TableConf::config
.setDsnName(parsedData
->getPKTableName());
199 if( !(parsedData
->getUnCache()))
201 rv
= TableConf::config
.isTableCached(parsedData
->getTableName());
203 printError(ErrAlready
, "Table is already cached,unload table then try");
210 DbRetVal
CacheTblStatement::execute(int &rowsAffected
)
214 if( parsedData
->getUnCache())
217 TableConf::config
.getTableMode(parsedData
->getTableName());
218 bool isCached
= TableConf::config
.isTableCached(mode
);
220 printError(ErrNotCached
, "Table is not Cached");
223 TableConf::config
.removeFromCacheTableFile();
225 rv
= cacheLoader
.load(!(parsedData
->getNoSchema()));
227 TableConf::config
.addToCacheTableFile(parsedData
->getDirect());
233 ///////////////////////////////////////
234 CreateIdxStatement::CreateIdxStatement()
240 CreateIdxStatement::~CreateIdxStatement()
245 DbRetVal
CreateIdxStatement::execute(int &rowsAffected
)
248 if (parsedData
->getFieldNameList().size() > 0)
250 HashIndexInitInfo
*idxInfo
= new HashIndexInitInfo();
251 strcpy(idxInfo
->tableName
, parsedData
->getTableName());
252 ListIterator iter
= parsedData
->getFieldNameList().getIterator();
253 FieldName
*name
= NULL
;
254 while (iter
.hasElement())
256 name
= (FieldName
*)iter
.nextElement();
257 idxInfo
->list
.append(name
->fldName
);
259 idxInfo
->indType
= parsedData
->getIndexType();
260 idxInfo
->isPrimary
= parsedData
->getPrimary();
261 idxInfo
->isUnique
= parsedData
->getUnique();
262 int bucket
= parsedData
->getBucketSize();
264 idxInfo
->bucketSize
= bucket
;
265 rv
= dbMgr
->createIndex(parsedData
->getIndexName(), idxInfo
);
268 if (rv
== OK
) dbMgr
->sendSignal(SIGCSQL1
);
272 // function for not to drop cached table
273 DbRetVal
isTableCached(char *tabName
) // function added by :Jitendra
278 if (!Conf::config
.useCache()) return OK
;
279 fp
= fopen(Conf::config
.getTableConfigFile(),"r");
280 if(fp
==NULL
) return OK
;
281 char tablename
[IDENTIFIER_LENGTH
]; tablename
[0] = '\0';
282 char condition
[IDENTIFIER_LENGTH
]; condition
[0]='\0';
283 char fieldname
[IDENTIFIER_LENGTH
]; fieldname
[0]='\0';
284 char field
[IDENTIFIER_LENGTH
]; field
[0]='\0';
285 char dsnName
[IDENTIFIER_LENGTH
]; dsnName
[0]='\0';
289 fscanf(fp
,"%d %s %s %s %s %s\n",&mode
,tablename
,fieldname
,condition
,field
,dsnName
);
290 if(strcmp(tablename
,tabName
) ==0){
292 return ErrNoPrivilege
;}
298 DbRetVal
DropTblStatement::execute(int &rowsAffected
)
300 DbRetVal rv
= OK
; // newly added
302 tab
= parsedData
->getTableName();
304 DatabaseManagerImpl
*dmgr
= (DatabaseManagerImpl
*)dbMgr
;
305 IsolationLevel iso
= dmgr
->txnMgr()->getIsoLevel();
306 rv
= dmgr
->txnMgr()->rollback(dmgr
->lockMgr());
307 rv
= dmgr
->txnMgr()->startTransaction(dmgr
->lockMgr(),iso
);
309 int mode
= TableConf::config
.getTableMode(tab
);
310 // rv = isTableCached(tab);
311 if (mode
!= 0 && mode
< 8) {
312 printf("Cached table '%s' cannot be dropped.\n", tab
);
313 printf("uncache the table by 'cachetable -t %s -u' and drop.\n", tab
);
314 printError(ErrNoPrivilege
, "Cached table '%s' cannot be dropped.", tab
);
315 return ErrNoPrivilege
;
317 else if (mode
== 8) {
318 printf("Replicated table '%s' cannot be dropped.\n", tab
);
319 printf("Unreplicate the table by 'repltable -t %s -u' and drop.\n", tab
);
320 printError(ErrNoPrivilege
, "Replicated table '%s' cannot be dropped.", tab
);
321 return ErrNoPrivilege
;
324 printf("Table %s is cached and replicated. Cannot be dropped.\n", tab
);
325 printf("Uncache the table by 'cachetable -t %s -u'.\n", tab
);
326 printf("Unreplicated the table by 'repltable -t %s -u' and drop.\n", tab
);
327 printError(ErrNoPrivilege
, "Table %s is cached and replicated. Cannot be dropped.", tab
);
328 return ErrNoPrivilege
;
331 rv
= dbMgr
->dropTable(parsedData
->getTableName());
332 if (rv
== OK
) dbMgr
->sendSignal(SIGCSQL1
);
336 DbRetVal
DropIdxStatement::execute(int &rowsAffected
)
339 DatabaseManagerImpl
*dmgr
= (DatabaseManagerImpl
*)dbMgr
;
340 IsolationLevel iso
= dmgr
->txnMgr()->getIsoLevel();
341 rv
= dmgr
->txnMgr()->rollback(dmgr
->lockMgr());
342 rv
= dmgr
->txnMgr()->startTransaction(dmgr
->lockMgr(),iso
);
343 rv
= dmgr
->dropIndex(parsedData
->getIndexName());
344 if (rv
== OK
) dbMgr
->sendSignal(SIGCSQL1
);
348 //================== Truncate Table Statement ===============
351 DbRetVal
TruncateTblStatement::execute(int &rowsAffected
)
354 table
->setCondition(NULL
);
355 IsolationLevel level
= ((DatabaseManagerImpl
*)dbMgr
)->txnMgr()->getIsoLevel();
356 rv
=((DatabaseManagerImpl
*)dbMgr
)->txnMgr()->commit(((DatabaseManagerImpl
*)dbMgr
)->lockMgr());
357 if (rv
!= OK
) return rv
;
358 rv
=((DatabaseManagerImpl
*)dbMgr
)->txnMgr()->startTransaction(((DatabaseManagerImpl
*)dbMgr
)->lockMgr(),level
);
359 if (rv
!= OK
) return rv
;
361 rv
= table
->execute();
362 if (rv
!= OK
) return rv
;
364 table
->setLoading(true);
368 tuple
= (char*)table
->fetchNoBind(rv
);
370 if (tuple
== NULL
) {break;}
371 rv
= table
->deleteTuple();
378 DbRetVal
TruncateTblStatement::resolve()
381 table
= dbMgr
->openTable(parsedData
->getTableName());
384 printError(ErrNotExists
, "Unable to open the table:Table not exists");
394 //================== Compact Table Statement===================
395 DbRetVal
CompactTblStatement::resolve()
398 table
= dbMgr
->openTable(parsedData
->getTableName());
401 printError(ErrNotExists
, "Unable to open the table:Table not exists");
406 DbRetVal
CompactTblStatement::execute(int &rowsAffected
)
409 rv
= table
->compact();
410 dbMgr
->closeTable(table
);
413 DbRetVal
UserTblStatement::resolve()
415 uType
= parsedData
->getUserType();
416 if( uType
== CREATEUSER
|| uType
== DROPUSER
|| (uType
== ALTERUSER
&& strcmp(userName
,parsedData
->getUserName())!=0))
418 if(strcmp(userName
,"root")!=0)
420 printError(ErrNoPrivilege
,"Permission Denied. Login as root");
421 return ErrNoPrivilege
;
422 }else if(uType
== DROPUSER
&& strcmp(parsedData
->getUserName(),"root")==0)
424 printError(ErrNoPrivilege
,"Permission Denied. root user cannot be deleted");
425 return ErrNoPrivilege
;
430 DbRetVal
UserTblStatement::execute(int &rowsAffected
)
433 if( uType
== CREATEUSER
){
434 rv
=(DbRetVal
) usrMgr
->createUser(parsedData
->getUserName(), parsedData
->getPassWord());
435 }else if(uType
== DROPUSER
){
436 rv
=(DbRetVal
) usrMgr
->deleteUser(parsedData
->getUserName());
438 rv
=(DbRetVal
) usrMgr
->changePassword(parsedData
->getUserName(), parsedData
->getPassWord());