From 4d017fe56f4a76f9e23101f3ff7475bff62f849c Mon Sep 17 00:00:00 2001 From: prabatuty Date: Sun, 8 May 2011 02:23:43 +0000 Subject: [PATCH] build fix for embedded csql --- include/Recover.h | 6 +- include/SqlConnection.h | 8 -- src/sql/SqlStatement.cxx | 302 +---------------------------------------------- src/sqllog/Recover.cxx | 18 +-- 4 files changed, 16 insertions(+), 318 deletions(-) diff --git a/include/Recover.h b/include/Recover.h index 46d37763..b860fe5d 100644 --- a/include/Recover.h +++ b/include/Recover.h @@ -52,9 +52,9 @@ class DllExport Recovery int applyRedoLogs(char *redoFile, AbsSqlConnection *conn, bool list = false, bool interactive = false); #if (defined MMDB && defined EMBED) - DbRetVal recoverCsqlDB(); - DbRetVal recoverSystemAndUserDB(); - DbRetVal applySchemaFile(FILE *fp); + DbRetVal recoverCsqlDB(SqlConnection *conn); + DbRetVal recoverSystemAndUserDB(SqlConnection *conn); + DbRetVal applySchemaFile(FILE *fp, SqlConnection *conn); char getQueryFromSchemaFile(FILE *fp, char *buf); #endif diff --git a/include/SqlConnection.h b/include/SqlConnection.h index 1fc8eb49..7aebb3cc 100644 --- a/include/SqlConnection.h +++ b/include/SqlConnection.h @@ -40,20 +40,12 @@ class DllExport SqlConnection : public AbsSqlConnection { Connection conn; bool isConnOpen; -#if (defined MMDB && defined EMBED) - DbRetVal recoverCsqlDB(); - DbRetVal recoverSystemAndUserDB(); - DbRetVal applySchemaFile(FILE *fp); - char getQueryFromSchemaFile(FILE *fp, char *buf); - int applyRedoLogs(char *redoFile); -#endif public: static List connList; static bool isInit; #if (defined MMDB && EMBED) static bool firstThread; static GlobalUniqueID UID; - void *stmtBuckets; #endif void initialize(); List cachedStmts; diff --git a/src/sql/SqlStatement.cxx b/src/sql/SqlStatement.cxx index f135ca59..2b0186c1 100644 --- a/src/sql/SqlStatement.cxx +++ b/src/sql/SqlStatement.cxx @@ -21,6 +21,7 @@ #include #include #include +#include char *lexInput; extern ParsedData *parsedData; @@ -803,7 +804,9 @@ DbRetVal SqlConnection::connect (char *user, char * pass) os::signal(SIGINT, sigTermHandler); os::signal(SIGTERM, sigTermHandler); if (Conf::config.useDurability() && !firstThread) { - rv = recoverCsqlDB(); + Recovery recovery; + rv = recovery.recoverCsqlDB(this); + //rv = recoverCsqlDB(this); if (rv != OK) { printError(ErrSysInternal, "Recovery Failed"); return rv; @@ -971,300 +974,3 @@ void SqlConnection::initialize() #endif isInit = true; } - -#if (defined MMDB && defined EMBED) - -DbRetVal SqlConnection::recoverCsqlDB() -{ - DbRetVal rv = OK; - char dbRedoFileName[MAX_FILE_LEN]; - char dbChkptSchema[MAX_FILE_LEN]; - char dbChkptMap[MAX_FILE_LEN]; - char dbChkptData[MAX_FILE_LEN]; - char dbBackupFile[MAX_FILE_LEN]; - char cmd[IDENTIFIER_LENGTH]; - //check for check point file if present recover - sprintf(dbChkptSchema, "%s/db.chkpt.schema1", Conf::config.getDbFile()); - if (FILE *file = fopen(dbChkptSchema, "r")) { - fclose(file); - sprintf(cmd, "cp -f %s %s/db.chkpt.schema", dbChkptSchema, - Conf::config.getDbFile()); - int ret = system(cmd); - if (ret != 0) return ErrOS; - } - sprintf(dbChkptMap, "%s/db.chkpt.map1", Conf::config.getDbFile()); - if (FILE *file = fopen(dbChkptMap, "r")) { - fclose(file); - sprintf(cmd, "cp -f %s %s/db.chkpt.map", dbChkptMap, - Conf::config.getDbFile()); - int ret = system(cmd); - if (ret != 0) return ErrOS; - } - int chkptID= Database::getCheckpointID(); - sprintf(dbChkptData, "%s/db.chkpt.data%d", Conf::config.getDbFile(), - chkptID); - sprintf(dbBackupFile, "%s/db.chkpt.data1", Conf::config.getDbFile()); - FILE *fl = NULL; - if (!Conf::config.useMmap() && (fl = fopen(dbBackupFile, "r"))) { - fclose(fl); - sprintf(cmd, "cp %s/db.chkpt.data1 %s", Conf::config.getDbFile(), - dbChkptData); - int ret = system(cmd); - if (ret != 0) return ErrOS; - } - if (FILE *file = fopen(dbChkptData, "r")) { - fclose(file); - rv = recoverSystemAndUserDB(); - if (rv != OK) return rv; - } - - //check for redo log file if present apply redo logs - sprintf(dbRedoFileName, "%s/csql.db.cur", Conf::config.getDbFile()); - if (FILE *file = fopen(dbRedoFileName, "r")) - { - fclose(file); - rv = (DbRetVal) applyRedoLogs(dbRedoFileName); - if (rv != OK) return rv; - DatabaseManager *dbMgr = getConnObject().getDatabaseManager(); - rv = dbMgr->checkPoint(); - if (rv != OK) - { - printError(ErrSysInternal, "checkpoint failed after redo log apply"); - return ErrOS; - } - } - return OK; -} - -DbRetVal SqlConnection::recoverSystemAndUserDB() -{ - DbRetVal rv = OK; - char schFile[1024]; - sprintf(schFile, "%s/db.chkpt.schema", Conf::config.getDbFile()); - if (FILE *file = fopen(schFile, "r")) { - rv = applySchemaFile(file); - if (rv != OK) { fclose(file); return rv; } - } - DatabaseManager *dbMgr = getConnObject().getDatabaseManager(); - rv = dbMgr->recover(); - return rv; -} - -DbRetVal SqlConnection::applySchemaFile(FILE *fp) -{ - char buf[8192]; - char eof; - DbRetVal rv = OK; - SqlStatement *stmt = new SqlStatement(); - while ((eof = getQueryFromSchemaFile(fp,buf)) != EOF) { - stmt->setConnection(this); - rv = stmt->prepare(buf); - if (rv != OK) { delete stmt; return rv; } - int rows = 0; - stmt->execute(rows); - if (rv != OK) { stmt->free(); delete stmt; return rv; } - } - delete stmt; - return OK; -} - -char SqlConnection::getQueryFromSchemaFile(FILE *fp, char *buf) -{ - char c, *bufBegin=buf; - int charCnt=0; - while( (c=(char ) fgetc(fp)) != EOF && c != ';') - { - *buf++ = c; charCnt++; - if( charCnt == SQL_STMT_LEN ) { - printf("SQL Statement length is greater than %d. " - "Ignoring the statement.\n", SQL_STMT_LEN ); - *bufBegin++ =';'; - *bufBegin ='\0'; - return 0; - } - } - *buf++ = ';'; - *buf = '\0'; - return c; -} - -int SqlConnection::applyRedoLogs(char *redoFile) -{ - struct stat st; - DbRetVal rv = OK; - int fd = open(redoFile, O_RDONLY); - if (-1 == fd) { return OK; } - if (fstat(fd, &st) == -1) { - printError(ErrSysInternal, "Unable to retrieve undo log file size"); - close(fd); - return 1; - } - if (st.st_size ==0) { - printError(ErrNote, "No Redo logs found during recovery"); - SqlStatement::readAndPopulateStmts(this, stmtBuckets); - close(fd); - return OK; - } - void *startAddr = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (MAP_FAILED == startAddr) { - printf("Unable to read undo log file:mmap failed.\n"); - return 2; - } - - rv = SqlStatement::readAndPopulateStmts(this, stmtBuckets); - if (OK != rv) - { - printf("Unable to read stmt log file\n"); - return 2; - } - - char *iter = (char*)startAddr; - void *value = NULL; - int logType, eType; - int stmtID; - int txnID; - int len, ret, retVal =0; - int loglen; - char stmtString[SQL_STMT_LEN]; - while(true) { - if (iter - (char*)startAddr >= st.st_size) break; - logType = *(int*)iter; - if (logType == -1) { //prepare - iter = iter + sizeof(int); - txnID = *(int*) iter; iter += sizeof(int); - loglen = *(int*) iter; iter += sizeof(int); - stmtID = *(int*)iter; - iter = iter + sizeof(int); - len = *(int*)iter; - iter = iter + sizeof(int); - strncpy(stmtString, iter, len); - iter = iter + len; - AbsSqlStatement *stmt = SqlFactory::createStatement(CSqlDirect); - SqlStatement *sqlStmt = (SqlStatement *)stmt; - stmt->setConnection(this); - rv = stmt->prepare(stmtString); - if (rv != OK) { - printError(ErrSysInternal, "unable to prepare stmt:%s", stmtString); - retVal=1; - break; - } - sqlStmt->setLoading(true); - SqlStatement::addToHashTable(stmtID, stmt, stmtBuckets, stmtString); - } - else if(logType == -2) { //commit - beginTrans(); - iter = iter + sizeof(int); - txnID = *(int*) iter; iter += sizeof(int); - loglen = *(int*) iter; iter += sizeof(int); - char *curPtr = iter; - while(true) { - if (iter - (char*)startAddr >= st.st_size) { - //file end reached - retVal=0; - break; - } - stmtID = *(int*)iter; - iter = iter + sizeof(int); - eType = *(int*)iter; - AbsSqlStatement *stmt = - SqlStatement::getStmtFromHashTable(stmtID,stmtBuckets); - if (NULL == stmt) { - printError(ErrSysInternal, - "Unable to find in stmt hashtable"); - retVal=2; - break; - } - if (0 == eType) { //execute type - iter = iter + sizeof(int); - rv = stmt->execute(ret); - if (rv != OK) { - printError(ErrSysInternal, "unable to execute"); - retVal=2; - break; - } - if (*(int*)iter <0) break; - } else if ( 1 == eType) { //set type - iter=iter+sizeof(int); - int pos = *(int*) iter; - iter=iter+sizeof(int); - int isNull = *(int *)iter; - iter = iter + sizeof(int); - if (isNull == 0) { - DataType type = (DataType)(*(int*)iter); - iter=iter+sizeof(int); - int len = *(int*) iter; - iter=iter+sizeof(int); - value = iter; - iter=iter+len; - SqlStatement::setParamValues(stmt, pos, - type, len, value); - } else stmt->setNull(pos); - if (*(int*)iter <0) break; - } - } - commit(); - } - else if(logType == -3) { //free - iter = iter + sizeof(int); - txnID = *(int*) iter; iter += sizeof(int); - loglen = *(int*) iter; iter += sizeof(int); - stmtID = *(int*)iter; - iter = iter + sizeof(int); - AbsSqlStatement *stmt = SqlStatement::getStmtFromHashTable(stmtID, - stmtBuckets); - if (stmt) { - stmt->free(); - SqlStatement::removeFromHashTable(stmtID,stmtBuckets); - } else { printError(ErrSysInternal, "statement not found for %d\n",stmtID);} - } - else if(logType == -4) { //prepare and execute - iter = iter + sizeof(int); - txnID = *(int*) iter; iter += sizeof(int); - loglen = *(int*) iter; iter += sizeof(int); - stmtID = *(int*)iter; - iter = iter + sizeof(int); - len = *(int*)iter; - iter = iter + sizeof(int); - strncpy(stmtString, iter, len); - stmtString[len+1] ='\0'; - iter = iter + len; - AbsSqlStatement *stmt = SqlFactory::createStatement(CSqlDirect); - if ( NULL == stmt) { - printError(ErrSysInternal, "unable to prepare:%s", stmtString); - retVal=3; - break; - } - stmt->setConnection(this); - rv = stmt->prepare(stmtString); - if (rv != OK) { - printError(ErrSysInternal, "unable to prepare:%s", stmtString); - retVal=4; - break; - } - rv = stmt->execute(ret); - if (rv != OK) { - if (strlen(stmtString) > 6 && - ( (strncasecmp(stmtString,"CREATE", 6) == 0) || - (strncasecmp(stmtString,"DROP", 4) == 0) || - (strncasecmp(stmtString,"RENAME", 6) == 0) || - (strncasecmp(stmtString,"ALTER", 5) == 0) )) { - continue; - } - printError(ErrSysInternal, "unable to execute %s", stmtString); - retVal=5; - break; - } - stmt->free(); - }else{ - printError(ErrSysInternal, "Redo log file corrupted: logType:%d", logType); - retVal=6; - break; - } - } - munmap((char*)startAddr, st.st_size); - close(fd); - SqlStatement::filterAndWriteStmtLogs(stmtBuckets); - SqlStatement::freeAllStmtHandles(stmtBuckets); - return retVal; -} -#endif diff --git a/src/sqllog/Recover.cxx b/src/sqllog/Recover.cxx index 2b1f1c96..1ded0e44 100644 --- a/src/sqllog/Recover.cxx +++ b/src/sqllog/Recover.cxx @@ -276,7 +276,7 @@ DbRetVal Recovery::iterateStmtLogs(AbsSqlConnection *conn, void *startAddr, int #if (defined MMDB && defined EMBED) -DbRetVal Recovery::recoverCsqlDB() +DbRetVal Recovery::recoverCsqlDB(SqlConnection *conn) { DbRetVal rv = OK; char dbRedoFileName[MAX_FILE_LEN]; @@ -316,7 +316,7 @@ DbRetVal Recovery::recoverCsqlDB() } if (FILE *file = fopen(dbChkptData, "r")) { fclose(file); - rv = recoverSystemAndUserDB(); + rv = recoverSystemAndUserDB(conn); if (rv != OK) return rv; } @@ -325,9 +325,9 @@ DbRetVal Recovery::recoverCsqlDB() if (FILE *file = fopen(dbRedoFileName, "r")) { fclose(file); - rv = (DbRetVal) applyRedoLogs(dbRedoFileName); + rv = (DbRetVal) applyRedoLogs(dbRedoFileName, conn); if (rv != OK) return rv; - DatabaseManager *dbMgr = getConnObject().getDatabaseManager(); + DatabaseManager *dbMgr = conn->getConnObject().getDatabaseManager(); rv = dbMgr->checkPoint(); if (rv != OK) { @@ -338,28 +338,28 @@ DbRetVal Recovery::recoverCsqlDB() return OK; } -DbRetVal Recovery::recoverSystemAndUserDB() +DbRetVal Recovery::recoverSystemAndUserDB(SqlConnection *conn) { DbRetVal rv = OK; char schFile[1024]; sprintf(schFile, "%s/db.chkpt.schema", Conf::config.getDbFile()); if (FILE *file = fopen(schFile, "r")) { - rv = applySchemaFile(file); + rv = applySchemaFile(file, conn); if (rv != OK) { fclose(file); return rv; } } - DatabaseManager *dbMgr = getConnObject().getDatabaseManager(); + DatabaseManager *dbMgr = conn->getConnObject().getDatabaseManager(); rv = dbMgr->recover(); return rv; } -DbRetVal Recovery::applySchemaFile(FILE *fp) +DbRetVal Recovery::applySchemaFile(FILE *fp, SqlConnection *conn) { char buf[8192]; char eof; DbRetVal rv = OK; SqlStatement *stmt = new SqlStatement(); while ((eof = getQueryFromSchemaFile(fp,buf)) != EOF) { - stmt->setConnection(this); + stmt->setConnection(conn); rv = stmt->prepare(buf); if (rv != OK) { delete stmt; return rv; } int rows = 0; -- 2.11.4.GIT