基本应用示例
默认情况下,所有示例可执行文件都构建在target/bin目录中。有关如何在您的开发平台上构建示例的说明,请参阅相关平台用户手册。
构建完成后,构建示例可在子目录或者在开发系统调试器中运行。
native/core目录包含一些 C++ 示例子目录,可在此处查看。
编译语言
00_ddl
此示例包含一个最小的应用程序和项目文件 schema.mco ,用于使用 mcocomp 编译该模式模。
该应用程序仅显示一行消息,不执行任何数据库操作,演示了 SmartEDB 应用程序所需的最小运行时库列表。
运行时
01_rtconfig_inmem
此示例演示了全内存数据库的运行时信息。
该应用程序演示了 mco_runtime_start()
、mco_get_runtime_info()
和 mco_runtime_stop()
函数的使用。
01_rtconfig_mixed
此示例演示了基于磁盘的混合数据库(包含持久类和瞬时类)的运行时信息。
该应用程序演示了 mco_runtime_start()
、mco_get_runtime_info()
和 mco_runtime_stop()
函数的使用。
打开数据库
02_open_conv
此示例打开、显示运行时信息并关闭一个常规内存数据库。
该应用程序演示了如何为调用 mco_db_open_dev()
初始化单个内存设备。
02_open_convhv
此示例打开一个常规内存数据库和 HTTP 查看器。
该应用程序演示了如何通过 mcohv_start()
和 mcohv_stop()
函数调用 HTTP 查看器,以及如何分配和注册 UDA 元字典。
统一数据访问(UDA)层对于 HTTP 接口是必需的。
02_open_dbextend
此示例打开并扩展了一个常规内存数据库。
该应用程序演示了内存设备数组的使用以及 mco_db_extend_dev()
函数的用法。
02_open_disk_file
此示例使用文件内存设备打开数据库。
该应用程序演示了如何为典型的基于磁盘(持久)的数据库初始化内存设备数组。
02_open_disk_multifile
此示例使用多文件内存设备打开数据库。
该应用程序演示了如何为基于多文件磁盘(持久)的数据库初始化内存设备数组。
02_open_disk_raid
此示例使用 RAID 内存设备打开数据库。
该应用程序演示了如何为基于磁盘(持久)的 RAID 数据库初始化内存设备数组。
02_open_hybrid
此示例根据从数据库模式确定的运行时设置,使用 1 个或 4 个存储设备打开混合数据库,然后显示运行时信息并关闭数据库。
该应用程序演示了如何使用运行时标志 mco_disk_supported
检查基于磁盘的运行时库的存在,以及使用 mco_shm_supported
检查共享内存运行时库的存在。
02_open_nvram
此示例在非易失性内存中的数据库上打开、插入记录并执行事务。
该应用程序演示了如何在模拟的非易失性 RAM 内存环境中,从存储镜像恢复内存数据库,以及通过设置标志 db_params.mode_mask |= MCO_DB_OPEN_EXISTING
通知数据库打开为“热启动”。
此示例必须启动两次:
- 第一次创建并初始化新数据库,然后在
transfer_money()
函数中存储一个映像文件 nvram.img,然后模拟崩溃。 - 第二次启动时,示例分配内存并从映像文件恢复数据库。然后使用标志
MCO_DB_OPEN_EXISTING
再次打开数据库,并重新计算数据以检查恢复的数据库的一致性。
02_open_security_disk_cipher
此示例打开、显示运行时信息并关闭一个加密数据库。
该应用程序演示了在调用 mco_db_open_dev()
时使用数据库参数 cipher_key
的用法。
02_open_security_disk_crc
此示例打开数据库,显示运行时信息,然后关闭数据库以进行 CRC 数据传输验证。
该应用程序演示了在调用 mco_db_open_dev()
时使用数据库参数 mode_mask
以及位掩码 MCO_DB_USE_CRC_CHECK
的用法。
02_open_shared
此示例打开、显示运行时信息并关闭一个共享内存数据库。
该应用程序演示了如何为典型的共享内存数据库初始化内存设备。
连接数据库
03_connect_multi_process
此示例从多个进程打开并连接到共享内存数据库。
运行此示例,必须从不同的命令窗口运行应用程序的多个实例。
03_connect_multi_task
此示例从多个任务打开并连接到数据库。
该应用程序演示了从多个线程(任务)连接到单个数据库。
03_connect_single_task
此示例从单个任务打开并连接到数据库。
该应用程序仅演示了 mco_db_connect()
和 mco_db_disconnect() 函数的用法。
基本操作
04_operations
此示例执行基本的插入、读取和更新操作。
该应用程序演示了生成的 _get()
和 _put()
函数的用法。
索引
05_indexes_btree_fulltext
此示例执行全文查找操作。
该应用程序演示了如何使用生成的 _search_all()
和 _search_any()
函数通过 btree 索引在字符串向量中进行查找。
05_indexes_btree_locate
此示例使用B-树索引执行查找操作。
该应用程序演示了如何使用生成的 _find()
和 _locate()
函数通过唯一和非唯一的树形索引查找对象。
05_indexes_btree_pattern
此示例执行基本的模式搜索。
该应用程序演示了如何使用生成的 _pattern_search()
函数以及使用复合树索引的“忽略其他字段”模式策略。
05_indexes_btree_search
此示例使用树索引执行搜索操作。
05_indexes_btree_collate
此示例使用带有树索引的用户定义排序规则。
该应用程序演示了如何使用生成的 _get_collations()
函数以及用户定义的排序规则比较函数 C1_collation_compare()
。
05_indexes_cursor_basic
此示例执行基本的游标操作。
该应用程序演示了使用生成的 _index_cursor()
和 _from_cursor() 函数以及标准游标导航函数 mco_cursor_first()
、mco_cursor_next()
、mco_cursor_last()
和 mco_cursor_prev()
并结合树索引的用法。
05_indexes_cursor_store
此示例使用 MVCC 事务管理器在事务之间存储游标。
该应用程序演示了如何使用函数 mco_cursor_store()
在创建游标的事务关闭后保留游标以供将来使用。
05_indexes_hash
此示例使用了唯一和非唯一的哈希索引。
该应用程序演示了如何使用唯一和非唯一的哈希索引来生成 _find()
和 _search()
函数。
05_indexes_kdtree
此示例使用了一个 kd 树索引。
该应用程序演示了针对 kd 树索引所生成的 _search()
函数的使用。
05_indexes_patricia_binary
此示例使用带有位向量键的 Patricia 索引。
该应用程序演示了针对二进制(vector<boolean>
)Patricia 索引生成的 exact_match()
、prefix_match()
和 _next_match()
函数的使用。
05_indexes_patricia_character
此示例使用带有字符串键的 Patricia 索引。
该应用程序演示了针对字符(char<n>
)Patricia 索引生成的 exact_match()
、prefix_match()
和 _next_match()
函数的使用。
05_indexes_rtree
此示例演示了针对 rtree 索引生成的 _search()
函数的使用。
05_indexes_userdef
此示例演示了生成的 get_udfs()
、compare_obj()
和 _compare_ext()
函数,以及用于用户定义索引的标准函数 mco_db_register_udf()
的使用。
相关信息
在构建此项目时,mcocomp 会生成一个名为 udfdb_udf.c.new 的此文件的新版本,以便对 udfdb_udf.c 所做的任何自定义设置不会被覆盖。
错误处理
06_errorhandling_errorhandler
此示例演示了标准用户定义错误处理函数以及注册函数 mco_error_set_handler()
的使用。
06_errorhandling_fatalerr
此示例演示了如何捕获致命错误。通过在只读事务中执行非法操作来触发错误处理程序。
06_errorhandling_fatalerrex
此示例演示了如何捕获致命错误。
该应用程序通过在只读事务中执行非法操作来触发扩展错误处理程序。
06_errorhandling_nonfatalerr
此示例演示了如何检测和管理非致命错误代码。
06_errorhandling_statuscode
此示例演示了如何检测和管理运行时状态码。
事务管理
07_transactions_exclusive
此示例演示了使用排他事务管理器的事务。
该应用程序启动了两个线程并行运行。第一个线程向表 A 写入数据,第二个线程向表 B 写入数据。当写入数据库记录时,输出也会被写入一个内存缓冲区,随后该缓冲区会被展开以显示实际的操作顺序。
07_transactions_isolation_levels
此示例使用 MVCC 事务管理器演示了不同隔离级别的行为。
该应用程序创建了两个账户记录并进行如下初始化:
Account Id=1, balance=1000
Account Id=2, balance=10000
然后,对于每个隔离级别,都会生成两个线程,以在并行事务中并行更新账户记录,具体如下:
- 在事务1 中向账户 1 存入 100 。
- 在事务2 中显示最终余额。
- 获取账户 1 的最终余额。
- 将账户 2 的余额存入账户 1 。
- 从账户 2 中取出账户 1 之前的余额。
- 显示最终余额。
07_transactions_iterate
此示例演示了如何使用函数 mco_trans_iterate()
在事务实际提交到数据库之前,对在两阶段事务中创建的对象进行迭代。
07_transactions_mursiw
此示例演示了使用 MURSIW 事务管理器的事务。
该应用程序启动了两个线程并行运行。第一个线程向表 A 写入数据,第二个线程向表 B 写入数据。在写入数据库记录时,输出也会被写入一个内存缓冲区,随后该缓冲区会被展开以显示实际的操作顺序。
07_transactions_mvcc
此示例演示了使用 MVCC 事务管理器的事务。
对于 MVCC 的三个隔离级别,该应用程序会为每一个启动两个线程并行运行。第一个线程向表 A 写入,第二个线程向表 B 写入。在它们写入时,数据库记录的输出也会被写入一个内存缓冲区,随后展开以显示实际的操作顺序。
07_transactions_nested
此示例演示了嵌套事务的行为。
该应用程序启动一个事务,然后,在提交它之前,调用一个函数,该函数启动并提交一个嵌套事务,之后提交外部事务。
07_transactions_ph2commit
此示例演示了对两个常规内存数据库的两阶段提交。
该应用程序打开两个数据库,然后用特定的键值对两者进行初始化。然后,它尝试插入具有顺序键值的记录,但当出现重复键值时会失败,导致第一阶段提交失败并且事务回滚。
07_transactions_ph2disk
此示例演示了对基于磁盘的数据库的两阶段提交。
该应用程序使用命令行参数运行:
- exit(在第一阶段提交后中止)
- confirm(确认并进行第二阶段提交任何在第一阶段提交的事务)
- reject(拒绝并回滚任何在第一阶段提交的事务)
07_transactions_policy
此示例设置事务提交策略。
该应用程序演示了函数 mco_disk_transaction_policy()
的使用,以及三种提交策略(MCO_COMMIT_BUFFERED
、MCO_COMMIT_NO_SYNC
和 MCO_COMMIT_SYNC_FLUSH
)的不同行为。
07_transactions_transaction
此示例执行基本的事务启动和提交。
该应用程序简单地演示了如何将函数 mco_trans_start()
和 mco_trans_commit()
用于只读和读写事务,以及函数 mco_trans_checkpoint()
以在事务期间导致索引更新。
性能
08_benchmarks_general
此示例演示了在具有固定大小类和可变大小类的数据库上进行数据库插入、搜索和删除的性能。
第一个类具有多个整数字段和一个固定大小的字符数组。第二个类具有可变长度的字符串字段。两者都有哈希和树索引。
08_benchmarks_perf
此示例演示了在一个简单数据库上进行数据库插入、搜索和删除操作的性能。
该数据库具有一个包含整数字段、哈希索引和树索引的单个类。
08_benchmarks_perf_pmon
此示例使用原始示例“perf”展示性能监控统计信息。
08_benchmarks_perf_struct
此示例演示了在使用包含简单结构体的对象与包含直接结构体的对象时,数据库插入、搜索和删除的性能。
08_benchmarks_perf_uda
此示例演示了在一个简单的数据库上,使用统一数据访问 API 进行数据库插入、搜索和删除操作的性能。
该数据库具有一个包含整数字段、哈希索引和树索引的单个类。
字段操作
09_blobs
此示例演示了对 blob(二进制大对象)字段的基本操作。
12_vectors
此示例演示了向量类型及向量字段的基本操作。
事件
10_events_asynch
此示例演示了异步事件处理。
该模式声明了在运行时注册的 <新建>、<更新> 和 <删除> 事件。当对象被创建、删除或更新时,会调用相应的事件处理程序(回调函数)。事件处理程序在一个单独的线程中执行,该线程被阻塞等待事件或通过 mco_async_release()
显式释放。
10_events_synch
此示例演示了同步事件处理。
该模式声明了在运行时注册的 <新建>、<更新> 和 <删除> 事件。当创建、删除或更新新对象时,会调用相应的事件处理程序(回调函数)。事件处理程序会打印出从运行时传递给回调函数的对象句柄中获取的数据。
14_ttl
此示例演示了“生存时间”(Time-To-Live)对过时对象的自动删除的使用。
在模式定义(文件 schema.mco)中演示了两种设置 TTL 策略的技术,并且应用程序会显示插入 10 个对象后的结果。
XML
13_xml_export_import
此示例演示了 XML mco_db_xml_export()
和 mco_db_xml_import()
API 的使用。
13_xml_xml_ops
此示例演示了基本的 XML 操作。
13_xml_xml_policy
此示例演示了 XML mco_xml_set_policy()
API 的用法。
13_xml_xml_schema
此示例演示了 <classname>_xml_schema()
API 的用法。
UDA
16_uda_uda_mco
此示例演示了如何使用 mco_uda_to_mco()
从 UDA 对象中提取“原生”数据库对象句柄,以便对该对象执行原生 C API 操作。
16_uda_udacoll
此示例演示了如何使用UDA进行自定义排序。
16_uda_udaevent
此示例演示了 UDA 同步和异步事件 API 的使用。
16_uda_udameta
此示例演示了 UDA 元数据 API 的使用。
16_uda_udaopen
此示例演示了 mco_uda_db_open()
和 mco_uda_db_close()
的使用。
16_uda_udaops
此示例演示了在各种数据库操作中使用 UDA API 的情况。
16_uda_udapsearch
此示例演示了 UDA 模式搜索 API 的使用。
16_uda_udaudf
此示例演示了使用 UDA API 创建用户自定义的树形索引和哈希索引。
数据统计
17_statistics_dbcalc
此示例构建了数据库计算器测试应用程序。
17_statistics_dbcalcapi
此示例演示了数据库计算器 API 的使用方法。
17_statistics_dbstat
此示例演示了运行时统计信息 API 函数 mco_class_stat_get()
、mco_index_stat_num()
和 mco_index_stat_get()
的用法。
备份与恢复
18_backup_bse
此示例展示了持久数据库的二进制模式演变。
18_backup_db
此示例演示了如何使用 mco_db_save()
将数据库的图像(快照)保存到磁盘,以及如何使用 mco_db_load()
恢复数据库。
18_backup_disk
此示例演示了使用 mco_disk_save()
备份持久数据库以及使用 mco_disk_load()
进行恢复。
18_backup_disk_file
此示例演示了使用 mco_disk_save()
备份持久数据库以及使用 mco_disk_load_file()
进行恢复。
18_backup_inmem
此示例演示了如何使用 mco_inmem_save()
保存内存中的数据库以及使用 mco_inmem_load()
恢复内存中的数据库。
18_backup_migrate
此示例演示了将现有的持久化数据库迁移到更新的版本和/或不同的架构。
18_backup_online
此示例演示了使用 mco_backup_create()
进行库级增量备份以及使用 mco_backup_restore()
进行恢复。
19_recovery_diskrecovery
此示例演示了持久数据库的自动恢复。
19_recovery_sniffer
此示例演示了如何使用 db_sniffer()
函数来检测死连接。
在没有命令行参数的情况下启动嗅探器,以使用默认值 n_iterations=10000
。然后使用命令行参数“10”(n_iterations=10
)启动嗅探器的第二个实例。第二个进程将在第 10 次迭代时导致段错误。第一个进程中的嗅探器循环将检测并报告第二个进程中的死连接。
回调方法
21_overflow_persistent
此示例展示了在持久性数据库中使用内存分配回调的方法。
21_overflow_persistent_cache
此示例展示了如何预测和预防MCO_E_DISK_PAGE_POOL_EXHAUSTED错误。
为避免MCO_E_DISK_PAGE_POOL_EXHAUSTED
错误,有必要检查结构mco_disk_cache_info_t
的pinned_pages
字段的值。固定页面的数量应小于一个阈值,该阈值基本上计算为磁盘缓存中可用磁盘页面总数的一部分,而磁盘缓存中可用磁盘页面的总数又由同一结构的allocated_pages
字段指定。
21_overflow_transient
此示例展示了在临时数据库中使用内存分配回调的方法。
HTTP及网络服务
22_httpview
此示例展示了如何使用 mcohv_start()
、mcohv_stop()
和 mcohv_shutdown()
来通过网络浏览器查看数据库的内容和结构。
浏览器页面会显示数据库的结构、统计信息和数据;并且允许用户以交互方式修改数据。
23_httpviewpmon
此示例展示了集成到 HTTP 数据库查看器中的性能监视器 WEB 界面的使用方法。
24_rest_mt
此示例演示了如何使用 HTTP 服务器的 Web 服务 REST API。
\target\bin\24_rest_mt.exe
此应用程序将示例数据加载到本地内存数据库中,然后创建一个 REST 服务器实例,添加并初始化 api/db 服务,并启动 REST 服务器。随后显示服务器主机地址和端口号,并等待客户端请求,直到用户键入 ENTER
以终止服务器。
要查看 REST 响应,请从 \samples\native\core\24-rest
目录运行 Python 客户端:
python restclient.py
24_rest_st
此示例展示了在单线程应用程序中 Web 服务 REST API 的使用。
\target\bin\24_rest_st.exe
此应用程序将示例数据加载到本地内存数据库中,然后创建一个 REST 服务器实例,添加并初始化 api/db 服务,并运行一个循环来接受客户端请求。该应用程序等待 5 秒钟以获取请求,如果未收到请求则终止。
要查看 REST 响应,请从 \samples\native\core\24-rest
目录运行 Python 客户端:
python restclient.py
25_perfmon
此示例演示了如何使用性能监视器 C API 通过 UDA 从性能监控器数据库中检索计数器。
\target\bin\25_perfmon.exe