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

📄 shmdemo.c

📁 eXtremeDB数据库在Linux平台下的使用源码。内含多个示例程序
💻 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 + -