📄 xmltest.c
字号:
/*************************************************************** * * * Copyright (c) 2001-2006 McObject LLC. All Right Reserved. * * * ***************************************************************//* This samples demonstartes export of the eXtremeDB data to XML * The following xml-related interfaces are demonstrated: * * mco_xml_get_policy(); * mco_xml_set_policy(); * <class_name>_xml_get(); * <class_name>_xml_schema(); */#include <platform.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "XMLtestDB.h"#ifdef MCO_PLATFORM_X64#define MCO_OID(hi,lo) (hi<<32)+lo#else //MCO_PLATFORM_X64#define MCO_OID(hi,lo) {hi,lo}#endif //MCO_PLATFORM_X64static const char *dbname = "XMLtestDB";static const int SEGSZ = 1024 * 1024 * 1;#ifndef MCO_PLATFORM_X64static const int PAGESIZE = 96;#elsestatic const int PAGESIZE = 192;#endifstatic int num_obj[3];//int output_to = 0;int output_to = 1;#if defined (_VXWORKS) char xml_name[] = "/tgtsvr/output.xml";#elif defined (_WIN32_WCE) char xml_name[] = "output.xml";#else char xml_name[] = "output.xml";#endifconst int MAP_ADDRESS = 0x20000000;/************************************************************/void _SH_(void) { char text[] = { "\nThis samples demonstartes eXtremeDB XML export\n" }; char text1[] = { "Copyright (c) 2001-2006 McObject LLC. All Right Reserved.\n\n" }; printf("\nUsage: xml [-f]\n"); printf("%s\neXtremeDB runtime version %d.%d, build %d\n%s\n", text, MCO_COMP_VER_MAJOR, MCO_COMP_VER_MINOR, MCO_COMP_BUILD_NUM,text1); if (output_to) printf("\nOutput to file \"%s\"\n\nPress Enter to start", xml_name); else printf("\nConsole output\n\nPress Enter to start"); getchar();}/************************************************************/void showStat( mco_db_h db, uint2 class_code ) { MCO_RET rc = 0; mco_trans_h t; mco_class_stat_t stat; mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); rc = mco_class_stat_get( t, class_code, &stat ); mco_trans_commit( t ); if ( rc == MCO_S_OK ) { printf("\n\tStatistics for the class with code %d:\n" "\tNumber of objects:\t%ld\n" "\tTotal core pages used:\t%ld\n" "\tTotal blob pages used:\t%ld\n" "\tTotal core space used:\t%ld\n", class_code, stat.objects_num, stat.core_pages, stat.blob_pages, stat.core_space); num_obj[class_code-1] = stat.objects_num; }}void showMem( mco_db_h db ) { mco_puint totalpg, freepg; mco_db_free_pages( db, &freepg ); mco_db_total_pages( db, &totalpg ); printf("\n\tMemory Report:" "\n\ttotal pages=%d (%dK)" "\n\t free pages=%d (%dK)" "\n\t used %dK\n", totalpg, totalpg * PAGESIZE / 1024, freepg, freepg * PAGESIZE / 1024, (totalpg - freepg) * PAGESIZE / 1024);}/************************************************************/static int erase(mco_db_h db) { mco_cursor_t csr; mco_trans_h t; Person p_obj; Children c_obj; Dog d_obj; int n; for ( n=0; n < num_obj[Dog_code-1]; n++ ) { mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); Dog_list_cursor( t, &csr ); mco_cursor_first(t, &csr); Dog_from_cursor( t, &csr, &d_obj ); Dog_delete( &d_obj ); mco_trans_commit( t ); } for ( n=0; n < num_obj[Children_code-1]; n++ ) { mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); Children_list_cursor( t, &csr ); mco_cursor_first(t, &csr); Children_from_cursor( t, &csr, &c_obj ); Children_delete( &c_obj ); mco_trans_commit( t ); } for ( n=0; n < num_obj[Person_code-1]; n++ ) { mco_trans_start( db, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t ); Person_list_cursor( t, &csr ); mco_cursor_first(t, &csr); Person_from_cursor( t, &csr, &p_obj ); Person_delete( &p_obj ); mco_trans_commit( t ); } return 0;}int do_print(void *stream_handle,const void * from, unsigned nbytes) { if (!stream_handle) { unsigned i; stream_handle = 0; for ( i=0; i < nbytes; i++ ) printf("%c", ((char*)from)[i]); }else { FILE * f = (FILE*)stream_handle; unsigned i; for ( i=0; i < nbytes; i++ ) { char c = ((char*)from)[i]; if(c==0) c = c; fprintf(f, "%c", c); } } return 0;}static int insert(mco_db_h db) { MCO_RET rc; mco_trans_h t; Person p_obj; Children c_obj; Dog d_obj; Residence res; Address adr; Country cnt; Date dat; Phone pho; Office off; rc = mco_trans_start(db,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&t); if(rc) return rc;#include "XMLpers1.c"#include "XMLpers2.c"#include "XMLpers3.c" { /* Child # 1 */ XMLtestDB_oid fat = { "XXIV-CE", MCO_OID(123456789ul, 87654321ul) }; XMLtestDB_oid mot = { "XX-ABCD", MCO_OID(88888888ul, 99999999ul) }; rc = Children_new(t, &c_obj); if(rc) goto err; Children_father_put(&c_obj, &fat); Children_mother_put(&c_obj, &mot); Children_name_put(&c_obj, "Leny", 4); Children_height_put(&c_obj, (float)1.67); Children_weight_put(&c_obj, 67.5); Children_age_put(&c_obj, 18); } { /* Child # 2 */ XMLtestDB_oid fat = { "12345", MCO_OID(123454321ul, 87654322ul) }; XMLtestDB_oid mot = { "XX-ABCD", MCO_OID(88888888ul,99999999ul) }; rc = Children_new(t, &c_obj); if(rc) goto err; Children_father_put(&c_obj, &fat); Children_mother_put(&c_obj, &mot); Children_name_put(&c_obj, "Elias", 5); Children_height_put(&c_obj, (float)1.82); Children_weight_put(&c_obj, 87.5); Children_age_put(&c_obj, 27); } { XMLtestDB_oid own = { "XX-SX", MCO_OID(123456789ul, 87654323ul) }; { /* Dog # 1 */ rc = Dog_new(t, &d_obj); if(rc) goto err; Dog_name_put(&d_obj, "Misty", 5); Dog_owner_put(&d_obj, &own); } { /* Dog # 2 */ XMLtestDB_oid own = { "XX-SX", MCO_OID(123456789ul, 87654323ul) }; rc = Dog_new(t, &d_obj); if(rc) goto err; Dog_name_put(&d_obj, "Grrrr", 5); Dog_owner_put(&d_obj, &own); } { /* Dog # 3 */ XMLtestDB_oid own = { "XX-ABCD", MCO_OID(88888888ul, 99999999ul) }; rc = Dog_new(t, &d_obj); if(rc) goto err; Dog_name_put(&d_obj, "Clumzy", 6); Dog_owner_put(&d_obj, &own); } { /* Dog # 4 */ XMLtestDB_oid own = { "XXIV-AB", MCO_OID(123456789ul, 87654321ul) }; rc = Dog_new(t, &d_obj); if(rc) goto err; Dog_name_put(&d_obj, "Bibo", 4); Dog_owner_put(&d_obj, &own); } { /* Dog # 5 */ XMLtestDB_oid own = { "XXIV-AB", MCO_OID(123456789ul, 87654321ul) }; rc = Dog_new(t, &d_obj); if(rc) goto err; Dog_name_put(&d_obj, "Tank", 4); Dog_owner_put(&d_obj, &own); } } rc = mco_trans_commit(t); return rc; err: rc = mco_trans_rollback(t); return rc;}/************************************************************//* fatal error handler */static void errhandler( int n ) { printf( "\neXtremeDB runtime fatal error: %d", n ); getchar(); exit( -1 );}/************************************************************/#include "mcoxml.h"static const char xml_header1[] ="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<data>\n";static const char xml_header2[] = "</data>";MCO_RET output_schema (mco_db_h db ) { mco_trans_h t; FILE * f = 0; MCO_RET rc; { printf("\n********* Class \"Person\" xml schema: ********* \n\n"); mco_trans_start(db, MCO_READ_ONLY,MCO_TRANS_FOREGROUND, &t); if (output_to) f = fopen("person.xsd", "w"); Person_xml_schema( t, f, &do_print ); if (output_to) fclose(f); rc = mco_trans_commit(t); if (rc) return rc; } mco_trans_start(db, MCO_READ_ONLY,MCO_TRANS_FOREGROUND, &t); { printf("\n\n********* Class \"Children\" xml schema:********* \n\n"); if (output_to) f = fopen("children.xsd", "w"); Children_xml_schema( t, f, &do_print ); if (output_to) fclose(f); rc = mco_trans_commit(t); if(rc) return rc; } { printf("\n\n********* Class \"Dog\" xml schema:********* \n\n"); mco_trans_start(db, MCO_READ_ONLY,MCO_TRANS_FOREGROUND, &t); if (output_to) f = fopen("dog.xsd", "w"); Dog_xml_schema( t, f, &do_print ); if (output_to) fclose(f); rc = mco_trans_commit(t); if (rc) return rc; } return 0;}MCO_RET output_data (mco_db_h db ) { mco_trans_h t; Person p_obj; Children c_obj; Dog d_obj; MCO_RET rc; mco_cursor_t c; FILE * f = 0; rc = mco_trans_start(db, MCO_READ_ONLY,MCO_TRANS_FOREGROUND, &t); if(rc) return rc; if (output_to) f = fopen(xml_name,"w"); if (!f) output_to = 0; do_print(f, xml_header1, strlen(xml_header1)); rc = Person_list_cursor(t, &c); if(rc) return rc; rc = mco_cursor_first(t, &c); if(rc) return rc; for(;;) { rc = Person_from_cursor ( t, &c, &p_obj); if(rc) return rc; rc = Person_xml_get(&p_obj, f, &do_print); if(rc) return rc; if ( mco_cursor_next(t, &c) != MCO_S_OK ) break; } rc = Children_list_cursor(t, &c); if(rc) return rc; rc = mco_cursor_first(t, &c); if(rc) return rc; for(;;) { rc = Children_from_cursor ( t, &c, &c_obj); if(rc) return rc; rc = Children_xml_get(&c_obj, f, &do_print); if(rc) return rc; if ( mco_cursor_next(t, &c) != MCO_S_OK ) break; } rc = Dog_list_cursor(t, &c); if(rc) return rc; rc = mco_cursor_first(t, &c); if(rc) return rc; for(;;) { rc = Dog_from_cursor ( t, &c, &d_obj); if(rc) return rc; rc = Dog_xml_get(&d_obj, f, &do_print); if(rc) return rc; if ( mco_cursor_next(t, &c) != MCO_S_OK ) break; } do_print(f, xml_header2, strlen(xml_header2)); if (f) fclose(f); rc = mco_trans_commit(t); return rc;}/************************************************************/int main( int argc, char **argv ) { MCO_RET rc; mco_db_h db = 0; char *p; int i; char * start_mem; mco_trans_h t; mco_xml_policy_t policy; mco_runtime_info_t info; if (argc > 1) { for (i = 1; i < argc; i++) { p = argv[i]; printf("%s\n",p); start: switch (*p) { case (' '): p++; goto start; case ('/'): case ('-'): switch( (*++p) ) { case ('F'): case ('f'): output_to = 1; break; default: break; } break; default: break; } } } _SH_(); mco_get_runtime_info( &info); if ( info.mco_shm_supported ) { start_mem = (char*)MAP_ADDRESS; } else { start_mem = (char*)malloc(SEGSZ); if (!start_mem) { printf("Couldn't allocated memory\n"); exit (1); } }; /* set fatal error handler */ mco_error_set_handler( &errhandler ); rc = mco_runtime_start(); rc = mco_db_open( dbname, XMLtestDB_get_dictionary(), start_mem, SEGSZ, (uint2) PAGESIZE ); if ( rc ) { printf( "\nerror creating database" ); if ( !info.mco_shm_supported ) free( start_mem ); exit( 1 ); } /* connect to the database, obtain a database handle */ mco_db_connect( dbname, &db ); rc = mco_trans_start(db,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&t); if(rc) { goto end; }; if (MCO_E_UNSUPPORTED == (rc=mco_xml_get_policy(t, &policy))) { printf("\nXML is not supported!\n\n"); goto end; } policy.text_coding = MCO_TEXT_ASCII; //BASE64; policy.blob_coding = MCO_TEXT_ASCII; //BASE64; policy.ignore_field = MCO_YES; mco_xml_set_policy(t, &policy); rc = mco_trans_commit(t); if(rc) goto end; rc = insert(db); if(rc) goto end; rc = output_data(db); if(rc) goto end; rc = output_schema(db); if(rc) goto end; rc = erase(db); end: /* disconnect from the database, db is no longer valid */ mco_db_disconnect( db ); /* destroy the db */ mco_db_close( dbname ); if ( !info.mco_shm_supported ) free( start_mem ); printf("\nPress Enter to finish\n"); getchar(); PROG_EXIT(0);;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -