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

📄 localcli.h

📁 fastdb-2.92的源码
💻 H
字号:
//-< LOCALCLI.H >----------------------------------------------------*--------*// FastDB                    Version 1.0         (c) 1999  GARRET    *     ?  *// (Main Memory Database Management System)                          *   /\|  *//                                                                   *  /  \  *//                          Created:     20-Jun-2002  K.A. Knizhnik  * / [] \ *//                          Last update: 20-Jun-2002  K.A. Knizhnik  * GARRET *//-------------------------------------------------------------------*--------*// Header file for local C interface to database//-------------------------------------------------------------------*--------*#include "fastdb.h"#include "compiler.h"#include "cli.h"#include "cliproto.h"#include "array.h"inline int map_type(dbFieldDescriptor* fd) {     return (fd->type < dbField::tpArray)         ? fd2cli_type_mapping[fd->type]         : (fd->type == dbField::tpArray && fd->components->type < dbField::tpArray)          ? cli_array_of_oid + fd2cli_type_mapping[fd->components->type]           : cli_unknown;}struct parameter_binding {    parameter_binding* next;    char*   name;    int     var_type;    int     var_len;    void*   var_ptr;};struct column_binding {    column_binding*    next;    dbFieldDescriptor* field;    char*              name;    int                var_type;    int*               var_len;    void*              var_ptr;    cli_column_get_ex  get_fnc;    cli_column_set_ex  set_fnc;};struct session_desc;struct statement_desc {    int                id;    statement_desc*    next;    dbQuery            query;    dbAnyCursor        cursor;    dbTableDescriptor* table;    column_binding*    columns;    parameter_binding* params;    session_desc*      session;    bool               first_fetch;    bool               for_update;    bool               prepared;    bool               updated;    cli_oid_t          oid;    int                n_params;    int                n_columns;    int                n_autoincremented_columns;    int                param_size;    void*              record_struct;    dbSmallBuffer      sql;    statement_desc(int id, statement_desc* next)     {        this->id = id;        this->next = next;    }     statement_desc() {}};class sql_scanner {  private:    char*  p;    char*  ident;  public:    int     get();    char* current_position() {         return p;    }    char* identifier() {         return ident;    }    sql_scanner(char* sql) {        p = sql;    }};struct session_desc {    int              id;    char*            name;    session_desc*    next;    statement_desc*  stmts;    dbDatabase*      db;    dbMutex          mutex;    dbTableDescriptor* dropped_tables;    dbTableDescriptor* existed_tables;        session_desc(int id, session_desc* next) {        this->id = id;        this->next = next;    }    session_desc() {}};template<class T>class fixed_size_object_allocator {   protected:    T*          free_chain;    dbMutex     mutex;  public:    T* allocate() {        dbCriticalSection cs(mutex);        T* obj = free_chain;        if (obj == NULL) {            obj = new T();        } else {             free_chain = obj->next;        }        return obj;    }    void free(T* desc) {        dbCriticalSection cs(mutex);        desc->next = free_chain;        free_chain = desc;    }    fixed_size_object_allocator() {        free_chain = NULL;    }    ~fixed_size_object_allocator() {         T *obj, *next;        for (obj = free_chain; obj != NULL; obj = next) {             next = obj->next;            delete obj;        }    }};template<class T>class descriptor_table : public fixed_size_object_allocator<T> {  protected:    T**         table;    int         descriptor_table_size;  public:    descriptor_table() {        int i;        descriptor_table_size = 16;        table = new T*[descriptor_table_size];        T* next = NULL;        for (i = 0; i < descriptor_table_size; i++) {            table[i] = next = new T(i, next);        }        free_chain = next;    }    ~descriptor_table() {         delete[] table;    }    T* get(int desc) {        dbCriticalSection cs(mutex);        return (desc >= descriptor_table_size) ? (T*)0 : table[desc];    }    T* allocate() {        dbCriticalSection cs(mutex);        if (free_chain == NULL) {            int i, n;            T** desc = new T*[descriptor_table_size * 2];            memcpy(desc, table, descriptor_table_size*sizeof(T*));            delete[] table;            table = desc;            T* next = NULL;            for (i = descriptor_table_size, n = i*2; i < n; i++) {                table[i] = next = new T(i, next);            }            free_chain = next;            descriptor_table_size = n;        }        T* desc = free_chain;        free_chain = desc->next;        return desc;    }};class FASTDB_DLL_ENTRY dbCLI {   private:    fixed_size_object_allocator<column_binding> column_allocator;    fixed_size_object_allocator<parameter_binding> parameter_allocator;        descriptor_table<session_desc>   sessions;    descriptor_table<statement_desc> statements;    session_desc* active_session_list;        dbMutex sessionMutex;            static int calculate_varying_length(char const* tableName, int& nFields, cli_field_descriptor* columns);    static dbTableDescriptor* create_table_descriptor(dbDatabase*           db,                                                       oid_t                 oid,                                                       dbTable*              table,                                                       char const*           tableName,                                                       int                   nFields,                                                       int                   nColumns,                                                       cli_field_descriptor* columns);      public:    static dbCLI instance;    dbCLI() {         active_session_list = NULL;     }    int create_session(char const* databasePath,                       char const* filePath,                       unsigned    transactionCommitDelay,                        int         openAttr,                        size_t      initDatabaseSize,                       size_t      extensionQuantum,                       size_t      initIndexSize,                       size_t      fileSizeLimit);       int 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);    int create_statement(int session, char const* sql);    int bind_parameter(int         statement,                       char const* param_name,                       int         var_type,                       void*       var_ptr);    int bind_column(int         statement,                    char const* column_name,                    int         var_type,                    int*        var_len,                    void*       var_ptr);    int bind_array_column(int               statement,                          char const*       column_name,                          int               var_type,                          void*             var_ptr,                          cli_column_set_ex set,                          cli_column_get_ex get);            int fetch(int statement, int for_update);    int fetch_columns(statement_desc* stmt);    int store_columns(char* buf, statement_desc* stmt);    int insert(int statement, cli_oid_t* oid);    int update(int statement);    int freeze(int statement);    int unfreeze(int statement);    int get_first(int statement);    int get_last(int statement);    int get_next(int statement);    int get_prev(int statement);    int skip(int statement, int n);    int seek(int statement, cli_oid_t oid);    cli_oid_t get_current_oid(int statement);    int free_statement(int statement);    int free_statement(statement_desc* stmt);        int commit(int session);    int precommit(int session);    int abort(int session);    int remove(int statement);    int describe(int session, char const* table, cli_field_descriptor** fields);    int show_tables(int session, cli_table_descriptor** tables);    int match_columns(char const* table_name, statement_desc* stmt);    int create_table(int session, char const* tableName, int nColumns,                      cli_field_descriptor* columns);    int alter_table(int session, char const* tableName, int nColumns,                     cli_field_descriptor* columns);    int drop_table(int session, char const* tableName);    int alter_index(int session, char const* tableName, char const* fieldName, int newFlags);    cli_error_handler set_error_handler(int session, cli_error_handler new_handler);    int attach(int session);    int detach(int session, int detach_mode);    int get_database_state(int session, cli_database_monitor* monitor);    int close(int session);    int prepare_query(int session, char const* query);    int execute_query(int statement, int for_update, void* record_struct, va_list params);    int insert_struct(int session, char const* table_name, void* record_struct, cli_oid_t* oid);    static int create_table(dbDatabase* db, char const* tableName, int nColumns,                             cli_field_descriptor* columns);    static int alter_table(dbDatabase* db, char const* tableName, int nColumns,                             cli_field_descriptor* columns);    static int alter_index(dbDatabase* db, char const* tableName, char const* fieldName, int newFlags);};

⌨️ 快捷键说明

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