# marson_rdb **Repository Path**: bscrl/marson_rdb ## Basic Information - **Project Name**: marson_rdb - **Description**: 参考openharmony 的rdb对sqlite的封装 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-12-10 - **Last Updated**: 2025-12-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # wrapper_sqlite #### 介绍 参考openharmony 的rdb对sqlite的封装 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) ## 关注点 1、rdb_types.h 和 rdb_type.h 暂时没有分析 2、include "values_bucket.h 、include "values_buckets.h 这两个文件是否需要迁移? 3、代码分析: ```c++ std::shared_ptr ConnPool::Convert2AutoConn(std::shared_ptr node, bool isTrans) { if (node == nullptr) { return nullptr; } auto conn = node->GetConnect(); if (conn == nullptr) { return nullptr; } if (isTrans) { transCount_++; } return std::shared_ptr(conn.get(), [pool = weak_from_this(), node, isTrans](auto *) mutable { auto realPool = pool.lock(); if (realPool == nullptr) { return; } realPool->ReleaseNode(node, !isTrans); if (isTrans) { realPool->transCount_--; } node = nullptr; }); }帮忙分析这段代码 这段代码是 ConnPool 类中的 Convert2AutoConn 方法的实现,它用于将从连接池中获取的 ConnNode 对象转换为一个自动管理生命周期的 Connection 智能指针。以下是对这段代码的详细分析: 1. 参数说明 cpp std::shared_ptr ConnPool::Convert2AutoConn(std::shared_ptr node, bool isTrans) 返回类型:std::shared_ptr,表示返回一个指向 Connection 对象的智能指针。 参数: node:一个指向 ConnNode 对象的智能指针,代表连接池中的一个连接节点。 isTrans:一个布尔值,指示当前连接是否与事务相关。 2. 检查节点是否为空 cpp if (node == nullptr) { return nullptr; } 如果传入的 node 为空,直接返回 nullptr。 3. 获取连接 cpp auto conn = node->GetConnect(); if (conn == nullptr) { return nullptr; } 调用 node 的 GetConnect 方法获取实际的 Connection 对象。 如果 conn 为空,返回 nullptr。 4. 事务计数 cpp if (isTrans) { transCount_++; } 如果 isTrans 为 true,增加 transCount_ 计数器,这可能用于跟踪当前活动的事务数量。 5. 创建自定义删除器 cpp return std::shared_ptr(conn.get(), [pool = weak_from_this(), node, isTrans](auto *) mutable { auto realPool = pool.lock(); if (realPool == nullptr) { return; } realPool->ReleaseNode(node, !isTrans); if (isTrans) { realPool->transCount_--; } node = nullptr; }); 创建一个 std::shared_ptr 智能指针,其自定义删除器是一个 lambda 表达式。 捕获列表: pool = weak_from_this():捕获当前 ConnPool 对象的弱引用,用于在自定义删除器中安全地访问 ConnPool 对象。 node:捕获 ConnNode 对象的引用。 isTrans:捕获事务标志。 lambda 表达式: auto realPool = pool.lock();:尝试从弱引用获取 ConnPool 对象的强引用。 if (realPool == nullptr) { return; }:如果 ConnPool 对象已经被销毁,退出 lambda 表达式。 realPool->ReleaseNode(node, !isTrans);:调用 ReleaseNode 方法释放 ConnNode 对象。 if (isTrans) { realPool->transCount_--; }:如果是事务连接,减少 transCount_ 计数器。 node = nullptr;:将 node 设置为 nullptr,避免悬空指针。 总结 Convert2AutoConn 方法将 ConnNode 对象转换为 Connection 智能指针,并提供了一个自定义删除器,用于在智能指针被销毁时释放资源。这种方法确保了连接的生命周期被正确管理,特别是在异常或正常退出时能够安全地释放连接和相关资源。通过使用弱引用和自定义删除器,该方法提高了连接池的灵活性和安全性。 ```