📄 ctest.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 + -