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

📄 query.cpp

📁 一个功能强大的内存数据库源代码,c++编写,有详细的注释
💻 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, *(db_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) {}void* dbQueryElementAllocator::allocate(size_t size) {     dbCriticalSection cs(mutex);    dbQueryElement* elem = freeChain;    if (elem != NULL) {        freeChain = elem->next;        return elem;    } else {        return new byte[size];    }}void  dbQueryElement::operator delete(void* p){    delete[] (char*)p;}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 + -