Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
0
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;
}