localcli.cpp
来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· C++ 代码 · 共 1,971 行 · 第 1/4 页
CPP
1,971 行
} if (pb->var_ptr == NULL) { return cli_unbound_parameter; } switch(pb->var_type) { case cli_oid: stmt->query.append(dbQueryElement::qVarReference, pb->var_ptr); break; case cli_bool: stmt->query.append(dbQueryElement::qVarBool, pb->var_ptr); break; case cli_int1: stmt->query.append(dbQueryElement::qVarInt1, pb->var_ptr); break; case cli_int2: stmt->query.append(dbQueryElement::qVarInt2, pb->var_ptr); break; case cli_int4: stmt->query.append(dbQueryElement::qVarInt4, pb->var_ptr); break; case cli_int8: stmt->query.append(dbQueryElement::qVarInt8, pb->var_ptr); break; case cli_real4: stmt->query.append(dbQueryElement::qVarReal4, pb->var_ptr); break; case cli_real8: stmt->query.append(dbQueryElement::qVarReal8, pb->var_ptr); break; case cli_asciiz: stmt->query.append(dbQueryElement::qVarString, pb->var_ptr); break; case cli_pasciiz: stmt->query.append(dbQueryElement::qVarStringPtr, pb->var_ptr); break; case cli_array_of_oid: stmt->query.append(dbQueryElement::qVarArrayOfRef, pb->var_ptr); break; default: return cli_unsupported_type; } while (isalnum(*++p)); q = p; pb = pb->next; } else { p += 1; } } if (p != q) { stmt->query.append(dbQueryElement::qExpression, q); } stmt->prepared = true; } stmt->cursor.setTable(stmt->table); stmt->cursor.reset(); return stmt->cursor.select(stmt->query, for_update ? dbCursorForUpdate : dbCursorViewOnly);}int dbCLI::fetch_columns(statement_desc* stmt){ stmt->first_fetch = false; if (stmt->cursor.isEmpty()) { return cli_not_found; } stmt->updated = false; char* data = (char*)stmt->session->db->getRow(stmt->cursor.currId); for (column_binding* cb = stmt->columns; cb != NULL; cb = cb->next) { dbFieldDescriptor* fd = cb->field; char* src = data + fd->dbsOffs; char* dst = (char*)cb->var_ptr; // Allow fetching of structures with one component if (fd->type == dbField::tpStructure && fd->components->next == NULL) { fd = fd->components; } switch (fd->type) { case dbField::tpBool: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(bool*)src; continue; case cli_int1: *(cli_int1_t*)dst = *(bool*)src ? 1 : 0; continue; case cli_int2: *(cli_int2_t*)dst = *(bool*)src ? 1 : 0; continue; case cli_int4: *(cli_int4_t*)dst = *(bool*)src ? 1 : 0; continue; case cli_int8: *(db_int8*)dst = *(bool*)src ? 1 : 0; continue; case cli_real4: *(cli_real4_t*)dst = *(bool*)src ? 1 : 0; continue; case cli_real8: *(cli_real8_t*)dst = *(bool*)src ? 1 : 0; continue; } break; case dbField::tpInt1: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(int1*)src != 0; continue; case cli_int1: *(cli_int1_t*)dst = *(int1*)src; continue; case cli_int2: *(cli_int2_t*)dst = *(int1*)src; continue; case cli_int4: *(cli_int4_t*)dst = *(int1*)src; continue; case cli_int8: *(db_int8*)dst = *(int1*)src; continue; case cli_real4: *(cli_real4_t*)dst = *(int1*)src; continue; case cli_real8: *(cli_real8_t*)dst = *(int1*)src; continue; } break; case dbField::tpInt2: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(int2*)src != 0; continue; case cli_int1: *(cli_int1_t*)dst = (int1)*(int2*)src; continue; case cli_int2: *(cli_int2_t*)dst = *(int2*)src; continue; case cli_int4: *(cli_int4_t*)dst = *(int2*)src; continue; case cli_int8: *(db_int8*)dst = *(int2*)src; continue; case cli_real4: *(cli_real4_t*)dst = *(int2*)src; continue; case cli_real8: *(cli_real8_t*)dst = *(int2*)src; continue; } break; case dbField::tpInt4: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(int4*)src != 0; continue; case cli_int1: *(cli_int1_t*)dst = (cli_int1_t)*(int4*)src; continue; case cli_int2: *(cli_int2_t*)dst = (cli_int2_t)*(int4*)src; continue; case cli_int4: case cli_autoincrement: *(cli_int4_t*)dst = *(int4*)src; continue; case cli_int8: *(db_int8*)dst = *(int4*)src; continue; case cli_real4: *(cli_real4_t*)dst = *(int4*)src; continue; case cli_real8: *(cli_real8_t*)dst = *(int4*)src; continue; } break; case dbField::tpInt8: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(db_int8*)src != 0; continue; case cli_int1: *(cli_int1_t*)dst = (cli_int1_t)*(db_int8*)src; continue; case cli_int2: *(cli_int2_t*)dst = (cli_int2_t)*(db_int8*)src; continue; case cli_int4: *(cli_int4_t*)dst = (cli_int4_t)*(db_int8*)src; continue; case cli_int8: *(db_int8*)dst = *(db_int8*)src; continue; case cli_real4: *(cli_real4_t*)dst = *(db_int8*)src; continue; case cli_real8: *(cli_real8_t*)dst = *(db_int8*)src; continue; } break; case dbField::tpReal4: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(real4*)src != 0; continue; case cli_int1: *(cli_int1_t*)dst = (cli_int1_t)*(real4*)src; continue; case cli_int2: *(cli_int2_t*)dst = (cli_int2_t)*(real4*)src; continue; case cli_int4: *(cli_int4_t*)dst = (cli_int4_t)*(real4*)src; continue; case cli_int8: *(db_int8*)dst = (db_int8)*(real4*)src; continue; case cli_real4: *(cli_real4_t*)dst = *(real4*)src; continue; case cli_real8: *(cli_real8_t*)dst = *(real4*)src; continue; } break; case dbField::tpReal8: switch (cb->var_type) { case cli_bool: *(cli_bool_t*)dst = *(real8*)src != 0; continue; case cli_int1: *(cli_int1_t*)dst = (cli_int1_t)*(real8*)src; continue; case cli_int2: *(cli_int2_t*)dst = (cli_int2_t)*(real8*)src; continue; case cli_int4: *(cli_int4_t*)dst = (cli_int4_t)*(real8*)src; continue; case cli_int8: *(db_int8*)dst = (db_int8)*(real8*)src; continue; case cli_real4: *(cli_real4_t*)dst = (real4)*(real8*)src; continue; case cli_real8: *(cli_real8_t*)dst = *(real8*)src; continue; } break; case dbField::tpReference: if (cb->var_type == cli_oid) { *(cli_oid_t*)dst = *(oid_t*)src; continue; } break; case dbField::tpString: if (cb->var_type == cli_asciiz || cb->var_type == cli_pasciiz) { if (cb->var_type == cli_pasciiz) { dst = *(char**)dst; } dbVarying* v = (dbVarying*)src; int size = v->size; if (cb->set_fnc != NULL) { dst = (char*)cb->set_fnc(cli_asciiz, dst, size, cb->name, stmt->id, data + v->offs); if (dst != NULL) { memcpy(dst, data + v->offs, size); } } else { int n = size; if (cb->var_len != NULL) { if (n > *cb->var_len) { n = *cb->var_len; } *cb->var_len = size; } memcpy(dst, data + v->offs, n); } continue; } break; case dbField::tpArray: if (cb->var_type >= cli_array_of_oid && cb->var_type <= cli_array_of_string) { dbVarying* v = (dbVarying*)src; int n = v->size; src = data + v->offs; if (cb->set_fnc != NULL) { dst = (char*)cb->set_fnc(cb->var_type, dst, n, cb->name, stmt->id, src); if (dst == NULL) { continue; } } else { int size = n; if (cb->var_len != NULL) { if (n > *cb->var_len) { n = *cb->var_len; } *cb->var_len = size; } } switch (fd->components->type) { case dbField::tpBool: if (cb->var_type == cli_array_of_bool) { cli_bool_t* dst_elem = (cli_bool_t*)dst; bool* src_elem = (bool*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpInt1: if (cb->var_type == cli_array_of_int1) { cli_int1_t* dst_elem = (cli_int1_t*)dst; int1* src_elem = (int1*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpInt2: if (cb->var_type == cli_array_of_int2) { cli_int2_t* dst_elem = (cli_int2_t*)dst; int2* src_elem = (int2*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpInt4: if (cb->var_type == cli_array_of_int4) { cli_int4_t* dst_elem = (cli_int4_t*)dst; int4* src_elem = (int4*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpInt8: if (cb->var_type == cli_array_of_int8) { cli_int8_t* dst_elem = (cli_int8_t*)dst; db_int8* src_elem = (db_int8*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpReal4: if (cb->var_type == cli_array_of_real4) { cli_real4_t* dst_elem = (cli_real4_t*)dst; real4* src_elem = (real4*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpReal8: if (cb->var_type == cli_array_of_real8) { cli_real8_t* dst_elem = (cli_real8_t*)dst; real8* src_elem = (real8*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpReference: if (cb->var_type == cli_array_of_oid) { cli_oid_t* dst_elem = (cli_oid_t*)dst; oid_t* src_elem = (oid_t*)src; while (--n >= 0) *dst_elem++ = *src_elem++; continue; } break; case dbField::tpString: if (cb->var_type == cli_array_of_string) { char** dst_elem = (char**)dst; dbVarying* src_elem = (dbVarying*)src; while (--n >= 0) { *dst_elem++ = (char*)((char*)src_elem + src_elem->offs); src_elem += 1; } continue; } } } } return cli_unsupported_type; } return cli_ok;}int dbCLI::store_columns(char* data, statement_desc* stmt){ for (column_binding* cb = stmt->columns; cb != NULL; cb = cb->next) { dbFieldDescriptor* fd = cb->field; char* dst = data + fd->appOffs; char* src = (char*)cb->var_ptr; // Allow storing to structures with one component if (fd->type == dbField::tpStructure && fd->components->next == NULL) { fd = fd->components; } switch (fd->type) { case dbField::tpBool: switch (cb->var_type) { case cli_bool: *(bool*)dst = *(cli_bool_t*)src; continue; case cli_int1: *(bool*)dst = *(cli_int1_t*)src != 0; continue; case cli_int2: *(bool*)dst = *(cli_int2_t*)src != 0; continue; case cli_int4: *(bool*)dst = *(cli_int4_t*)src != 0; continue; case cli_int8: *(bool*)dst = *(db_int8*)src != 0; continue; case cli_real4: *(bool*)dst = *(cli_real4_t*)src != 0; continue; case cli_real8: *(bool*)dst = *(cli_real8_t*)src != 0; continue; } break; case dbField::tpInt1: switch (cb->var_type) { case cli_bool: *(int1*)dst = *(cli_bool_t*)src ? 1 : 0; continue; case cli_int1: *(int1*)dst = *(cli_int1_t*)src; continue; case cli_int2: *(int1*)dst = (int1)*(cli_int2_t*)src; continue; case cli_int4: *(int1*)dst = (int1)*(cli_int4_t*)src; continue; case cli_int8: *(int1*)dst = (int1)*(db_int8*)src; continue; case cli_real4: *(int1*)dst = (int1)*(cli_real4_t*)src; continue; case cli_real8: *(int1*)dst = (int1)*(cli_real8_t*)src; continue; } break; case dbField::tpInt2: switch (cb->var_type) { case cli_bool: *(int2*)dst = *(cli_bool_t*)src ? 1 : 0; continue; case cli_int1: *(int2*)dst = *(cli_int1_t*)src; continue; case cli_int2: *(int2*)dst = *(cli_int2_t*)src; continue; case cli_int4: *(int2*)dst = (int2)*(cli_int4_t*)src; continue; case cli_int8: *(int2*)dst = (int2)*(db_int8*)src; continue; case cli_real4: *(int2*)dst = (int2)*(cli_real4_t*)src; continue; case cli_real8: *(int2*)dst = (int2)*(cli_real8_t*)src; continue; } break; case dbField::tpInt4: switch (cb->var_type) { case cli_bool: *(int4*)dst = *(cli_bool_t*)src ? 1 : 0; continue; case cli_int1: *(int4*)dst = *(cli_int1_t*)src; continue; case cli_int2: *(int4*)dst = *(cli_int2_t*)src; continue; case cli_autoincrement:#ifdef AUTOINCREMENT_SUPPORT *(int4*)dst = cb->field->defTable->autoincrementCount;#endif continue;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?