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

📄 localcli.cpp

📁 最新版本!fastdb是高效的内存数据库系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            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 + -