📄 database.cpp
字号:
execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); if ((*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) < 0) { sattr.bvalue = false; } else { execute(expr->operand[2], iattr, sattr2); sattr.bvalue = (*(dbUDTComparator)expr->func.fptr)(sattr.raw, sattr2.raw, expr->offs) <= 0; } return; case dbvmIntToReference: execute(expr->operand[0], iattr, sattr); sattr.oid = (oid_t)sattr.ivalue; return; case dbvmIntToReal: execute(expr->operand[0], iattr, sattr); sattr.fvalue = (real8)sattr.ivalue; return; case dbvmRealToInt: execute(expr->operand[0], iattr, sattr); sattr.ivalue = (db_int8)sattr.fvalue; return; case dbvmIntToString: execute(expr->operand[0], iattr, sattr); convertIntToString(iattr, sattr); return; case dbvmRealToString: execute(expr->operand[0], iattr, sattr); convertRealToString(iattr, sattr); return; case dbvmStringConcat: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); concatenateStrings(iattr, sattr, sattr2); return; case dbvmUpperString: execute(expr->operand[0], iattr, sattr); uppercaseString(iattr, sattr); return; case dbvmLowerString: execute(expr->operand[0], iattr, sattr); lowercaseString(iattr, sattr); return; case dbvmEqString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) == 0; return; case dbvmNeString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) != 0; return; case dbvmGtString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) > 0; return; case dbvmGeString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) >= 0; return; case dbvmLtString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) < 0; return; case dbvmLeString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) <= 0; return;#ifdef USE_REGEX case dbvmMatchString: execute(expr->regex.opd, iattr, sattr); sattr.bvalue = regexec(&expr->regex.re, (char*)sattr.array.base, 0, NULL, 0) == 0; return;#endif case dbvmLikeString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = matchStrings(sattr, sattr2); return; case dbvmLikeEscapeString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); execute(expr->operand[2], iattr, sattr3); sattr.bvalue = matchStrings(sattr, sattr2, *sattr3.array.base); return; case dbvmBetweenString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); if (compareStrings(sattr, sattr2) < 0) { sattr.bvalue = false; } else { execute(expr->operand[2], iattr, sattr2); sattr.bvalue = compareStrings(sattr, sattr2) <= 0; } return; case dbvmEqBool: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.bvalue == sattr2.bvalue; return; case dbvmNeBool: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.bvalue != sattr2.bvalue; return; case dbvmEqReference: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.oid == sattr2.oid; return; case dbvmNeReference: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); sattr.bvalue = sattr.oid != sattr2.oid; return; case dbvmDeref: execute(expr->operand[0], iattr, sattr); if (sattr.oid == 0) { iattr.removeTemporaries(); iattr.db->handleError(NullReferenceError); } assert(!(iattr.db->currIndex[sattr.oid] & (dbInternalObjectMarker|dbFreeHandleMarker))); sattr.base = iattr.db->baseAddr + iattr.db->currIndex[sattr.oid]; return; case dbvmFuncArg2Bool: sattr.bvalue = (*(bool(*)(dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0)); return; case dbvmFuncArg2Int: sattr.ivalue = (*(db_int8(*)(dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0)); return; case dbvmFuncArg2Real: sattr.fvalue = (*(real8(*)(dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0)); return; case dbvmFuncArg2Str: copyString(iattr, sattr, (*(char*(*)(dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0))); return; case dbvmFuncArgArg2Bool: sattr.bvalue = (*(bool(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1)); return; case dbvmFuncArgArg2Int: sattr.ivalue = (*(db_int8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1)); return; case dbvmFuncArgArg2Real: sattr.fvalue = (*(real8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1)); return; case dbvmFuncArgArg2Str: copyString(iattr, sattr, (*(char*(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1))); return; case dbvmFuncArgArgArg2Bool: sattr.bvalue = (*(bool(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1), dbUserFunctionArgument(expr, iattr, sattr, 2)); return; case dbvmFuncArgArgArg2Int: sattr.ivalue = (*(db_int8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1), dbUserFunctionArgument(expr, iattr, sattr, 2)); return; case dbvmFuncArgArgArg2Real: sattr.fvalue = (*(real8(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1), dbUserFunctionArgument(expr, iattr, sattr, 2)); return; case dbvmFuncArgArgArg2Str: copyString(iattr, sattr, (*(char*(*)(dbUserFunctionArgument const&, dbUserFunctionArgument const&, dbUserFunctionArgument const&))expr->func.fptr) (dbUserFunctionArgument(expr, iattr, sattr, 0), dbUserFunctionArgument(expr, iattr, sattr, 1), dbUserFunctionArgument(expr, iattr, sattr, 2))); return; case dbvmFuncInt2Bool: execute(expr->func.arg[0], iattr, sattr); sattr.bvalue = (*(bool(*)(db_int8))expr->func.fptr)(sattr.ivalue); return; case dbvmFuncReal2Bool: execute(expr->func.arg[0], iattr, sattr); sattr.bvalue = (*(bool(*)(real8))expr->func.fptr)(sattr.fvalue); return; case dbvmFuncStr2Bool: execute(expr->func.arg[0], iattr, sattr); sattr.bvalue = (*(bool(*)(char const*))expr->func.fptr)(sattr.array.base); return; case dbvmFuncInt2Int: execute(expr->func.arg[0], iattr, sattr); sattr.ivalue = (*(db_int8(*)(db_int8))expr->func.fptr)(sattr.ivalue); return; case dbvmFuncReal2Int: execute(expr->func.arg[0], iattr, sattr); sattr.ivalue = (*(db_int8(*)(real8))expr->func.fptr)(sattr.fvalue); return; case dbvmFuncStr2Int: execute(expr->func.arg[0], iattr, sattr); sattr.ivalue = (*(db_int8(*)(char const*))expr->func.fptr)(sattr.array.base); return; case dbvmFuncInt2Real: execute(expr->func.arg[0], iattr, sattr); sattr.fvalue = (*(real8(*)(db_int8))expr->func.fptr)(sattr.ivalue); return; case dbvmFuncReal2Real: execute(expr->func.arg[0], iattr, sattr); sattr.fvalue = (*(real8(*)(real8))expr->func.fptr)(sattr.fvalue); return; case dbvmFuncStr2Real: execute(expr->func.arg[0], iattr, sattr); sattr.fvalue = (*(real8(*)(char const*))expr->func.fptr)(sattr.array.base); return; case dbvmFuncInt2Str: execute(expr->func.arg[0], iattr, sattr); copyString(iattr, sattr, (*(char*(*)(db_int8))expr->func.fptr)(sattr.ivalue)); return; case dbvmFuncReal2Str: execute(expr->func.arg[0], iattr, sattr); copyString(iattr, sattr, (*(char*(*)(real8))expr->func.fptr)(sattr.fvalue)); return; case dbvmFuncStr2Str: execute(expr->func.arg[0], iattr, sattr); copyString(iattr, sattr, (*(char*(*)(char const*))expr->func.fptr)(sattr.array.base)); return; case dbvmInArrayBool: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfBool(sattr, sattr2); return; case dbvmInArrayInt1: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfInt1(sattr, sattr2); return; case dbvmInArrayInt2: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfInt2(sattr, sattr2); return; case dbvmInArrayInt4: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfInt4(sattr, sattr2); return; case dbvmInArrayInt8: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfInt8(sattr, sattr2); return; case dbvmInArrayReal4: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfReal4(sattr, sattr2); return; case dbvmInArrayReal8: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfReal8(sattr, sattr2); return; case dbvmInArrayString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfString(sattr, sattr2); return; case dbvmInArrayReference: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfReference(sattr, sattr2); return; case dbvmInArrayRectangle: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchArrayOfRectangle(iattr, sattr, sattr2); return; case dbvmInString: execute(expr->operand[0], iattr, sattr); execute(expr->operand[1], iattr, sattr2); searchInString(sattr, sattr2); return; default: assert(false); }}void dbDatabase::handleError(dbErrorClass error, char const* msg, int arg){ if (errorHandler != NULL) { (*errorHandler)(error, msg, arg, errorHandlerContext); }#ifdef THROW_EXCEPTION_ON_ERROR if (error != NoError) { if (error == DatabaseOpenError) { fprintf(stderr, "%s\n", msg); } else { throw dbException(error, msg, arg); } }#else char buf[256]; switch (error) { case QueryError: fprintf(stderr, "%s in position %d\n", msg, arg); return; case ArithmeticError: fprintf(stderr, "%s\n", msg); break; case IndexOutOfRangeError: fprintf(stderr, "Index %d is out of range\n", arg); break; case DatabaseOpenError: fprintf(stderr, "%s\n", msg); return; case FileError: fprintf(stderr, "%s: %s\n", msg, dbFile::errorText(arg, buf, sizeof(buf))); break; case OutOfMemoryError: fprintf(stderr,"Not enough memory: failed to allocate %d bytes\n",arg); break; case NullReferenceError: fprintf(stderr, "Null object reference is accessed\n"); break; case Deadlock: fprintf(stderr, "Deadlock is caused by upgrading shared locks to exclusive"); break; case LockRevoked: fprintf(stderr, "Lock is revoked by some other client"); break; case InconsistentInverseReference: fprintf(stderr, "%s\n", msg); return; case DatabaseReadOnly: fprintf(stderr, "Attempt to modify readonly database"); break; default: return; } abort();#endif}bool dbDatabase::isReplicated()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -