{"id":29571872,"url":"https://github.com/oceanbase/oblogmsg","last_synced_at":"2025-07-19T04:36:27.540Z","repository":{"id":103355507,"uuid":"410798287","full_name":"oceanbase/oblogmsg","owner":"oceanbase","description":"LogMessage is one of the output format of database incremental data","archived":false,"fork":false,"pushed_at":"2024-03-08T03:31:14.000Z","size":575,"stargazers_count":9,"open_issues_count":0,"forks_count":5,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-03-08T04:29:12.083Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oceanbase.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2021-09-27T08:14:18.000Z","updated_at":"2023-08-29T07:21:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"2ae1ecfc-384b-411d-b5ba-6191edd97e0b","html_url":"https://github.com/oceanbase/oblogmsg","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oceanbase/oblogmsg","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oceanbase%2Foblogmsg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oceanbase%2Foblogmsg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oceanbase%2Foblogmsg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oceanbase%2Foblogmsg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oceanbase","download_url":"https://codeload.github.com/oceanbase/oblogmsg/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oceanbase%2Foblogmsg/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265889158,"owners_count":23844539,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-19T04:36:27.016Z","updated_at":"2025-07-19T04:36:27.524Z","avatar_url":"https://github.com/oceanbase.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"oblogmsg 是一种数据库增量数据的输出格式,oceanbase 的增量采集模块 liboblog 正是使用的这种消息格式来输出增量数据,oblogmsg 支持 oceanbase 中不同数据类型的增量数据的写入，具有序列化和反序列化的能力。\n## 如何使用 oblogmsg\n\n\u003e 前置条件\n\u003e\n\u003e * cmake: \u003e=3.20.0\n\u003e * g++: 支持 C++11 标准\n\n\n\n### 以源码方式依赖（推荐方式）\n\n* 可以使用 `git submodule` 的方式将 oblogmsg 作为主项目的子模块\n* 在主项目的  CMakeLists.txt 文件中使用 `add_subdirectory(submodule_path_to_oblogmsg)` 来依赖 oblogmsg，该命令执行后将提供 `oceanbase::oblogmsg_shared` 和 `oceanbase::oblogmsg_static` 两个 targets\n* 在主项目相关  CMakeLists.txt 文件中，对于要依赖 oblogmsg 的 target t1，使用 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_shared)`或者 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_static)`即可\n\n### 依赖编译后的 oblogmsg 库\n\n* 编译、安装 oblogmsg\n\n```shell\n# 编译 oblogmsg\ngit clone https://github.com/oceanbase/oblogmsg.git\nmkdir oblogmsg-build\ncd oblogmsg-build\ncmake -S ../oblogmsg -B .\ncmake --build .\n\n# 本地安装\ncmake --install . --prefix=${OBLOGMSG_INSTALL_PATH}\n```\n\n* 主项目中依赖编译、安装后的 oblogmsg\n  * 在主项目  CMakeLists.txt 文件中使用 `set(CMAKE_PREFIX_PATH $ENV{OBLOGMSG_INSTALL_PATH} ${CMAKE_PREFIX_PATH})` 设置 oblogmsg 库搜索路径\n  * 然后使用 `find_package(oblogmsg REQUIRED)`使加载 oblogmsg，该命令执行成功后将提供 `oceanbase::oblogmsg_shared` 和 `oceanbase::oblogmsg_static` 两个 targets\n  * 在主项目相关  CMakeLists.txt 文件中，对于要依赖 oblogmsg 的 target t1，使用 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_shared)`或者 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_static)`即可\n\n## oblogmsg 部分接口说明\n### 创建一个 record\n\n     1. void ILogRecord::setSrcType(int type)\n        功能描述:\n            设置数据源的类型\n        参数：\n            type  有效值有0x00,0x01,0x02,0x03,0x04,0x05,对应数据源分别是 MYSQL,OCEANBASE,HBASE,ORACLE,OCEANBASE_1_0,DB2,liboblog 设置的值是0x04,即数据源是 OCEANBASE_1_0 \n        返回值：\n            无返回值\n\n     2. void ILogRecord::setCheckpoint(uint64_t file, uint64_t offset)\n        功能描述:\n            设置当前的分析位点信息\n        参数：\n            file 一个秒级的 unix 时间戳\n            offset file 参数中 unix 时间戳的微秒级\n        返回值：\n            无返回值\n\n     3. int ILogRecord::setRecordType(int aType)\n        功能描述:\n            设置一条 record 的操作类型\n        参数：\n            aType 一般有七种类型 插入操作0x00 (EINSERT),更新操作0x01 (EUPDATE),删除操作0x02 (EDELETE),心跳包0x04 (HEARTBEAT),事物开始0x06 (EBEGIN),事物提交0x07 (ECOMMIT), DDL 操作0x08 (EDDL), 强制更新操作 0x0c (EPUT)\n        返回值：\n            固定返回0\n\n     4. void ILogRecord::setDbname(const char *dbname)\n        功能描述:\n            设置一条 record 来源的 db 名字\n        参数：\n            dbname record 的来源的数据库名字\n        返回值：\n            无返回值\n\n     5. void ILogRecord::setTbname(const char *tbname)\n        功能描述:\n            设置一条 record 的 table 名字\n        参数：\n            dbname record 的表名\n        返回值：\n            无返回值\n\n     6. void ILogRecord::setTableMeta(ITableMeta* tblMeta)\n        功能描述:\n            设置一个 record 的元数据信息\n        参数：\n            tblMeta record 的元数据信息，内存需由调用方申请和释放\n        返回值：\n            无返回值\n\n     7. void ITableMeta::setName(const char* name)\n        功能描述:\n            设置元数据中的表名字\n        参数：\n            name 表的名字\n        返回值：\n            无返回值\n\n     8. void ITableMeta::setUKs(const char* uks)\n        功能描述:\n            设置元数据中的UK字段名字\n        参数：\n            uks 包含有 uk 字段的名字的字符串，格式为 (col1,col2,col3...)，当有多个 uk 时，例如 (col1,col2),(col2,col3),需要合并成一个字符串 (col1,col2,col3) 传入\n        返回值：\n            无返回值\n\n     9. void ITableMeta::setPKs(const char* pks)\n        功能描述:\n            设置元数据中的 PK 字段名字\n        参数：\n            pks 包含 pk 字段的名字的一个字符串，格式为 (col1,col2,col3...)\n        返回值：\n            无返回值\n\n    10. void ITableMeta::setPkinfo(const char* info)\n        功能描述:\n           设置元数据中的 PK 字段 id\n        参数：\n            info 包含有 pk 字段 id 的一个字符串，格式为(0,1,2,3...),从0开始\n        返回值：\n            无返回值\n\n    11. void ITableMeta::setUkinfo(const char* info)\n        功能描述:\n            设置元数据中的 UK 字段 id\n        参数： \n            info 包含有 uk 字段 id 的一个字符串，格式为(0,1,2,3...),当有多个uk时，传入格式为（0,1),(1,2),(0,3)...\n        返回值：\n            无返回值\n\n    12. int ITableMeta::append(const char* colName, IColMeta* colMeta);\n        功能描述:\n            向一个表的元数据信息添加一个列的元数据信息\n        参数：\n            colName 列的名字\n            colMeta 列的元数据信息\n        返回值：\n            -1 此列名在表中已存在时，添加会失败，返回-1\n            0 添加成功\n\n    13. void IColMeta::setName(const char* name)\n        功能描述:\n            为一个列的元数据信息设置列名\n        参数：\n            name 此列的名字\n        返回值：\n            无返回值\n\n    14. void IColMeta::setType(int type)\n        功能描述:\n            设置列的类型\n        参数：\n            type 列的类型，可设置的值详见 include/MetaInfo.h 中的枚举类型 logmsg_field_types\n        返回值：\n            无返回值\n\n    15. void IColMeta::setLength(long length)\n        功能描述:\n            设置列的字节长度\n        参数：\n            length 该列的字节长度\n        返回值：\n            无返回值\n\n    16. void IColMeta::setIsPK(bool b)\n        功能描述:\n            设置该列是否时 pk\n        参数：\n            b  设置为 true 时，该列为 uk，false 时，该列不是 uk\n        返回值：\n            无返回值\n\n    17. void IColMeta::setIsUK(bool b)\n        功能描述:\n            设置该列是否时uk\n        参数：\n            b  设置为 true 时，该列为 uk，false 时，该列不是 uk\n        返回值：\n            无返回值\n\n    18. void IColMeta::setNotNull(bool b)\n        功能描述:\n            设置该列是否有非空约束\n        参数：\n            b  设置为 true 时，该列不能为空，false 时，该列可以为空\n        返回值：\n            无返回值\n\n    19. void ILogRecord::setOldColumn(BinLogBuf* buf, int size)\n        功能描述：\n            初始化一片空间用来存放前镜像的字段值，空间大小为 size 个 BinLogBuf 的大小，size 必须比大于等于表的字段数目，该空间由调用方申请和释放\n        参数：\n            buf 空间的首地址\n            size 空间中 BinLogBuf 的个数，一般为表的字段数目\n        返回值：\n             无返回值\n\n    20. void ILogRecord::setNewColumn(BinLogBuf* buf, int size)\n        功能描述：\n            初始化一片空间用来存放后镜像的字段值，空间大小为 size 个 BinLogBuf 的大小，size 必须比大于等于表的字段数目，该空间由调用方申请和释放\n        参数：\n            buf 空间的首地址\n            size 空间中 BinLogBuf 的个数，一般为表的字段数目\n        返回值：\n             无返回值\n\n    21. int ILogRecord::putOld(const char* pos, int len)\n        功能描述:\n            添加一个前镜像中字段的值到 record 中\n        参数：\n            pos 字段值的起始地址\n            len 字段值的长度\n        返回值：\n            固定返回0\n    22. int ILogRecord::putNew(const char* pos, int len)\n        功能描述:\n            添加一个后镜像中字段的值到 record 中\n        参数：\n            pos 字段值的起始地址\n            len 字段值的长度\n        返回值：\n            固定返回0\n\n    23. const char* ILogRecord::toString(size_t *size, bool reserveMemory)\n        功能描述:\n            序列化一个record\n        参数:\n            size 一个 size_t 类型的地址，序列化完成后，会将序列化后数据的长度写入该地址\n            reserveMemory 是否保留序列化之后的数据到 record 的数据区，若不保留，改 record 在序列化之后，里面所存储的数据会被清空，将不可用\n        返回值：\n            NULL 序列化失败\n            非空指针 序列化之后的数据首地址\n\n    24. ILogRecord::bool parsedOK()\n        功能描述:\n            获取一个 record 是否已经完成序列化\n        参数:\n            空\n        返回值：\n            true 此 record 已经完成序列化，或者此 record 是由一段数据反序列化后创建的\n            false 此 record 还未进行序列化\n\n### 反序列化一个 record,或者从一个已经序列化过的 record 中( ILogRecord::parsedOK() 返回 true )解析数据\n\n     1. int ILogRecord::parse(const void* ptr, size_t size)\n        功能描述:\n            反序列化一个 record\n        参数:\n            ptr  保存着序列化数据的首地址\n            size 序列化数据的长度\n        返回值：\n            0 成功\n            其他值 失败\n\n     2. int ILogRecord::getSrcType()\n        功能描述:\n            获取数据源的类型\n        参数：\n            空\n        返回值：\n            返回一个int型数值，有效值有0x00,0x01,0x02,0x03,0x04,0x05,对应数据源分别是 MYSQL,OCEANBASE,HBASE,ORACLE,OCEANBASE_1_0,DB2,liboblog 设置的值是0x04,即数据源是 OCEANBASE_1_0\n\n     3. uint64_t ILogRecord::getCheckpoint1()/uint64_t ILogRecord::getCheckpoint2()\n        功能描述:\n            获取分析的位点信息\n        参数:\n            空\n        返回值:\n            getCheckpoint1:返回一个秒级的 unix 时间戳\n            getCheckpoint2:返回 unix 时间戳的微秒级，可利用 getCheckpoint1*1000000+getCheckpoint2 做为分析的断点位置\n\n     4. int ILogRecord::recordType()\n        功能描述:\n            获取一条 record 的操作类型\n        参数：\n            空\n        返回值：\n            返回一个int类型数值，一般有七种类型，插入操作0x00 (EINSERT),更新操作0x01 (EUPDATE),删除操作0x02 (EDELETE),心跳包0x04 (HEARTBEAT),事物开始0x06 (EBEGIN),事物提交0x07 (ECOMMIT),DDL 操作0x08 (EDDL)\n\n     5. const char* ILogRecord::dbname() const\n        功能描述:\n            获取一条 record 来源的 db 名字\n        参数：\n            空\n        返回值：\n            返回一个char*类型的指针，该指针指向 record 的来源的数据库名字\n\n     6. const char* ILogRecord::tbname() const\n        功能描述:\n            获取一条 record 的 table 名字\n        参数：\n            空\n        返回值：\n            返回一个 char* 类型的指针，该指针指向 record 的来源的表名字\n\n     7. int ILogRecord::getTableMeta(ITableMeta*\u0026 tblMeta)\n        功能描述:\n            从一个 record 获取表的元数据信息,从一个序列化过的 record 取值时，由调用方为 tblMeta 申请和释放内存\n        参数:\n            tblMeta 表元数据信息的首地址\n        返回值:\n            0 成功\n            其他值 失败\n\n     8. const char* ITableMeta::getName()\n        功能描述:\n            获取元数据中的表名字\n        参数：\n            name 表的名字\n        返回值：\n            返回一个 char* 类型的指针，该指针指向 record 的元数据中的表名字\n\n     9. const char* ITableMeta::getUKs()\n        功能描述:\n            获取元数据中的 UK 字段名字\n        参数：\n            空\n        返回值：\n            返回一个 char* 指针，指向包含有 uk 字段的名字的字符串，格式为 (col1,col2,col3...)\n\n    10. const char* ITableMeta::getPKs()\n        功能描述:\n            获取元数据中的 PK 字段名字\n        参数：\n            空\n        返回值：\n            返回一个 char* 指针，指向包含 pk 字段的名字的一个字符串，格式为 (col1,col2,col3...)\n\n    11. const char* ITableMeta::getPkinfo()\n        功能描述:\n            获取元数据中的 PK 字段 id，从0开始\n        参数：\n           空\n        返回值：\n            返回一个 char* 指针，指向包含有 pk 字段 id 的一个字符串，格式为 (0,1,2,3...)\n\n    12. const char* ITableMeta::getUkinfo()\n        功能描述:\n            设置元数据中的 PK 字段 id,从0开始\n        参数：\n            空\n        返回值：\n            返回一个 char* 指针，指向包含有 uk 字段 id 的一个字符串，格式为(0,1,2,3...)\n\n    13. int ITableMeta::getColCount()\n        功能描述:\n            获取元数据中的字段数量\n        参数：\n            空\n        返回值：\n            返回字段的数量\n\n    14. const char* IColMeta::getName()\n        功能描述:\n            获取一个列的元数据中的列名\n        参数：\n            空\n        返回值：\n            返回一个 char* 指针，指向元数据的列名\n\n    15. int IColMeta::getType()\n        功能描述:\n            获取列的类型\n        参数：\n            空\n        返回值：\n            返回一个 int 型数值，详见 include/MetaInfo.h 中的枚举类型 logmsg_field_types\n\n    16. long IColMeta::getLength()\n        功能描述:\n            获取列的字节长度\n        参数：\n            空\n        返回值：\n            列的字节长度\n\n    17. bool IColMeta::isPK()\n        功能描述:\n            获取该列是否时 pk\n        参数：\n            空\n        返回值：\n            返回一个 bool 类型，为 true 时，该列为 uk，false 时，该列不是 uk\n\n    18. bool IColMeta::isUK()\n        功能描述:\n            获取该列是否时 uk\n        参数：\n            空\n        返回值：\n            返回一个 bool 类型，为 true 时，该列为 uk，false 时，该列不是 uk\n\n    19. bool IColMeta::isNotNull()\n        功能描述:\n            获取该列是否有非空约束\n        参数：\n            空\n        返回值：\n            返回一个 bool 类型，为 true 时，该列有非空约束，false 时，该列可以为空\n\n    20. StrArray* ILogRecord::parsedOldCols() const\n        功能描述：\n            获取 record 中前镜像的所有字段值\n        参数：\n            空\n        返回值：\n            返回一个 StrArray 类型的指针，该指针指向存着前镜像的值，可通过 StrArray-\u003esize() 接口获取数据的列数，StrArray-\u003eelementAt(int i, const char*\u0026 s, size_t\u0026 length) 接口获取每列的数据\n\n    21. StrArray* ILogRecord::parsedNewCols() const\n        功能描述：\n            获取 record 中后镜像的所有字段值\n        参数：\n            空\n        返回值：\n            返回一个 StrArray 类型的指针，该指针指向存着后镜像的值，可通过 StrArray-\u003esize() 接口获取数据的列数，StrArray-\u003eelementAt(int i, const char*\u0026 s, size_t\u0026 length) 接口获取每列的数据\n\n### 从一个未序列化过的 record 中( ILogRecord::parsedOK() 返回 false )解析前后镜像字段的数据\n\n     1. int ILogRecord::getTableMeta(ITableMeta*\u0026 tblMeta)\n        功能描述:\n            从一个 record 获取表的元数据信息,从一个未序列化过的 record 取值时，tblMeta 必须为一个空指针\n        参数:\n            tblMeta 需为一个空指针，该接口会将此指针指向 record 的元数据地址，内存由 oblogmsg 管理，调用方不需要释放\n        返回值:\n            0 成功\n            其他值 失败\n\n     2. BinLogBuf* ILogRecord::newCols(unsigned int\u0026 count)\n        功能描述：\n            获取 record 中后镜像的所有字段值\n        参数：\n            count 用来返回数据的列数\n        返回值：\n            返回一个 BinLogBuf 类型的指针，该指针指向一个拥有 count 个 BinLogBuf 的空间，每个 BinLogBuf.buf 成员即是字段的值，BinLogBuf.buf_used_size 为字段值的长度\n\n     3. BinLogBuf* ILogRecord::oldCols(unsigned int\u0026 count)\n        功能描述：\n            获取 record 中后镜像的所有字段值\n        参数：\n            count 用来返回数据的列数\n        返回值：\n            返回一个 BinLogBuf 类型的指针，该指针指向一个拥有 count 个 BinLogBuf 的空间，每个 BinLogBuf.buf 成员即是字段的值，BinLogBuf.buf_used_size 为字段值的长度\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foceanbase%2Foblogmsg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foceanbase%2Foblogmsg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foceanbase%2Foblogmsg/lists"}