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

📄 ctest.c

📁 全新的纯内存式实时数据库
💻 C
字号:
/******************************************************************* *                                                                 * *  ctest.c                                                      * *                                                                 * *  This file is a part of the eXtremeDB source code               * *  Copyright (c) 2001-2007 McObject LLC                           *  *  All Rights Reserved                                            * *                                                                 * *******************************************************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include "mcoapic.h"#include "ctestdb.h"#ifndef MCO_PLATFORM_X64#define PAGE_SIZE       128#else#define PAGE_SIZE       256#endif#define DATABASE_SIZE   4*1024*1024#define MAP_ADDRESS     (void*)0x20000000;#define DATABASE_NAME   "ctestdb"#define ALLOC_QUANTUM   1024*1024#define ALLOC_RETAIN    8*1024*1024 #define MAX_COLUMNS     8#define MAX_PERSON_NAME 64static void extremedb_error_handler(int error_code) {    fprintf(stderr, "eXtremeDB error %d\n", error_code);    exit(1);}static void mcosql_error_handler(status_t status) {    fprintf(stderr, "McoSQL error %d\n", status);    exit(1);}static void check_extremedb_status(MCO_RET ret) {    if (ret != MCO_S_OK) {        extremedb_error_handler(ret);    }}static void check_mcosql_status(status_t status) {    if (status != SQL_OK) {        mcosql_error_handler(status);    }}void do_test(database_t db);int main(){    void* malloc_addr = NULL;    void* start_addr = NULL;    mco_runtime_info_t info;    database_t engine;    mco_db_h   dbh;    mco_get_runtime_info(&info);    if (info.mco_shm_supported) {        start_addr = MAP_ADDRESS;    } else {        start_addr = malloc_addr = malloc(DATABASE_SIZE);        if (start_addr == NULL) {            extremedb_error_handler(MCO_E_NOMEM);        }   }        /* set fatal error handler */    mco_error_set_handler(extremedb_error_handler);        /* start db engine */    check_extremedb_status(mco_runtime_start());        /* Create a database, using first memory segment */    check_extremedb_status(mco_db_open(DATABASE_NAME, ctestdb_get_dictionary(),                            start_addr, DATABASE_SIZE, PAGE_SIZE));            /* connect to the database, obtain a database handle */    check_extremedb_status(mco_db_connect(DATABASE_NAME, &dbh));     /* Set memory allocator */    mcosql_initialize_dynamic_memory_manager(&malloc, &free, ALLOC_QUANTUM, ALLOC_RETAIN);    /* Initialize eXtremeDB SQL mapper */    check_mcosql_status(mcoapi_initialize(dbh, ctestdb_get_dictionary()));    /* Open SQL engine */    check_mcosql_status(mcosql_open(&engine));     /* Work with database */    do_test(engine);    /* Close SQL engine */    check_mcosql_status(mcosql_close(engine));          /* Close eXtremeDB database */    check_extremedb_status(mco_db_close(DATABASE_NAME));    /* free the memory */    if (malloc_addr != NULL) {         free(malloc_addr);    }        /* shutdown database engine */    check_extremedb_status(mco_runtime_stop());        return 0;}int get_person_id(database_t db, char const* name, int64_t* id) {     data_source_t data_source;    cursor_t      cursor;    status_t      status;    record_t      record;        int           found = 0;    check_mcosql_status(mcosql_execute_query(db, NULL, &data_source,                                                "select autoid from Person where name=%s", name));    check_mcosql_status(mcosql_get_cursor(data_source, &cursor));    status = mcosql_cursor_move_next(cursor, &record);    if (status == SQL_OK) {         type_t type;        void* value;        check_mcosql_status(mcosql_get_column_value(record, 0, &type, &value));        check_mcosql_status(mcosql_get_record_id(value, id));        found = 1;    } else if (status != NO_MORE_ELEMENTS) {        mcosql_error_handler(status);    }    check_mcosql_status(mcosql_release_query_result(data_source));        return found;}int add_person(database_t db, char const* name, char const* address, char const* position, uint4 salary, float rating, char const* manager_name){    int64_t manager_id = 0;    if (manager_name != NULL) {        if (!get_person_id(db, manager_name, &manager_id)) {             fprintf(stderr, "No such person '%s'\n", manager_name);            return 0;        }    }    check_mcosql_status(mcosql_execute_statement(db, NULL, NULL,        "insert into Person (name,address,position,salary,rating,manager) values (%s,%s,%s,%u,%f,%p)",        name, address, position, salary, rating, &manager_id));    return 1;}int get_person_name(database_t db, char* buf, size_t buf_size, int64_t* id) {    data_source_t     data_source;    cursor_t          cursor;    status_t          status;    record_t          record;    type_t            type;    char*             name;    int               found = 0;     check_mcosql_status(mcosql_execute_query(db, NULL, &data_source,         "select name from Person where autoid=%p", id));    check_mcosql_status(mcosql_get_cursor(data_source, &cursor));    if ((status = mcosql_cursor_move_next(cursor, &record)) == SQL_OK) {         check_mcosql_status(mcosql_get_column_value(record, 0, &type, &name));         strncpy(buf, name, buf_size);         found = 1;    } else if (status != NO_MORE_ELEMENTS) {        mcosql_error_handler(status);    }    check_mcosql_status(mcosql_release_query_result(data_source));    return found;}void print_value(database_t db, int type, void* value) {    char buf[MAX_PERSON_NAME];    switch (type) {      case CT_NULL:        printf("null");        break;      case CT_BOOL:        printf(*(char*)value ? "true" : "false");        break;      case CT_UINT1:        printf("%u", *(uint1*)value);        break;      case CT_UINT2:        printf("%u", *(uint2*)value);        break;      case CT_UINT4:        printf("%u", *(uint4*)value);        break;      case CT_UINT8:        printf("%" INT8_FORMAT "u", *(uint64_t*)value);        break;      case CT_INT1:        printf("%d", *(int1*)value);        break;      case CT_INT2:        printf("%d", *(int2*)value);        break;      case CT_INT4:        printf("%d", *(int4*)value);        break;      case CT_INT8:        printf("%" INT8_FORMAT "d", *(int64_t*)value);        break;      case CT_REAL4:        printf("%.1f", *(float*)value);        break;      case CT_REAL8:        printf("%.1f", *(double*)value);        break;      case CT_STRING:        printf("%s", (char*)value);        break;      case CT_REFERENCE:      {           int64_t id;          mcosql_get_record_id(value, &id);          get_person_name(db, buf, sizeof(buf), &id);          printf("%s", buf);          break;                }      default:        printf("???");    }}int find_persons(database_t db, char* name_pattern) {    data_source_t     data_source;    cursor_t          cursor;    status_t          status;    record_t          record;    column_iterator_t iterator;    int               i, j, n;    type_t            type;    char*             name;    void*             value;    check_mcosql_status(mcosql_execute_query(db, NULL, &data_source,         "select name,position,salary,rating,manager,address from Person where name like %s", name_pattern));    check_mcosql_status(mcosql_get_column_iterator(data_source, &iterator));    for (i = 0; (status = mcosql_get_column_info(iterator, &type, &name)) == SQL_OK; i++) {        printf("%s\t", name);    }    if (status != NO_MORE_ELEMENTS) {        mcosql_error_handler(status);    }    printf("\n-------------------------------------------------------\n");    check_mcosql_status(mcosql_get_cursor(data_source, &cursor));    for (n = 0; (status = mcosql_cursor_move_next(cursor, &record)) == SQL_OK; n++) {        for (j = 0; j < i; j++) {             check_mcosql_status(mcosql_get_column_value(record, j, &type, &value));            print_value(db, type, value);            printf("\t");        }        printf("\n");    }    if (status != NO_MORE_ELEMENTS) {        mcosql_error_handler(status);    }    printf("-------------------------------------------------------\n");    check_mcosql_status(mcosql_release_query_result(data_source));    return n;}    int get_subordinates(database_t db, char const* name){    data_source_t data_source;    cursor_t      cursor;    status_t      status;    record_t      record;    int64_t       id;    type_t        type;    void*         value;    int           n;    if (get_person_id(db, name, &id)) {         check_mcosql_status(mcosql_execute_query(db, NULL, &data_source,                                                    "select name from Person where manager=%p", &id));        check_mcosql_status(mcosql_get_cursor(data_source, &cursor));        for (n = 0; (status = mcosql_cursor_move_next(cursor, &record)) == SQL_OK; n++) {            check_mcosql_status(mcosql_get_column_value(record, 0, &type, &value));            printf("%d. %s\n", n+1, (char*)value);        }        if (status != NO_MORE_ELEMENTS) {            mcosql_error_handler(status);        }        check_mcosql_status(mcosql_release_query_result(data_source));        return n;    } else {         fprintf(stderr, "No such person '%s'\n", name);        return 0;    }}int update_person(database_t db, char const* name, uint4 salary, float rating){    int rc;    check_mcosql_status(mcosql_execute_statement(db, NULL, &rc,                                                   "update Person set salary=%u, rating=%f where name=%s",                                                   salary, rating, name));    if (rc != 1) {         fprintf(stderr, "No such person '%s'\n", name);    }    return rc;}        void delete_all_persons(database_t db){    check_mcosql_status(mcosql_execute_statement(db, NULL, NULL, "delete from Person"));}void do_test(database_t db){    add_person(db, "John Smith", "1 Guildhall St., Cambridge CB2 3NH, UK", "Team leader", 75000, 80.3f, NULL);    add_person(db, "Joe Cooker", "Outlook drive, 15/3", "Programmer", 60000, 70.2f, "John Smith");    add_person(db, "Peter Jones", "22525 SE 64th Place Suite 302", "Programmer", 50000, 60.5f, "John Smith");        find_persons(db, "John Smith");    find_persons(db, "Jo%");    find_persons(db, "%Jone%");    get_subordinates(db, "John Smith");    update_person(db, "Peter Jones", 60000, 65.7f);    find_persons(db, "%");    delete_all_persons(db);    printf("Test successfully passed!\n");}

⌨️ 快捷键说明

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