📄 database.cpp
字号:
db_int8 v = sattr.ivalue;
while (--n >= 0) {
if (v == *p) {
sattr.bvalue = true;
return;
}
p += 1;
}
sattr.bvalue = false;
}
inline void searchArrayOfReal4(dbSynthesizedAttribute& sattr,
dbSynthesizedAttribute& sattr2)
{
real4* p = (real4*)sattr2.array.base;
int n = sattr2.array.size;
real4 v = (real4)sattr.fvalue;
while (--n >= 0) {
if (v == *p++) {
sattr.bvalue = true;
return;
}
}
sattr.bvalue = false;
}
inline void searchArrayOfReal8(dbSynthesizedAttribute& sattr,
dbSynthesizedAttribute& sattr2)
{
real8 *p = (real8*)sattr2.array.base;
int n = sattr2.array.size;
real8 v = sattr.fvalue;
while (--n >= 0) {
if (v == *p) {
sattr.bvalue = true;
return;
}
p += 1;
}
sattr.bvalue = false;
}
inline void searchArrayOfReference(dbSynthesizedAttribute& sattr,
dbSynthesizedAttribute& sattr2)
{
oid_t *p = (oid_t*)sattr2.array.base;
int n = sattr2.array.size;
oid_t v = sattr.oid;
while (--n >= 0) {
if (v == *p) {
sattr.bvalue = true;
return;
}
p += 1;
}
sattr.bvalue = false;
}
inline void searchArrayOfRectangle(dbInheritedAttribute& iattr,
dbSynthesizedAttribute& sattr,
dbSynthesizedAttribute& sattr2)
{
rectangle *p = (rectangle*)sattr2.array.base;
int n = sattr2.array.size;
rectangle v = sattr.rvalue;
sattr.bvalue = false;
while (--n >= 0) {
if (v == *p) {
sattr.bvalue = true;
break;
}
p += 1;
}
}
inline void searchArrayOfString(dbSynthesizedAttribute& sattr,
dbSynthesizedAttribute& sattr2)
{
dbVarying *p = (dbVarying*)sattr2.array.base;
int n = sattr2.array.size;
char* str = sattr.array.base;
char* base = (char*)sattr2.base;
while (--n >= 0) {
if (strcmp(base + p->offs, str) == 0) {
sattr.bvalue = true;
return;
}
p += 1;
}
sattr.bvalue = false;
}
inline void searchInString(dbSynthesizedAttribute& sattr,
dbSynthesizedAttribute& sattr2)
{
if (sattr.array.size > sattr2.array.size) {
sattr.bvalue = false;
} else if (sattr2.array.size > dbBMsearchThreshold) {
int len = sattr.array.size - 2;
int n = sattr2.array.size - 1;
int i, j, k;
int shift[256];
byte* pattern = (byte*)sattr.array.base;
byte* str = (byte*)sattr2.array.base;
for (i = 0; i < (int)itemsof(shift); i++) {
shift[i] = len+1;
}
for (i = 0; i < len; i++) {
shift[pattern[i]] = len-i;
}
for (i = len; i < n; i += shift[str[i]]) {
j = len;
k = i;
while (pattern[j] == str[k]) {
k -= 1;
if (--j < 0) {
sattr.bvalue = true;
return;
}
}
}
sattr.bvalue = false;
} else {
sattr.bvalue = strstr(sattr2.array.base, sattr.array.base) != NULL;
}
}
inline db_int8 powerIntInt(db_int8 x, db_int8 y)
{
db_int8 res = 1;
if (y < 0) {
x = 1/x;
y = -y;
}
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 dbvmLoadRectangle:
execute(expr->operand[0], iattr, sattr);
sattr.rvalue = *(rectangle*)(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 dbvmLoadSelfRectangle:
sattr.rvalue = *(rectangle*)(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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -