⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 query.cpp

📁 fastdb-241源码
💻 CPP
字号:
//-< QUERY.CPP >-----------------------------------------------------*--------*
// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *
// (Main Memory Database Management System)                          *   /\|  *
//                                                                   *  /  \  *
//                          Created:     20-Nov-98    K.A. Knizhnik  * / [] \ *
//                          Last update: 10-Dec-98    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Constructing and hashing database query statements
//-------------------------------------------------------------------*--------*

#define INSIDE_FASTDB

#include "fastdb.h"
#include "symtab.h"
#include "compiler.h"

dbQueryElementAllocator dbQueryElementAllocator::instance;


char* dbQueryElement::dump(char* buf)
{
    switch (type) { 
      case qExpression:
	buf += sprintf(buf, " %s ", (const char*)ptr);
	break;
      case qVarBool:
	buf += sprintf(buf, "{boolean}");
	break;
      case qVarInt1:
	buf += sprintf(buf, "{int1}");
	break;
      case qVarInt2:
	buf += sprintf(buf, "{int2}");
	break;
      case qVarInt4:
	buf += sprintf(buf, "{int4}");
	break;
      case qVarInt8:
	buf += sprintf(buf, "{int8}");
	break;
      case qVarReal4:
	buf += sprintf(buf, "{real4}");
	break;
      case qVarReal8:
	buf += sprintf(buf, "{real8}");
	break;
      case qVarString:
	buf += sprintf(buf, "{char*}");
	break;
      case qVarStringPtr:
	buf += sprintf(buf, "{char**}");
	break;
      case qVarReference:
	if (ref != NULL) { 
	    buf += sprintf(buf, "{dbReference<%s>}", ref->getName());
	} else { 
	    buf += sprintf(buf, "{dbAnyReference}");
	}
	break;
      case qVarArrayOfRef:
	if (ref != NULL) { 
	    buf += sprintf(buf, "{dbArray< dbReference<%s> >}", ref->getName());
	} else { 
	    buf += sprintf(buf, "{dbArray<dbAnyReference>}");
	}
	break;
      case qVarArrayOfRefPtr:
	if (ref != NULL) { 
	    buf += sprintf(buf, "{dbArray< dbReference<%s> >*}", ref->getName());
	} else { 
	    buf += sprintf(buf, "{dbArray<dbAnyReference>*}");
	}
	break;
      case qVarRawData:
	buf += sprintf(buf, "{raw binary}");
	break;
#ifdef USE_STD_STRING
      case qVarStdString:
	buf += sprintf(buf, "{string}");
	break;
#endif	
    }
    return buf;
}
	

char* dbQueryElement::dumpValues(char* buf)
{
    switch (type) { 
      case qExpression:
	buf += sprintf(buf, " %s ", (char*)ptr);
	break;
      case qVarBool:
	buf += sprintf(buf, "%s", *(bool*)ptr ? "true" : "false");
	break;
      case qVarInt1:
	buf += sprintf(buf, "%d", *(int1*)ptr);
	break;
      case qVarInt2:
	buf += sprintf(buf, "%d", *(int2*)ptr);
	break;
      case qVarInt4:
	buf += sprintf(buf, "%d", *(int4*)ptr);
	break;
      case qVarInt8:
	buf += sprintf(buf, INT8_FORMAT, *(int8*)ptr);
	break;
      case qVarReal4:
	buf += sprintf(buf, "%f", *(real4*)ptr);
	break;
      case qVarReal8:
	buf += sprintf(buf, "%f", *(real8*)ptr);
	break;
      case qVarString:
	buf += sprintf(buf, "'%s'", (char*)ptr);
	break;
      case qVarStringPtr:
	buf += sprintf(buf, "'%s'", *(char**)ptr);
	break;
      case qVarReference:
	if (ref != NULL) { 
	    buf += sprintf(buf, "@%s:%x", ref->getName(), *(oid_t*)ptr);
	} else { 
	    buf += sprintf(buf, "@%x", *(oid_t*)ptr);
	}
	break;
      case qVarArrayOfRef:
	if (ref != NULL) { 
	    buf += sprintf(buf, "{dbArray< dbReference<%s> >}", ref->getName());
	} else { 
	    buf += sprintf(buf, "{dbArray<dbAnyReference>}");
	}
	break;
      case qVarArrayOfRefPtr:
	if (ref != NULL) { 
	    buf += sprintf(buf, "{dbArray< dbReference<%s> >*}", ref->getName());
	} else { 
	    buf += sprintf(buf, "{dbArray<dbAnyReference>*}");
	}
	break;
      case qVarRawData:
	buf += sprintf(buf, "{raw binary}");
	break;
#ifdef USE_STD_STRING
      case qVarStdString:
	buf += sprintf(buf, "'%s'", ((std::string*)ptr)->c_str());
	break;
#endif	
    }
    return buf;
}
	
dbQueryElementAllocator::dbQueryElementAllocator() 
: mutex(*new dbMutex), freeChain(NULL) 
{
}

dbQueryElementAllocator::~dbQueryElementAllocator() 
{
    dbQueryElement *elem, *next;
    for (elem = freeChain; elem != NULL; elem = next) { 
	next = elem->next;
	delete elem;
    }    
} 

dbQueryExpression& dbQueryExpression::operator = (dbComponent const& comp) 
{ 
    first = NULL; 
    last = &first;
    add(dbQueryElement::qExpression, comp.structure);
    if (comp.field != NULL) { 
	add(dbQueryElement::qExpression, ".");
	add(dbQueryElement::qExpression, comp.field);
    }
    operand = false;
    return *this;
}

dbQueryExpression& dbQueryExpression::operator=(dbQueryExpression const& expr)
{ 
    first = new dbQueryElement(dbQueryElement::qExpression, "(");
    first->next = expr.first;
    last = expr.last;
    *last = new dbQueryElement(dbQueryElement::qExpression, ")");
    last = &(*last)->next;
    operand = false;
    return *this;
}
 
dbQuery& dbQuery::add(dbQueryExpression const& expr) 
{ 
    append(dbQueryElement::qExpression, "(");
    *nextElement = expr.first;
    nextElement = expr.last;
    append(dbQueryElement::qExpression, ")");
    operand = false;
    return *this;
}



dbQuery& dbQuery::reset() 
{ 
    dbQueryElementAllocator::instance.deallocate(elements, nextElement);
    elements = NULL;
    nextElement = &elements;
    operand = false;
    mutexLocked = false;
    dbCompiledQuery::destroy();
    return *this;
}

void dbCompiledQuery::destroy()
{
    if (tree != NULL) {
	dbCriticalSection cs(dbExprNode::mutex);
	delete tree;
	for (dbOrderByNode *op = order, *nop; op != NULL; op = nop) {
	    nop = op->next;
	    delete op;
	}
	for (dbFollowByNode *fp = follow, *nfp; fp != NULL; fp = nfp) {
	    nfp = fp->next;
	    delete fp;
	}
	tree = NULL;
    }
    startFrom = StartFromAny;
    follow = NULL;
    order = NULL;
    table = NULL;
}

int dbUserFunction::getParameterType()
{
    static byte argType[] = {  
	tpInteger,
	tpReal,
	tpString,
	tpInteger,
	tpReal,
	tpString,
	tpInteger,
	tpReal,
	tpString,
	tpInteger,
	tpReal,
	tpString,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList,
	tpList
    };
    return argType[type];
}

int dbUserFunction::getNumberOfParameters()
{
    static byte nArgs[] = {  
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	1,
	2,
	2,
	2,
	2,
	3,
	3,
	3,
	3
    };
    return nArgs[type];
}

dbUserFunction* dbUserFunction::list;


void dbUserFunction::bind(char* fname, void* f, funcType ftype) 
{ 
    name = fname;
    dbSymbolTable::add(name, tkn_ident, FASTDB_CLONE_ANY_IDENTIFIER);
    next = list;
    list = this;
    fptr = f;
    type = ftype;
}

dbUserFunctionArgument::dbUserFunctionArgument(dbExprNode*             expr, 
					       dbInheritedAttribute&   iattr, 
					       dbSynthesizedAttribute& sattr, 
					       int                     i)
{
    dbDatabase::execute(expr->func.arg[i], iattr, sattr);
    switch (expr->func.arg[i]->type) {
      case tpInteger:
	u.intValue = sattr.ivalue;
	type = atInteger;
	break;
      case tpReal:
	u.realValue = sattr.fvalue;
	type = atReal;
	break;
      case tpString:
	u.strValue = sattr.array.base;
	type = atString;
	break;
      case tpBoolean:
	u.boolValue = sattr.bvalue;
	type = atBoolean;
	break;
      case tpReference:
	u.oidValue = sattr.oid;
	type = atReference;
	break;
      case tpRawBinary:
	u.rawValue = sattr.raw;
	type = atRawBinary;
	break;
      default:
	assert(false);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -