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

📄 localcli.cpp

📁 fastdb-2.92的源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            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;              case cli_int4:                *(int4*)dst = *(cli_int4_t*)src;                continue;              case cli_int8:                *(int4*)dst = (int4)*(db_int8*)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_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_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_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;            }            break;          case dbField::tpString:            if (cb->var_type == cli_pasciiz) {                 *(char**)dst = *(char**)src;                continue;            } else if (cb->var_type == cli_asciiz) {                 if (cb->get_fnc != NULL) {                    int len;                    src = (char*)cb->get_fnc(cb->var_type, src, &len,                                              cb->name, stmt->id);                }                *(char**)dst = src;                continue;            }            break;          case dbField::tpArray:            if (cb->var_type >= cli_array_of_oid && cb->var_type <= cli_array_of_string)             {                 int size = 0;                if (cb->get_fnc != NULL) {                    src = (char*)cb->get_fnc(cb->var_type, src, &size,                                              cb->name, stmt->id);                } else {                     if (cb->var_len != NULL) {                        size = *cb->var_len;                     } else {                         return cli_incompatible_type;                    }                }                if (cb->var_type == cli_array_of_string) {                     if (fd->components->type != dbField::tpString) {                         return cli_incompatible_type;                    }                } else if ((size_t)sizeof_type[cb->var_type - cli_array_of_oid] != fd->components->appSize) {                    return cli_incompatible_type;                }                dbAnyArray::arrayAllocator((dbAnyArray*)dst, src, size);                continue;            }        }        return cli_unsupported_type;    }    return cli_ok;}int cli_insert(int statement, cli_oid_t* oid){    return dbCLI::instance.insert(statement, oid);}int dbCLI::insert(int statement, cli_oid_t* oid){    statement_desc* stmt = statements.get(statement);        if (stmt == NULL) {        return cli_bad_descriptor;    }    if (!stmt->prepared) {         sql_scanner scanner(stmt->sql.base());        if (scanner.get() != tkn_insert            || scanner.get() != tkn_into            || scanner.get() != tkn_ident)        {            return cli_bad_statement;        }        int rc = match_columns(scanner.identifier(), stmt);        if (rc != cli_ok) {            return rc;        }        stmt->prepared = true;    }    dbSmallBuffer buf(stmt->table->appSize);        char* obj = buf.base();    memset(obj, 0, stmt->table->appSize);      dbFieldDescriptor *first = stmt->table->columns, *fd = first;    do {         if (fd->appType == dbField::tpString) {             *(char**)(obj + fd->appOffs) = "";        }    } while ((fd = fd->next) != first);        int rc = store_columns(buf.base(), stmt);    if (rc != cli_ok) {         return rc;    }    dbAnyReference ref;    stmt->session->db->insertRecord(stmt->table, &ref, buf.base());    stmt->oid = ref.getOid();    if (oid != NULL) {         *oid = ref.getOid();    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -