int RecordManager::select_record(char* tableName, Node* def, Node* expr, vector<CursePair>& curseTable) { string filename(tableName); filename+=".db"; load_file(filename); assignColumnName(def); unsigned char* block = nullptr; // from start to column int initial_offset = m_header.valLength; int columnId = 0; for (int i = m_header.columnCount - 1; i >=0 ;--i) { initial_offset -= m_header.columnLength[i]; if (strcmp(m_header.columnName[i], expr->leftSon->strval) == 0) { columnId = i; // always break! break; } } for (auto it=curseTable.begin(); it!=curseTable.end();) { block = m_bufInstance->getblock(m_currentPage, it->first, BUFFER_FLAG_NONDIRTY)\ + it->second + initial_offset; if (!cmpExpr(expr, block, columnId)) curseTable.erase(it); else ++it; } write_back(); return 0; }
std::string Translator::translateExceptionHandler(const std::string &header, const std::string &funcName) { boost::regex cmpExpr("^\\s*\\:when_[\\l\\u_]*\\s*(;.*)?"); boost::regex expr(":when_[\\l\\u_]*"); boost::smatch res; std::string::const_iterator start = header.begin(); std::string::const_iterator end = header.end(); std::string exceptionType; if(boost::regex_match(start, end, res, cmpExpr)) { start = header.begin(); end = header.end(); boost::regex_search(start, end, res, expr); exceptionType = res[0]; boost::replace_first(exceptionType, ":when_", ""); } else throw ParseError("incorrect exception handler header"); Exception::Type type = Exception::strToExceptionType(exceptionType); if(type == Exception::NoType) throw ParseError("incorrect exception handler name `" + exceptionType + "`"); if(Program::getInstance().getFunction(funcName).exceptionHandlerIsExists(type)) throw ParseError("in function `" + funcName + "` handler on exception `" + exceptionType + "` already exists"); CodeBlockTranslator codeTransl; codeTransl.setDataKeeperPtr(Program::getInstance().getFunction(funcName).getDataKeeperPtr()); bool fEnd; std::string str; while(fEnd == false && readString(str) == false) { boost::trim(str); if(boost::istarts_with(str, ".end") || boost::istarts_with(str, ":when_")) fEnd = true; if(Translator::isEmptyOrComment(str) == false && fEnd == false) codeTransl.translate(str, m_lineNumb); } Program::getInstance().getFunction(funcName).setExceptionHandler(type, codeTransl.getCommands()); return str; }
int RecordManager::select_record_raw(char* tableName, Node* def, Node* expr, vector<CursePair>& curseTable) { string filename(tableName); filename+=".db"; load_file(filename); assignColumnName(def); // from flag back to column int initial_offset = 0; int columnId = 0; for (int i = m_header.columnCount - 1; i >=0 ;--i) { initial_offset += m_header.columnLength[i]; if (strcmp(m_header.columnName[i], expr->leftSon->strval) == 0) { columnId = i; // always break! break; } } // all int blockNo = 0; unsigned char* block = m_bufInstance->getblock(m_currentPage, blockNo, BUFFER_FLAG_NONDIRTY); unsigned char* blockPtr = block+m_header.headerLength+m_header.valLength; for (int i = m_header.entryCount; i>0;) { if (*(int*)blockPtr < 0) { --i; if (cmpExpr(expr, blockPtr - initial_offset, columnId)) curseTable.push_back(std::make_pair(blockNo, blockPtr-block-m_header.valLength)); } blockPtr += (m_header.valLength+sizeof(int)); if ((blockPtr+sizeof(int)) > (block+BLOCK_SIZE)) { block = m_bufInstance->getblock(m_currentPage, ++blockNo, BUFFER_FLAG_NONDIRTY); blockPtr = block+m_header.valLength; } } write_back(); return 0; }