📄 localcli.cpp
字号:
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_datetime:
*(cli_time_t*)dst = (cli_time_t)*(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::tpRectangle:
if (cb->var_type == cli_rectangle) {
*(cli_rectangle_t*)dst = *(cli_rectangle_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, cb->user_data);
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, cb->user_data);
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, bool insert)
{
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_datetime:
*(bool*)dst = *(cli_time_t*)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_datetime:
*(int1*)dst = (int1)*(cli_time_t*)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_datetime:
*(int2*)dst = (int2)*(cli_time_t*)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
if (insert) {
*(int4*)dst = cb->field->defTable->autoincrementCount+1;
}
#endif
continue;
case cli_int4:
*(int4*)dst = *(cli_int4_t*)src;
continue;
case cli_int8:
*(int4*)dst = (int4)*(db_int8*)src;
continue;
case cli_datetime:
*(int4*)dst = (int4)*(cli_time_t*)src;
continue;
case cli_real4:
*(int4*)dst = (int4)*(cli_real4_t*)src;
continue;
case cli_real8:
*(int4*)dst = (int4)*(cli_real8_t*)src;
continue;
}
break;
case dbField::tpInt8:
switch (cb->var_type) {
case cli_bool:
*(db_int8*)dst = *(cli_bool_t*)src ? 1 : 0;
continue;
case cli_int1:
*(db_int8*)dst = *(cli_int1_t*)src;
continue;
case cli_int2:
*(db_int8*)dst = *(cli_int2_t*)src;
continue;
case cli_int4:
*(db_int8*)dst = *(cli_int4_t*)src;
continue;
case cli_int8:
*(db_int8*)dst = *(db_int8*)src;
continue;
case cli_datetime:
*(db_int8*)dst = (db_int8)*(cli_time_t*)src;
continue;
case cli_real4:
*(db_int8*)dst = (db_int8)*(cli_real4_t*)src;
continue;
case cli_real8:
*(db_int8*)dst = (db_int8)*(cli_real8_t*)src;
continue;
}
break;
case dbField::tpReal4:
switch (cb->var_type) {
case cli_bool:
*(real4*)dst = (real4)(*(cli_bool_t*)src ? 1 : 0);
continue;
case cli_int1:
*(real4*)dst = *(cli_int1_t*)src;
continue;
case cli_int2:
*(real4*)dst = *(cli_int2_t*)src;
continue;
case cli_int4:
*(real4*)dst = (real4)*(cli_int4_t*)src;
continue;
case cli_int8:
*(real4*)dst = (real4)*(db_int8*)src;
continue;
case cli_datetime:
*(real4*)dst = (real4)*(cli_time_t*)src;
continue;
case cli_real4:
*(real4*)dst = *(cli_real4_t*)src;
continue;
case cli_real8:
*(real4*)dst = (real4)*(cli_real8_t*)src;
continue;
}
break;
case dbField::tpReal8:
switch (cb->var_type) {
case cli_bool:
*(real8*)dst = *(cli_bool_t*)src ? 1 : 0;
continue;
case cli_int1:
*(real8*)dst = *(cli_int1_t*)src;
continue;
case cli_int2:
*(real8*)dst = *(cli_int2_t*)src;
continue;
case cli_int4:
*(real8*)dst = *(cli_int4_t*)src;
continue;
case cli_int8:
*(real8*)dst = (real8)*(db_int8*)src;
continue;
case cli_datetime:
*(real8*)dst = (real8)*(cli_time_t*)src;
continue;
case cli_real4:
*(real8*)dst = *(cli_real4_t*)src;
continue;
case cli_real8:
*(real8*)dst = *(cli_real8_t*)src;
continue;
}
break;
case dbField::tpReference:
if (cb->var_type == cli_oid) {
*(oid_t*)dst = *(cli_oid_t*)src;
continue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -