plugged the memory leaks
[csql.git] / src / sql / DdlStatement.cxx
blobdc711bd3bb29b34ac9d9f8608c1b05b9284d3e90
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 ***************************************************************************/
16 #include "Statement.h"
17 #include <Info.h>
18 CreateTblStatement::CreateTblStatement()
20 parsedData = NULL;
21 dbMgr = NULL;
24 CreateTblStatement::~CreateTblStatement()
26 tblDef.reset();
28 DbRetVal CreateTblStatement::execute(int &rowsAffected)
30 DbRetVal rv = OK;
31 rv = dbMgr->createTable(tblName, tblDef);
32 if (rv != OK) return rv;
33 if (parsedData->getFieldNameList().size() > 0)
35 HashIndexInitInfo *idxInfo = new HashIndexInitInfo();
36 strcpy(idxInfo->tableName, tblName);
37 ListIterator iter = parsedData->getFieldNameList().getIterator();
38 FieldName *name = NULL;
39 while (iter.hasElement())
41 name = (FieldName*)iter.nextElement();
42 idxInfo->list.append(name->fldName);
44 idxInfo->indType = hashIndex;
45 idxInfo->isPrimary = true;
46 idxInfo->isUnique = true;
48 char indName[IDENTIFIER_LENGTH];
49 sprintf(indName, "%s_idx1_Primary", tblName);
50 rv = dbMgr->createIndex(indName, idxInfo);
51 delete idxInfo;
53 return rv;
55 DbRetVal CreateTblStatement::checkForDot(char *name)
57 int i=0;
58 while ( name[i] != '\0')
60 if (name[i++] == '.') { return ErrSyntaxError; }
62 return OK;
65 DbRetVal CreateTblStatement::resolve()
67 DbRetVal rv = OK;
68 strcpy(tblName, parsedData->getTableName());
69 rv = checkForDot(tblName);
70 if ( rv!=OK )
72 printf("Check SQL Syntax: .\n");
73 return rv;
75 FieldIterator iter = parsedData->getCreFldList().getIterator();
77 int i = 0;
78 FieldName *name = NULL;
79 ListIterator nIter = parsedData->getFieldNameList().getIterator();
80 while (iter.hasElement())
82 FieldDef *fDef = iter.nextElement();
83 nIter.reset();
84 while (nIter.hasElement())
86 name = (FieldName*)nIter.nextElement();
87 if (strcmp(name->fldName, fDef->fldName_) == 0) fDef->isNull_ = true;
89 rv = checkForDot(fDef->fldName_);
90 if ( rv!=OK )
92 printf("Check SQL Syntax: .\n");
93 return rv;
96 //TODO : need a new addField function which can take FieldDef as parameter.
97 if (!fDef->isDefault_) {
98 i = tblDef.addField(fDef->fldName_, fDef->type_, fDef->length_,
99 NULL,fDef->isNull_);
100 } else {
101 i = tblDef.addField(fDef->fldName_, fDef->type_, fDef->length_,
102 fDef->defaultValueBuf_,fDef->isNull_);
104 if( 0 != i )
106 printError(ErrUnknown, "Error while adding field");
107 rv = ErrUnknown;
108 break;
111 return rv;
114 ///////////////////////////////////////
115 CreateIdxStatement::CreateIdxStatement()
117 parsedData = NULL;
118 dbMgr = NULL;
121 CreateIdxStatement::~CreateIdxStatement()
126 DbRetVal CreateIdxStatement::execute(int &rowsAffected)
128 DbRetVal rv = OK;
129 if (parsedData->getFieldNameList().size() > 0)
131 HashIndexInitInfo *idxInfo = new HashIndexInitInfo();
132 strcpy(idxInfo->tableName, parsedData->getTableName());
133 ListIterator iter = parsedData->getFieldNameList().getIterator();
134 FieldName *name = NULL;
135 while (iter.hasElement())
137 name = (FieldName*)iter.nextElement();
138 idxInfo->list.append(name->fldName);
140 idxInfo->indType = parsedData->getIndexType();
141 idxInfo->isPrimary = parsedData->getPrimary();
142 idxInfo->isUnique = parsedData->getUnique();
143 rv = dbMgr->createIndex(parsedData->getIndexName(), idxInfo);
144 delete idxInfo;
146 return rv;
149 // function for not to drop cached table
150 DbRetVal isTableCached(char *tabName) // function added by :Jitendra
153 DbRetVal rv =OK;
154 FILE *fp;
155 if (!Conf::config.useCache()) return OK;
156 fp = fopen(Conf::config.getTableConfigFile(),"r");
157 if(fp==NULL) return OK;
158 char tablename[IDENTIFIER_LENGTH];
159 tablename[0] = '\0';
160 char condition[IDENTIFIER_LENGTH];
161 condition[0]='\0';
162 char fieldname[IDENTIFIER_LENGTH];
163 fieldname[0]='\0';
164 char field[IDENTIFIER_LENGTH]; field[0]='\0';
165 int mode;
166 while(!feof(fp))
168 fscanf(fp,"%d:%s %s %s %s\n",&mode,tablename,fieldname,condition,field);
169 if(strcmp(tablename,tabName) ==0){
170 fclose(fp);
171 return ErrNoPrivilege;}
173 fclose(fp);
174 return rv;
177 DbRetVal DropTblStatement::execute(int &rowsAffected)
179 DbRetVal rv = OK; // newly added
180 char *tab;
181 tab = parsedData->getTableName();
183 rv = isTableCached(tab);
184 if(rv !=OK)
186 printf("cached table can't be dropped,Table can be unloaded by \"cachetable -t <tableName> -u\"\n");
187 return ErrNoPrivilege;
188 } // upto this
189 rv = dbMgr->dropTable(parsedData->getTableName());
190 return rv;
193 DbRetVal DropIdxStatement::execute(int &rowsAffected)
195 DbRetVal rv = OK;
196 rv = dbMgr->dropIndex(parsedData->getIndexName());
197 return rv;