00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "PatternManager.h"
00025 #include "Debug.h"
00026 #include "Utilities.h"
00027 #include "PatternTypes.h"
00028 #include "GlobalVariables.h"
00029
00030
00031 #include <qstringlist.h>
00032 #include <qfile.h>
00033
00034
00035 #include <iostream>
00036 using namespace std;
00037 using namespace mysqlpp;
00038
00039
00040
00041 PatternManager::PatternManager(DBInterface *pattDBInter){
00042
00043 patternDBInterface = pattDBInter;
00044 }
00045
00046
00047
00048 PatternManager::~ PatternManager(){
00049 #ifdef MEMORY_DEBUG
00050 cout<<"DESTROYING PATTERN MANAGER"<<endl;
00051 #endif//MEMORY_DEBUG
00052 }
00053
00054
00055
00056
00057
00058
00059
00060
00061 bool PatternManager::addPattern(QString fileName){
00062
00063 if(fileName.length() > MAX_DATABASE_NAME_LENGTH){
00064 cerr<<"PatternManager: FILENAME \""<<fileName<<"\" IS TOO LONG TO BE STORED IN DATABASE"<<endl;
00065 return false;
00066 }
00067
00068
00069 QFile file(fileName);
00070
00071
00072 unsigned int type = 0, width = 0, height = 0;
00073 QString description = "";
00074 int patternGrpID = -1, patternCount = 0;
00075
00076
00077 if ( file.open( IO_ReadOnly ) ) {
00078 QTextStream stream( &file );
00079 QString fileLine;
00080
00081 while ( !stream.atEnd() ) {
00082 fileLine = stream.readLine();
00083 #ifdef LOAD_PATTERN_DEBUG
00084 cout<<"Reading line: \""<<fileLine<<"\""<<endl;
00085 #endif//LOAD_PATTERN_DEBUG
00086
00087
00088 if(fileLine.upper().startsWith("# TYPE:") || fileLine.upper().startsWith("#TYPE:") ){
00089 if(fileLine.section(": ", 1, 1) == "static")
00090 type = STATIC_PATTERN_VALUE;
00091 else if (fileLine.section(": ", 1, 1) == "temporal")
00092 type = TEMPORAL_PATTERN_VALUE;
00093 else{
00094 cerr<<"PatternManager: PATTERN TYPE NOT RECOGNIZED!"<<endl;
00095 return false;
00096 }
00097 }
00098 else if( fileLine.upper().startsWith("# WIDTH:") || fileLine.upper().startsWith("#WIDTH:") )
00099 width = Utilities::getUInt(fileLine.section(": ", 1, 1).ascii());
00100 else if( fileLine.upper().startsWith("# HEIGHT:") || fileLine.upper().startsWith("#HEIGHT:") )
00101 height = Utilities::getUInt(fileLine.section(": ", 1, 1).ascii());
00102 else if(fileLine.upper().startsWith("# DESCRIPTION:") || fileLine.upper().startsWith("#DESCRIPTION:") ){
00103 description = fileLine.section(": ", 1, 1);
00104 if(description.length() > MAX_DATABASE_NAME_LENGTH){
00105 cerr<<"PatternManager: DESCRIPTION \""<<description<<"\" IS TOO LONG TO BE STORED IN DATABASE"<<endl;
00106 return false;
00107 }
00108 }
00109
00110
00111 if(patternGrpID == -1 && type > 0 && width > 0 && height > 0 && description != ""){
00112 #ifdef LOAD_PATTERN_DEBUG
00113 cout<<"Storing pattern: "<<description<<" from "<<fileName<<endl;
00114 #endif//LOAD_PATTERN_DEBUG
00115
00116 patternGrpID = storePatternDescription(description, type, width, height, fileName);
00117 if(patternGrpID == -1)
00118 return true;
00119 else if(patternGrpID == -2)
00120 return false;
00121 }
00122
00123
00124
00125 if(fileLine.upper().startsWith("# PATTERN DATA") || fileLine.upper().startsWith("#PATTERN DATA") ){
00126 if(patternGrpID > -1){
00127 QString patternLine = "";
00128
00129 for(unsigned int i=0; i<height; ++i){
00130 fileLine = stream.readLine();
00131 QStringList numberList = QStringList::split(" ", fileLine);
00132 fileLine = numberList.join(",");
00133 fileLine += ",";
00134 patternLine += fileLine;
00135 }
00136
00137 patternLine.truncate(patternLine.length() - 1);
00138
00139
00140 storePatternData(patternGrpID, patternLine);
00141 ++patternCount;
00142 }
00143 else{
00144 cerr<<"PatternManager: ERROR IN PATTERN FILE. HAVE NOT FOUND ONE OR MORE OF TYPE, WIDTH, HEIGHT, DESCRIPTION PRIOR TO START OF PATTERN DATA. FILENAME = "<<fileName<<endl;
00145 return false;
00146 }
00147 }
00148 }
00149
00150 storePatternCount(patternGrpID, patternCount);
00151 file.close();
00152 }
00153 else{
00154 cerr<<"PatternManager: ERROR OPENING FILE "<<fileName<<endl;
00155 return false;
00156 }
00157
00158
00159 if(patternGrpID == -1){
00160 cerr<<"PatternManager: FAILED TO STORE PATTERN DESCRIPTION. PROBABLY AN ERROR IN THE PATTERN INPUT FILE"<<endl;
00161 return false;
00162 }
00163 if(patternCount == 0){
00164 cerr<<"PatternManager: EMPTY PATTERN. PROBABLY AN ERROR IN THE PATTERN INPUT FILE"<<endl;
00165 return false;
00166 }
00167
00168
00169
00170 #ifdef LOAD_PATTERN_DEBUG
00171 cout<<"Pattern loaded successfully from file \""<<fileName<<"\""<<endl;
00172 #endif//LOAD_PATTERN_DEBUG
00173 return true;
00174 }
00175
00176
00177
00178
00179 bool PatternManager::deletePattern(unsigned int patternID){
00180
00181 Query query = patternDBInterface->getQuery();
00182 bool deleteSuccess = true;
00183
00184
00185 query.reset();
00186 query<<"DELETE FROM PatternDescriptions WHERE PatternGrpID = "<<patternID;
00187 ResNSel queryResult = query.execute();
00188 if(!queryResult.success){
00189 cerr<<"PatternManager: FAILED TO DELETE PATTERN WITH ID"<<patternID<<" FROM PatternDescriptions"<<endl;
00190 deleteSuccess = false;
00191 }
00192
00193
00194 query.reset();
00195 query<<"DELETE FROM PatternData WHERE PatternGrpID = "<<patternID;
00196 queryResult = query.execute();
00197 if(!queryResult.success){
00198 cerr<<"PatternManager: FAILED TO DELETE PATTERN WITH ID"<<patternID<<" FROM PatternData"<<endl;
00199 deleteSuccess = false;
00200 }
00201
00202
00203 return deleteSuccess;
00204 }
00205
00206
00207
00208
00209
00210
00211
00212 bool PatternManager::patternAlreadyStored(QString fileName){
00213 Result result;
00214 Query query = patternDBInterface->getQuery();
00215 query.reset();
00216 query<<"SELECT COUNT(*) FROM PatternDescriptions WHERE File = \""<<fileName<<"\"";
00217 try{
00218 result = query.store();
00219 }
00220 catch(Exception ex){
00221 cerr<<"PatternManager: EXCEPTION THROWN CHECKING IF PATTERN WAS STORED: "<<ex.what()<<endl;
00222 return true;
00223 }
00224
00225
00226 if(result.size() < 1){
00227 cerr<<"PatternManager: UNSUCCESSFUL SEARCH FOR PATTERN DESCRIPTION"<<endl;
00228 return false;
00229 }
00230
00231
00232 Row row(*result.begin());
00233 unsigned int numberOfRows = Utilities::getUInt((std::string)row["COUNT(*)"]);
00234 if(numberOfRows > 0)
00235 return true;
00236 else{
00237 return false;
00238 }
00239 }
00240
00241
00242
00243
00244 void PatternManager::storePatternCount(unsigned int patternGrpID, int patternCount){
00245 Query query = patternDBInterface->getQuery();
00246 query.reset();
00247 query<<"UPDATE PatternDescriptions SET NumberOfPatterns = "<<patternCount<<" WHERE PatternGrpID = "<<patternGrpID;
00248 ResNSel queryResult = query.execute();
00249 if(!queryResult.success){
00250 cerr<<"PatternManager: UNSUCCESSFUL MYSQLPP QUERY STORING PATTERN DESCRIPTION"<<endl;
00251 }
00252 }
00253
00254
00255
00256 bool PatternManager::storePatternData(unsigned int patternGrpID, QString patternString){
00257
00258 Query patternQuery = patternDBInterface->getQuery();
00259 patternQuery.reset();
00260
00261
00262 string stemp (patternString.ascii(), patternString.length()) ;
00263 ostringstream strbuf;
00264 strbuf <<"INSERT INTO PatternData(PatternGrpID, Pattern) VALUES ( "<<patternGrpID<<", \""<<mysqlpp::escape<<stemp<<"\" )";
00265 try{
00266 bool queryOk = patternQuery.exec(strbuf.str());
00267 if(!queryOk){
00268 cerr<<"PatternManager: UNSUCCESSFUL MYSQLPP QUERY: "<<strbuf.str()<<endl;
00269 return false;
00270 }
00271 }
00272 catch(Exception ex){
00273 cerr<<"PatternManager: EXCEPTION THROWN BY UNSUCCESSFUL MYSQLPP QUERY: "<<strbuf.str()<<ex.what()<<endl;
00274 return false;
00275 }
00276 return true;
00277 }
00278
00279
00280
00281
00282 int PatternManager::storePatternDescription(QString description, unsigned short patternType, unsigned int width, unsigned int length, QString fileName){
00283
00284 if(patternAlreadyStored(fileName)){
00285 #ifdef LOAD_PATTERN_DEBUG
00286 cout<<"Pattern from file "<<fileName<<" is already stored."<<endl;
00287 #endif//LOAD_PATTERN_DEBUG
00288 return -1;
00289 }
00290
00291 Query query = patternDBInterface->getQuery();
00292 query.reset();
00293 query<<"INSERT INTO PatternDescriptions(Description, PatternType, Width, Length, File) VALUES ( \""<<description<<"\", "<<patternType<<", "<<width<<", "<<length<<",\""<<fileName<<"\")";
00294 ResNSel queryResult = query.execute();
00295 if(!queryResult.success){
00296 cerr<<"PatternManager: UNSUCCESSFUL MYSQLPP QUERY STORING PATTERN DESCRIPTION"<<endl;
00297 return -2;
00298 }
00299 else{
00300 return queryResult.insert_id;
00301 }
00302 }
00303
00304
00305