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

📄 cli.cpp

📁 FastDb是高效的内存数据库系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
{    return cli_get(statement, cli_cmd_skip, n);}int cli_seek(int statement, cli_oid_t oid){    return cli_get(statement, cli_cmd_seek, oid);}static int send_receive(int statement, int cmd){    statement_desc* s = statements.get(statement);    if (s == NULL) {         return cli_bad_descriptor;    }    if (!s->prepared) {         return cli_not_fetched;    }    cli_request req;    req.length = sizeof(req);    req.cmd = cmd;    req.stmt_id = statement;    req.pack();    int4 response = cli_ok;    if (!s->session->sock->write(&req, sizeof req)) {         return cli_network_error;    }     if (!s->session->sock->read(&response, sizeof response)) {         return cli_network_error;    }    unpack4(response);    return response;}int cli_freeze(int statement){    return send_receive(statement, cli_cmd_freeze);}int cli_unfreeze(int statement){    return send_receive(statement, cli_cmd_unfreeze);}cli_oid_t cli_get_oid(int statement){    statement_desc* s = statements.get(statement);    if (s == NULL) {         return 0;    }    return s->oid;}static int cli_send_command(int session, int statement, int cmd){    session_desc* s = sessions.get(session);    if (s == NULL) {         return cli_bad_descriptor;    }       cli_request req;    req.length  = sizeof(cli_request);    req.cmd     = cmd;    req.stmt_id = statement;    req.pack();    if (!s->sock->write(&req, sizeof req)) {         return cli_network_error;    }    int4 response;    if (!s->sock->read(&response, sizeof response)) {         return cli_network_error;    }    unpack4(response);    return response;}int cli_free(int statement){    statement_desc* stmt = statements.get(statement);    session_desc* s = stmt->session;    if (s == NULL) {         return cli_bad_descriptor;    }       statement_desc *sp, **spp = &s->stmts;     while ((sp = *spp) != stmt) {         if (sp == NULL) {             return cli_bad_descriptor;        }        spp = &sp->next;    }    *spp = stmt->next;    stmt->deallocate();    statements.deallocate(stmt);    cli_request req;    req.length  = sizeof(cli_request);    req.cmd     = cli_cmd_free_statement;    req.stmt_id = statement;    req.pack();    if (!s->sock->write(&req, sizeof req)) {         return cli_network_error;    }    return cli_ok;}    int cli_commit(int session){    return cli_send_command(session, 0, cli_cmd_commit);}int cli_precommit(int session){    return cli_send_command(session, 0, cli_cmd_precommit);}int cli_abort(int session){    return cli_send_command(session, 0, cli_cmd_abort);}int cli_remove(int statement){    statement_desc* s = statements.get(statement);    if (s == NULL) {         return cli_bad_descriptor;    }    if (s->oid == 0) {         return cli_not_found;    }    if (!s->for_update) {         return cli_not_update_mode;    }    return cli_send_command(s->session->id, s->id, cli_cmd_remove);}int cli_remove_current(int statement){    statement_desc* s = statements.get(statement);    if (s == NULL) {         return cli_bad_descriptor;    }    if (s->oid == 0) {         return cli_not_found;    }    if (!s->for_update) {         return cli_not_update_mode;    }    return cli_send_command(s->session->id, s->id, cli_cmd_remove_current);}int cli_describe(int session, char const* table, cli_field_descriptor** fields){    int len = sizeof(cli_request) + strlen(table) + 1;    dbSmallBuffer buf(len);    cli_request* req = (cli_request*)buf.base();    req->length = len;    req->cmd    = cli_cmd_describe_table;    req->stmt_id = 0;    strcpy((char*)(req+1), table);    session_desc* s = sessions.get(session);    if (s == NULL) {        return cli_bad_descriptor;    }    req->pack();    if (!s->sock->write(buf, len)) {        return cli_network_error;    }    int4 response[2];    if (!s->sock->read(&response, sizeof response)) {        return cli_network_error;    }    unpack4(response[0]);    unpack4(response[1]);    len = response[0];    int nFields = response[1];    if (nFields == -1) {         return cli_table_not_found;    }    char* p = (char*)malloc(nFields*sizeof(cli_field_descriptor) + len);    cli_field_descriptor* fp = (cli_field_descriptor*)p;    p += nFields*sizeof(cli_field_descriptor);    if (!s->sock->read(p, len)) {        return cli_network_error;    }    *fields = fp;    for (int i = nFields; --i >= 0; fp++) {        fp->type = (enum cli_var_type)*p++;        fp->flags = *p++ & 0xFF;        fp->name = p;        p += strlen(p) + 1;        if (*p != 0) {             fp->refTableName = p;        } else {             fp->refTableName = NULL;        }        p += strlen(p) + 1;        if (*p != 0) {             fp->inverseRefFieldName = p;        } else {             fp->inverseRefFieldName = NULL;        }        p += strlen(p) + 1;    }    return nFields;}int cli_show_tables(int session, cli_table_descriptor** tables){    session_desc* s = sessions.get(session);    if (s == NULL) {        return cli_bad_descriptor;    }    cli_request req;    req.length  = sizeof(cli_request);    req.cmd     = cli_cmd_show_tables;    req.stmt_id = 0;    req.pack();    if (!s->sock->write(&req, sizeof req)) {        return cli_network_error;    }    int4 response[2];    if (!s->sock->read(&response, sizeof response)) {        return cli_network_error;    }    unpack4(response[0]);    unpack4(response[1]);    int len = response[0];    int nTables = response[1];    if (nTables == -1) {        return cli_table_not_found;    }    char* p = (char*)malloc(nTables*sizeof(cli_table_descriptor) + len);    cli_table_descriptor* fp = (cli_table_descriptor*)p;    p += nTables*sizeof(cli_table_descriptor);    if (!s->sock->read(p, len)) {        free(p);        return cli_network_error;    }    *tables = fp;    for (int i = nTables; --i >= 0; fp++) {        fp->name = (char*)p;        p += strlen((char*)p)+1;    }    return nTables;}int cli_create(char const* databaseName,               char const* filePath,                unsigned    transactionCommitDelay,                int         openAttr,                size_t      initDatabaseSize,               size_t      extensionQuantum,               size_t      initIndexSize,               size_t      fileSizeLimit){    return cli_bad_address;}static int cli_update_table(int cmd, int session, char const* tableName, int nColumns,                             cli_field_descriptor* columns){    int i;    session_desc* s = sessions.get(session);    if (s == NULL) {        return cli_bad_descriptor;    }    int size = sizeof(cli_request) + 4 + strlen(tableName)+1;    for (i = 0; i < nColumns; i++) {         size += 2 + (strlen(columns[i].name)+3);        if (columns[i].refTableName != NULL) {             size += strlen(columns[i].refTableName);        }        if (columns[i].inverseRefFieldName != NULL) {             size += strlen(columns[i].inverseRefFieldName);        }    }    dbSmallBuffer buf(size);    cli_request* req = (cli_request*)buf.base();    req->length  = size;    req->cmd     = cmd;    req->stmt_id = 0;    char* dst = (char*)(req + 1);    strcpy(dst, tableName);    dst += strlen(dst) + 1;    *dst++ = (char)nColumns;    for (i = 0; i < nColumns; i++) {         *dst++ = (char)columns[i].type;        *dst++ = (char)columns[i].flags;        strcpy(dst, columns[i].name);        dst += strlen(dst) + 1;        if (columns[i].refTableName != NULL) {             strcpy(dst, columns[i].refTableName);            dst += strlen(dst) + 1;                } else {             *dst++ = 0;        }        if (columns[i].inverseRefFieldName != NULL) {             strcpy(dst, columns[i].inverseRefFieldName);            dst += strlen(dst) + 1;        } else {             *dst++ = 0;        }    }    req->pack();    if (!s->sock->write(buf, size)) {        return cli_network_error;    }    int4 response;    if (!s->sock->read(&response, sizeof response)) {        return cli_network_error;    }    unpack4(response);    return response;}int cli_create_table(int session, char const* tableName, int nColumns,                      cli_field_descriptor* columns){    return cli_update_table(cli_cmd_create_table, session, tableName, nColumns, columns);}int cli_alter_table(int session, char const* tableName, int nColumns,                      cli_field_descriptor* columns){    return cli_update_table(cli_cmd_alter_table, session, tableName, nColumns, columns);}int cli_drop_table(int session, char const* tableName){    session_desc* s = sessions.get(session);    if (s == NULL) {        return cli_bad_descriptor;    }    int size = sizeof(cli_request) + strlen(tableName) + 1;    dbSmallBuffer buf(size);    cli_request* req = (cli_request*)buf.base();    req->length  = size;    req->cmd     = cli_cmd_drop_table;    req->stmt_id = 0;    strcpy((char*)(req + 1), tableName);    req->pack();    if (!s->sock->write(buf, size)) {        return cli_network_error;    }    int4 response;    if (!s->sock->read(&response, sizeof response)) {        return cli_network_error;    }    unpack4(response);    return response;}int cli_alter_index(int session, char const* tableName, char const* fieldName, int newFlags){    session_desc* s = sessions.get(session);    if (s == NULL) {        return cli_bad_descriptor;    }    int size = sizeof(cli_request) + 1 + strlen(tableName)+strlen(fieldName)+2;    dbSmallBuffer buf(size);    cli_request* req = (cli_request*)buf.base();    req->length  = size;    req->cmd     = cli_cmd_alter_index;    req->stmt_id = 0;    char* dst = (char*)(req + 1);    strcpy(dst, tableName);    dst += strlen(dst) + 1;    strcpy(dst, fieldName);    dst += strlen(dst) + 1;    *dst++ = newFlags;    req->pack();    if (!s->sock->write(buf, size)) {        return cli_network_error;    }    int4 response;    if (!s->sock->read(&response, sizeof response)) {        return cli_network_error;    }    unpack4(response);    return response;}cli_error_handler cli_set_error_handler(int session, cli_error_handler new_handler, void* context){    return NULL;}int cli_create_replication_node(int         nodeId,                                int         nServers,                                char*       nodeNames[],                                char const* databaseName,                                 char const* filePath,                                 int         openAttr,                                 size_t      initDatabaseSize,                                size_t      extensionQuantum,                                size_t      initIndexSize,                                size_t      fileSizeLimit){    return cli_not_implemented;}int cli_attach(int session){    return cli_not_implemented;}int cli_detach(int session, int detach_mode){    return cli_not_implemented;}void cli_free_memory(int, void* ptr){    free(ptr);}int cli_get_database_state(int session, cli_database_monitor* monitor){    return cli_not_implemented;}void cli_set_trace_function(cli_trace_function_t) { }int cli_prepare_query(int session, char* query){    return cli_not_implemented;}int cli_execute_query(int statement, int for_update, void* record_struct, ...){    return cli_not_implemented;}int cli_insert_struct(int session, char const* table_name, void* record_struct, cli_oid_t* oid){    return cli_not_implemented;}int cli_get_field_size(cli_field_descriptor* fields, int field_no){    return sizeof_type[fields[field_no].type];}int cli_get_field_offset(cli_field_descriptor* fields, int field_no){    int offs = 0;    int size = 0;    for (int i = 0; i <= field_no; i++) {         size = sizeof_type[fields[i].type];        offs = DOALIGN(offs, alignof_type[fields[i].type]);        offs += size;    }    return offs - size;}

⌨️ 快捷键说明

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