📄 shmdemo.c
字号:
/***************************************************************** * * * Copyright (c) 2001-2007 McObject LLC. All Right Reserved. * * * *****************************************************************/#include <ctype.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include "shmdb.h"const char * dbname = "demoShmDb";const int SEGSZ = 1024 * 1024 * 10; // 10M#ifndef MCO_PLATFORM_X64static const int PAGESIZE = 96;#elsestatic const int PAGESIZE = 192;#endifconst int MAP_ADDRESS = 0x20000000;int test_rc = MCO_S_OK;void SH(void) { char text[] = { "\nThis sample demonstrates eXtremeDB shared memory interfaces\n" }; char text1[] = { "Copyright (c) 2001-2007 McObject LLC. All Right Reserved.\n\n" }; printf("%s\neXtremeDB runtime version %d.%d, build %d\n%s\n\nPress Enter to start", text, MCO_COMP_VER_MAJOR, MCO_COMP_VER_MINOR, MCO_COMP_BUILD_NUM,text1); getchar();}static int askNumber(const char *prompt) { char buf[300]; printf("\n%s ", prompt); fgets(buf, sizeof (buf), stdin); if(isdigit(buf[0])) return atoi(buf); return -1;}static int hex2num(const char *s) { unsigned int a = 0; while(*s) { int n; if( *s >= '0' && *s <= '9' ) n = *s - '0'; else if( *s >='a' && *s <= 'f') n = *s - 'a' + 10; else if( *s >='A' && *s <= 'F') n = *s - 'A' + 10; else return a; a = (a << 4) | n; s++; } return a;}static int askHex(const char *prompt) { char buf[300]; printf("\n%s ", prompt); fgets(buf, sizeof (buf), stdin); return hex2num(buf);}static void insertRec(mco_db_h db) { MyClass c; MCO_RET rc; mco_trans_h t; int id; char str1[100], str2[100]; id = askNumber("Enter new record's id:"); mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); MyClass_new(t, &c); sprintf(str1,"String1: %d", id); sprintf(str2,"String2: %d", id); MyClass_id_put(&c,(uint4)id); MyClass_str1_put(&c, str1, (uint2)strlen(str1) ); MyClass_str2_put(&c, str2, (uint2)strlen(str2) ); rc = mco_trans_commit(t); if(rc==MCO_S_OK) printf("\ninsert done for %d (%s, %s)\n",(int)id,str1,str2); else printf("\ninsert failed (%d) for %d (%s, %s)\n",rc,(int)id,str1,str2); if (test_rc==MCO_S_OK) test_rc=rc;}static void deleteRec(mco_db_h db) { MyClass c; MCO_RET rc; mco_trans_h t; int id; char str1[100]= {0} , str2[100]= {0}; id = askNumber("deleting record, Enter record's id:"); mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); rc = MyClass_pkey_find(t, (uint4)id, &c); if(rc != MCO_S_OK) { printf("\nRecord with id = %d not found\n", (int)id); mco_trans_rollback(t); return; } MyClass_str1_get(&c,str1,(uint2)sizeof(str1),0); MyClass_str2_get(&c,str2,(uint2)sizeof(str2) ); rc = MyClass_delete(&c); if(rc == MCO_S_OK) rc = mco_trans_commit(t); else mco_trans_rollback(t); if(rc==MCO_S_OK) printf("\ndelete done for %d (%s, %s)\n",id,str1,str2); else printf("\ndelete failed (%d) for %d (%s, %s)\n",rc,id,str1,str2); if (test_rc==MCO_S_OK) test_rc=rc;}static void searchRec(mco_db_h db) { MyClass c; MCO_RET rc; mco_trans_h t; int id; char str1[100]= {0} , str2[100]= {0}; id = askNumber("searching record, Enter record's id:"); mco_trans_start( db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t ); rc = MyClass_pkey_find(t, (uint4)id, &c); if(rc != MCO_S_OK) { printf("\nRecord with id = %d not found\n", id); mco_trans_rollback(t); if (test_rc==MCO_S_OK) test_rc=-1; return; } MyClass_str1_get(&c,str1,(uint2)sizeof(str1),0); MyClass_str2_get(&c,str2,(uint2)sizeof(str2) ); mco_trans_rollback(t); printf("\nrecord found: %d (%s, %s)\n",id,str1,str2);}static void listRecs(mco_db_h db) { MyClass c; MCO_RET rc; mco_trans_h t; uint4 id; char str1[100]= {0} , str2[100]= {0}; mco_cursor_t csr; mco_trans_start( db, MCO_READ_ONLY, MCO_TRANS_FOREGROUND, &t ); MyClass_pkey_index_cursor( t, & csr ); rc = mco_cursor_first(t, &csr); printf("\n----------- All records of type MyClass: -------- \n" ); for( ; rc == MCO_S_OK; rc = mco_cursor_next(t, &csr) ) { rc = MyClass_from_cursor(t, &csr, &c); if(rc) { printf("\nUnexpected error %d\n",rc); break; } MyClass_id_get(&c, &id); MyClass_str1_get(&c,str1,(uint2)sizeof(str1),0); MyClass_str2_get(&c,str2,(uint2)sizeof(str2) ); printf("record: %7d (%s, %s)\n",(int)id,str1,str2); } printf( "------------------------ end of list ------------ \n"); mco_trans_rollback(t);}static void menu( mco_db_h db ) { char ibuf[300]; int ch; // menu choice int skip = 0; for(;;) { if (!skip) printf("\n----------------------------\nMenu:\n" "0: exit\n" "1: insert a record\n" "2: delete a record\n" "3: search a record\n" "4: list records\n" "5: print db statistics\n" "$ " ); ibuf[0]=0; fgets(ibuf, sizeof (ibuf), stdin); if( (skip=! isdigit( ibuf[0] )) ) continue; ch = atoi(ibuf); switch(ch) { default: break; case 0: return; case 1: insertRec(db); break; case 2: deleteRec(db); break; case 3: searchRec(db); break; case 4: listRecs(db); break; case 5: { uint4 freepg, totalpg, nused; mco_db_free_pages (db, &freepg); mco_db_total_pages (db, &totalpg); nused = totalpg - freepg; printf("\nMemory:\n" " %dKb available, %dKb used\n", (int)(freepg * PAGESIZE / 1024), (int)(nused * PAGESIZE / 1024) ); } break; } } // end for}static void errhandler( int n ) { printf( "\neXtremeDB fatal error: %d", n ); getchar(); exit( -1 );}int main( int na, char **aa) { MCO_RET rc; mco_db_h db; void * start_mem = 0; char prompt[300], buf[100]; mco_runtime_info_t info; SH(); mco_get_runtime_info( &info); if ( !info.mco_shm_supported ) { printf("\nThis program requires shared memory database runtime\n"); exit(1); }; mco_runtime_start(); /* set fatal error handler */ mco_error_set_handler( &errhandler ); printf("\nWould you like to create a new database [Y] or attach [N] -- [Y/N] ?" ); fgets(buf, sizeof (buf), stdin); if(buf[0] == 'y' || buf[0] == 'Y') { sprintf(prompt,"Enter hint address (default is %x):", (int) MAP_ADDRESS ); start_mem = (void*) askHex(prompt); if( start_mem == 0 ) start_mem = (void*) MAP_ADDRESS; printf("\nSHM Map address is %x\n", (int) start_mem ); rc = mco_db_open( dbname, shmdb_get_dictionary(), start_mem, SEGSZ, PAGESIZE ); if ( rc ) { printf("\nCould not create instance: %d\n", rc); exit( 1 ); } } rc = mco_db_connect( dbname, &db ); if ( rc ) { printf("\nCould not attach to instance: %d\n", rc); exit( 1 ); } menu( db ); // shutdown rc = mco_db_disconnect( db ); rc = mco_db_close( dbname ); mco_runtime_stop(); return test_rc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -