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

📄 database.cpp

📁 fastdb-2.92的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    }    while (y != 0) {        if (y & 1) {             res *= x;        }        x *= x;        y >>= 1;    }    return res;    }inline real8 powerRealInt(real8 x, db_int8 y) {    real8 res = 1.0;    if (y < 0) {        x = 1/x;        y = -y;    }    while (y != 0) {        if (y & 1) {             res *= x;        }        x *= x;        y >>= 1;    }    return res;    }bool dbDatabase::evaluate(dbExprNode* expr, oid_t oid, dbTable* table, dbAnyCursor* cursor){    dbInheritedAttribute iattr;    dbSynthesizedAttribute sattr;    iattr.db = this;    iattr.oid = oid;    iattr.table = table;    iattr.record = (byte*)getRow(oid);        iattr.paramBase = (size_t)cursor->paramBase;    execute(expr, iattr, sattr);    return sattr.bvalue != 0;}void _fastcall dbDatabase::execute(dbExprNode*             expr,                                    dbInheritedAttribute&   iattr,                                    dbSynthesizedAttribute& sattr){    dbSynthesizedAttribute sattr2, sattr3;    switch (expr->cop) {      case dbvmVoid:        sattr.bvalue = true; // empty condition        return;      case dbvmCurrent:        sattr.oid = iattr.oid;        return;      case dbvmFirst:        sattr.oid = iattr.table->firstRow;        return;      case dbvmLast:        sattr.oid = iattr.table->lastRow;        return;      case dbvmLoadBool:        execute(expr->operand[0], iattr, sattr);        sattr.bvalue = *(bool*)(sattr.base+expr->offs);        return;      case dbvmLoadInt1:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = *(int1*)(sattr.base+expr->offs);        return;      case dbvmLoadInt2:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = *(int2*)(sattr.base+expr->offs);        return;      case dbvmLoadInt4:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = *(int4*)(sattr.base+expr->offs);        return;      case dbvmLoadInt8:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = *(db_int8*)(sattr.base+expr->offs);        return;      case dbvmLoadReal4:        execute(expr->operand[0], iattr, sattr);        sattr.fvalue = *(real4*)(sattr.base+expr->offs);        return;      case dbvmLoadReal8:        execute(expr->operand[0], iattr, sattr);        sattr.fvalue = *(real8*)(sattr.base+expr->offs);        return;      case dbvmLoadReference:        execute(expr->operand[0], iattr, sattr);        sattr.oid = *(oid_t*)(sattr.base+expr->offs);        return;      case dbvmLoadArray:      case dbvmLoadString:        execute(expr->operand[0], iattr, sattr2);        sattr.array.base = (char*)sattr2.base             + ((dbVarying*)(sattr2.base + expr->offs))->offs;        sattr.array.size = ((dbVarying*)(sattr2.base + expr->offs))->size;        return;      case dbvmLoadRawBinary:        execute(expr->operand[0], iattr, sattr);        sattr.raw = (void*)(sattr.base+expr->offs);        return;      case dbvmLoadSelfBool:        sattr.bvalue = *(bool*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfInt1:        sattr.ivalue = *(int1*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfInt2:        sattr.ivalue = *(int2*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfInt4:        sattr.ivalue = *(int4*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfInt8:        sattr.ivalue = *(db_int8*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfReal4:        sattr.fvalue = *(real4*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfReal8:        sattr.fvalue = *(real8*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfReference:        sattr.oid = *(oid_t*)(iattr.record+expr->offs);        return;      case dbvmLoadSelfArray:      case dbvmLoadSelfString:        sattr.array.base = (char*)iattr.record +             ((dbVarying*)(iattr.record + expr->offs))->offs;        sattr.array.size = ((dbVarying*)(iattr.record + expr->offs))->size;        return;      case dbvmLoadSelfRawBinary:        sattr.raw = (void*)(iattr.record+expr->offs);        return;      case dbvmInvokeMethodBool:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.bvalue);        sattr.bvalue = *(bool*)&sattr.bvalue;        return;      case dbvmInvokeMethodInt1:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.ivalue);        sattr.ivalue = *(int1*)&sattr.ivalue;        return;      case dbvmInvokeMethodInt2:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.ivalue);        sattr.ivalue = *(int2*)&sattr.ivalue;        return;      case dbvmInvokeMethodInt4:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.ivalue);        sattr.ivalue = *(int4*)&sattr.ivalue;        return;      case dbvmInvokeMethodInt8:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.ivalue);        return;      case dbvmInvokeMethodReal4:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.fvalue);         sattr.fvalue = *(real4*)&sattr.fvalue;        return;      case dbvmInvokeMethodReal8:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.fvalue);        return;      case dbvmInvokeMethodReference:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr.oid);        return;      case dbvmInvokeMethodString:        execute(expr->ref.base, iattr, sattr);        expr->ref.field->method->invoke(sattr.base, &sattr2.array.base);        sattr.array.size = strlen(sattr2.array.base) + 1;        sattr.array.base = dbStringValue::create(sattr2.array.base, iattr);        delete[] sattr2.array.base;        return;      case dbvmInvokeSelfMethodBool:        expr->ref.field->method->invoke(iattr.record, &sattr.bvalue);        sattr.bvalue = *(bool*)&sattr.bvalue;        return;      case dbvmInvokeSelfMethodInt1:        expr->ref.field->method->invoke(iattr.record, &sattr.ivalue);        sattr.ivalue = *(int1*)&sattr.ivalue;        return;      case dbvmInvokeSelfMethodInt2:        expr->ref.field->method->invoke(iattr.record, &sattr.ivalue);        sattr.ivalue = *(int2*)&sattr.ivalue;        return;      case dbvmInvokeSelfMethodInt4:        expr->ref.field->method->invoke(iattr.record, &sattr.ivalue);        sattr.ivalue = *(int4*)&sattr.ivalue;        return;      case dbvmInvokeSelfMethodInt8:        expr->ref.field->method->invoke(iattr.record, &sattr.ivalue);        return;      case dbvmInvokeSelfMethodReal4:        expr->ref.field->method->invoke(iattr.record, &sattr.fvalue);         sattr.fvalue = *(real4*)&sattr.fvalue;        return;      case dbvmInvokeSelfMethodReal8:        expr->ref.field->method->invoke(iattr.record, &sattr.fvalue);        return;      case dbvmInvokeSelfMethodReference:        expr->ref.field->method->invoke(iattr.record, &sattr.oid);        return;      case dbvmInvokeSelfMethodString:        expr->ref.field->method->invoke(iattr.record, &sattr2.array.base);        sattr.array.size = strlen(sattr2.array.base) + 1;        sattr.array.base = dbStringValue::create(sattr2.array.base, iattr);        delete[] sattr2.array.base;        return;      case dbvmLength:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = sattr.array.size;        return;      case dbvmStringLength:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = sattr.array.size - 1;        return;      case dbvmGetAt:        execute(expr->operand[0], iattr, sattr);        execute(expr->operand[1], iattr, sattr2);        if ((nat8)sattr2.ivalue >= (nat8)sattr.array.size) {             if (expr->operand[1]->cop == dbvmVariable) {                 longjmp(iattr.exists_iterator[expr->operand[1]->offs].unwind, 1);            }            iattr.removeTemporaries();            iattr.db->handleError(IndexOutOfRangeError, NULL,                                   int(sattr2.ivalue));        }        sattr.base = (byte*)sattr.array.base + int(sattr2.ivalue)*expr->offs;        return;      case dbvmCharAt:        execute(expr->operand[0], iattr, sattr);        execute(expr->operand[1], iattr, sattr2);        if ((nat8)sattr2.ivalue >= (nat8)(sattr.array.size-1)) {             if (expr->operand[1]->cop == dbvmVariable) {                 longjmp(iattr.exists_iterator[expr->operand[1]->offs].unwind, 1);            }            iattr.removeTemporaries();            iattr.db->handleError(IndexOutOfRangeError, NULL,                                   int(sattr2.ivalue));        }        sattr.ivalue = (byte)sattr.array.base[int(sattr2.ivalue)];        return;      case dbvmExists:        iattr.exists_iterator[expr->offs].index = 0;        if (setjmp(iattr.exists_iterator[expr->offs].unwind) == 0) {             do {                 execute(expr->operand[0], iattr, sattr);                iattr.exists_iterator[expr->offs].index += 1;            } while (!sattr.bvalue);        } else {            sattr.bvalue = false;        }        return;      case dbvmVariable:        sattr.ivalue = iattr.exists_iterator[expr->offs].index;        return;      case dbvmLoadVarBool:        sattr.bvalue = *(bool*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarInt1:        sattr.ivalue = *(int1*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarInt2:        sattr.ivalue = *(int2*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarInt4:        sattr.ivalue = *(int4*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarInt8:        sattr.ivalue = *(db_int8*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarReal4:        sattr.fvalue = *(real4*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarReal8:        sattr.fvalue = *(real8*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarReference:        sattr.oid = *(oid_t*)((char*)expr->var + iattr.paramBase);        return;      case dbvmLoadVarString:        sattr.array.base = (char*)((char*)expr->var + iattr.paramBase);        sattr.array.size = strlen((char*)sattr.array.base) + 1;        return;      case dbvmLoadVarStringPtr:        sattr.array.base = *(char**)((char*)expr->var + iattr.paramBase);        sattr.array.size = strlen((char*)sattr.array.base) + 1;        return;      case dbvmLoadVarArray:        sattr.array.base = (char*)((dbAnyArray*)((char*)expr->var + iattr.paramBase))->base();        sattr.array.size = ((dbAnyArray*)((char*)expr->var + iattr.paramBase))->length();        return;      case dbvmLoadVarArrayPtr:        {            dbAnyArray* arr = *(dbAnyArray**)((char*)expr->var + iattr.paramBase);            sattr.array.base = (char*)arr->base();            sattr.array.size = arr->length();            return;        }      case dbvmLoadVarRawBinary:        sattr.raw = (void*)((char*)expr->var + iattr.paramBase);        return;#ifdef USE_STD_STRING      case dbvmLoadVarStdString:        sattr.array.base = (char*)((std::string*)((char*)expr->var + iattr.paramBase))->c_str();        sattr.array.size = ((std::string*)((char*)expr->var + iattr.paramBase))->length() + 1;        return;#endif      case dbvmLoadTrue:        sattr.bvalue = true;        return;      case dbvmLoadFalse:        sattr.bvalue = false;        return;      case dbvmLoadNull:        sattr.oid = 0;        return;      case dbvmLoadIntConstant:        sattr.ivalue = expr->ivalue;        return;      case dbvmLoadRealConstant:        sattr.fvalue = expr->fvalue;        return;      case dbvmLoadStringConstant:        sattr.array.base = expr->svalue.str;        sattr.array.size = expr->svalue.len;        return;          case dbvmOrBool:        execute(expr->operand[0], iattr, sattr);        if (sattr.bvalue == 0) {             execute(expr->operand[1], iattr, sattr);        }        return;      case dbvmAndBool:        execute(expr->operand[0], iattr, sattr);        if (sattr.bvalue != 0) {             execute(expr->operand[1], iattr, sattr);        }        return;      case dbvmNotBool:        execute(expr->operand[0], iattr, sattr);        sattr.bvalue = !sattr.bvalue;         return;      case dbvmIsNull:        execute(expr->operand[0], iattr, sattr);        sattr.bvalue = sattr.oid == 0;        return;      case dbvmNegInt:        execute(expr->operand[0], iattr, sattr);        sattr.ivalue = -sattr.ivalue;        return;

⌨️ 快捷键说明

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