Openssl数据安全传输平台015:OCCI的使用方法+在项目中的设计与实现
文章目录
- 1 OCCI使用
- 1.1 初始化 - Environment 类
- 1.2 连接数据库 - Connection 类
- 1.3 执行SQL
- 2 OCCI在项目中的使用
- 2.1 OCCI单独封装为一个类文件OCCIOP
- 2.2 在ServerOP中作为私有成员
- 2.3 ServerOP::ServerOP(string json)中实例化进行使用
- 2.4 秘钥协商过程中进行读写操作
1 OCCI使用
// 头文件
#include <occi.h>
// occi的接口类在对应的命名空间中
using namespace oracle::occi;// 使用
1. 初始化一个环境->对应的类: Environment
2. 使用初始化完成的环境对象创建一个连接, 得到一个连接对象: Connection, 通过这个对象可用连接并操作服务器
3. 对数据库的操作: 添删查改(对应相关的sql语句)- 通过得到的连接数据库的实例对象, 创建一个可以对象数据进行sql操作的一个对象: Statement
4. 如果对数据进行是查询操作, 会得到一个结果集, 这个结果集对应的也是一个类: ResultSet
5. 释放资源- 结果集资源->ResultSet- 对数据进行sql操作的对象->Statement- 销毁连接对象->Connection- 数据连接环境->Environment
1.1 初始化 - Environment 类
OCCI通过创建一个Environment的对象完成初始化工作。
可以通过Environment创建数据库连接,从而进行其它的操作
要创建Environment,应该调用Environment类的静态方法createEnvironment()
// 环境初始化
Environment* env = Environment::createEnvironment();
// 关闭, 释放资源
Environment::terminateEnvironment(env);
1.2 连接数据库 - Connection 类
连接数据库通过Connection类的对象实例实现
调用Environment类的**createConnection()**方法可以创建一个Connection对象;
// 函数原型:
// 连接串格式: IP:端口/数据库实例名
Connection *Environment::createConnection( const string &userName,const string &password, const string &connectString );
// 函数调用
const string userName = "scott"; // 用户名
const string passwd = "tiger"; // 密码
const string connstr = "192.168.247.129:1521/orcl"; // 数据库连接串
Connection* conn = env->createConnection(userName, passwd, connstr);
使用**Environment::terminateConnection()**断开连接
// 断开连接
env->terminateConnection(conn);
1.3 执行SQL
Statement 类用于执行SQL语句,并获取返回结果。
ResultSet 类用于处理SELECT 查询的结果。
对于所有类型的数据的绑定或者获取,OCCI都提供了统一的方法
- setXXX 方法用于Statement
- getXXX 方法用于Statement & ResultSet
OCCI会自动处理类型之间的转换。
使用方法:
使用Connection:😗*createStatement()**创建Statement对象, 指定 SQL 命令(DDL/DML/query)作为参数
// 操作函数
Connection::createStatement(string &sql);Statement::setSQL(string &sql);Statement::execute(string &sql); // can be used for any SQL, returns status
// 执行一个insert/update/delete
Statement::executeUpdate(string &sql); // returns Insert/Update/Delete count
// 执行一个select语句
Statement::executeQuery(string &sql); // returns ResultSet(结果集)
使用 setXXX 方法传递要绑定用于输入的值
使用合适的execute方法执行SQL
对于SELECT 查询, 使用ResultSet 对象处理返回结果
// 插入操作
Statement *stmt = conn->createStatement(“ insert into Dept(Deptno,Dname, Loc) values (1, ‘ACCOUNTS’, ‘ZONE1’ ”);
stmt->executeUpdate();
conn->terminateStatement(stmt); // 关闭查询, 释放资源
使用绑定参数的DML(数据操作语句)示例:
Statement *stmt = conn->createStatement(“ insert into Emp(EmpNo,Ename) values(:1, :2) ”);
//1 and 2 are bind placeholders
int empno = 2;
string empname = “JOHN W”;
//first parameter is bind position, second is value
stmt->setInt(1, empno);
stmt->setString(2, empname);
stmt->executeUpdate();
执行SELECT查询并处理结果:
Statement *stmt = conn->createStatement(“select Empno, Ename, Sal from Emp where Hiredate >= :1”); //automatically converted to Date
stmt->setString(1, “01-JAN-1987”); //executeQuery returns a ResultSet
ResultSet *rs = stmt->executeQuery(); //ResultSet::next fetches rows and returns FALSE
//when no more rows
while (rs->next() == true)
{ //get values using the getXXX methods of ResultSet empno = rs->getInt(1); empname = rs->getString(2); empsalary = rs->getFloat(3);
}
stmt->closeResultSet(rs);//to free resources
2 OCCI在项目中的使用
2.1 OCCI单独封装为一个类文件OCCIOP
#pragma once
#define _GLIBCXX_USE_CXX11_ABI 0
#include <string>
#include <occi.h>
#include "SeckKeyNodeInfo.h"
using namespace std;
using namespace oracle::occi;class OCCIOP
{
public:OCCIOP();~OCCIOP();// 初始化环境连接数据库bool connectDB(string user, string passwd, string connstr);// 得到keyID -> 根据实际业务需求封装的小函数int getKeyID();bool updataKeyID(int keyID);bool writeSecKey(NodeSecKeyInfo *pNode);void closeDB();private:// 获取当前时间, 并格式化为字符串string getCurTime();private:Environment* m_env;Connection* m_conn;
};
2.2 在ServerOP中作为私有成员
#pragma once
#include <map>
#include "TcpServer.h"
#include "Message.pb.h"
#include "OCCIOP.h"
#include "SecKeyShm.h"
// 处理客户端请求
class ServerOP
{
public:enum KeyLen {Len16=16, Len24=24, Len32=32};ServerOP(string json);void startServer();static void* working(void* arg);friend void* workHard(void* arg);string seckeyAgree(RequestMsg* reqMsg);~ServerOP();private:string getRandKey(KeyLen len);private:string m_serverID; string m_dbUser;string m_dbPwd;string m_dbConnStr;unsigned short m_port;map<pthread_t, TcpSocket*> m_list;TcpServer *m_server = NULL;// 创建数据库实例对象,因为在多处进行了使用,因此设置为成员OCCIOP m_occi;SecKeyShm* m_shm;
};
2.3 ServerOP::ServerOP(string json)中实例化进行使用
ServerOP::ServerOP(string json)
{// 解析json文件, 读文件 -> Valueifstream ifs(json);Reader r;Value root;r.parse(ifs, root);m_port = root["Port"].asInt();m_serverID = root["ServerID"].asString();// 数据库相关的信息m_dbUser = root["UserDB"].asString();m_dbPwd = root["PwdDB"].asString();m_dbConnStr = root["ConnStrDB"].asString();// 实例化一个连接oracle数据的对象m_occi.connectDB(m_dbUser, m_dbPwd, m_dbConnStr);string shmKey = root["ShmKey"].asString();int maxNode = root["ShmMaxNode"].asInt();m_shm = new SecKeyShm(shmKey, maxNode);
}
2.4 秘钥协商过程中进行读写操作
// 将生成的新秘钥写入到数据库中 -> 操作 SECKEYINFO
NodeSecKeyInfo node;
strcpy(node.clientID, reqMsg->clientid().data());
strcpy(node.serverID, reqMsg->serverid().data());
strcpy(node.seckey, key.data());node.seckeyID = m_occi.getKeyID(); // 秘钥的IDinfo.seckeyID = node.seckeyID;
node.status = 1;// 初始化node变量
bool bl = m_occi.writeSecKey(&node);
相关文章:
Openssl数据安全传输平台015:OCCI的使用方法+在项目中的设计与实现
文章目录 1 OCCI使用1.1 初始化 - Environment 类1.2 连接数据库 - Connection 类1.3 执行SQL 2 OCCI在项目中的使用2.1 OCCI单独封装为一个类文件OCCIOP2.2 在ServerOP中作为私有成员2.3 ServerOP::ServerOP(string json)中实例化进行使用2.4 秘钥协商过程中进行读写操作 1 OC…...
ardupilot开发 --- CAN BUS、DroneCAN 、UAVCAN 篇
1. CAN BUS、DroneCAN 、UAVCAN 区别 UAVCAN是一种轻量级协议,旨在通过CAN BUS 在航空航天和机器人应用中实现可靠通信。 UAVCAN网络是分散的对等网络,其中每个对等体(节点)具有唯一的数字标识符 - 节点ID,并且仅需要…...
京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜
鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉! 9月份,空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示,今年9月,京东平台空气净化器的销量将近15万,同比增长约1%;销售额将近2亿元&…...
vue使日历组件点击时间渲染到时间输入框
首先,你需要在 Vue 中创建一个日历组件,该组件应该能够显示一个月的日历并允许用户选择日期。然后,当用户点击一个日期时,你需要将所选日期的值传递给父组件。最后,你可以在父组件中创建一个时间输入框,当用…...
TensorFlow学习:使用官方模型和自己的训练数据进行图片分类
前言 教程来源:清华大佬重讲机器视觉!TensorFlowOpencv:深度学习机器视觉图像处理实战教程,物体检测/缺陷检测/图像识别 注: 这个教程与官网教程有些区别,教程里的api比较旧,核心思想是没有变…...
MATLAB算法实战应用案例精讲-【图像处理】相机标定
目录 知识储备 距离算法和相似度计算方法 1、常见的距离算法 2、常见的相似度(系...
python画气泡标尺图
目录 渐变气泡图彩色气泡图 在进行实验结果分析的时候,气泡标尺图能非常清晰对不同的结果进行多维度的比较,特别是在深度学习模型大小和精度进行比较的时候非常合适使用,以下是几个例子。 渐变气泡图 import seaborn as sns import matplotl…...
Java并发编程指南:如何正确使用信号量和线程池熔断机制
前言: 在分布式系统中,选择合适的熔断机制是保护系统免受故障影响的关键。本文将介绍使用信号量和线程池两种常见的熔断机制,并提供Java和Spring Cloud Alibaba框架下的示例代码,帮助您深入理解和应用。 1. 信号量熔断机制 信号…...
大彩串口屏读写文件问题
分区 本文使用的是大彩串口屏M系列的: 串口屏内部有三个分区,分别为A、B、C三个区: A区:系统区,存储组态工程文件 B区:数据区,存储配置信息,记录数据、历史曲线等 C区:备…...
php之 角色的权限管理(RBAC)详解
RBAC(Role-based access control)是一种常见的权限管理模型,通过将用户分配至特定的角色,以及为角色分配访问权限,实现了权限管理的目的。以下是关于RBAC的详细解释: 角色:RBAC模型的核心是角色…...
asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c# 语言开发 asp.net乡村旅游管理系统 二、…...
【linux】文件系统+软硬连接+动静态库
文件系统软硬连接动静态库 1.理解文件系统1.1磁盘的物理结构1.2磁盘的存储结构1.3磁盘的逻辑结构1.4文件系统 2.软硬链接2.1什么是软硬链接2.2软硬链接的作用 3.动静态库3.1什么是库3.1静态库和静态链接3.2动态库和动态链接3.2.1通过环境变量找到动态库路径3.2.2把动态库拷贝到…...
力扣每日一题73:矩阵置零
题目描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2…...
vscode C++项目相对路径的问题
如图所示的项目目录结构 如果要在main.cpp里用相对路径保存一个txt文件 std::ofstream file("./tree_model/my_file.txt");if (file.is_open()) {file << "This is a sample text.\n";file.close();std::cout << "File saved in the mode…...
视频转换器WinX HD Video Converter mac中文特点介绍
WinX HD Video Converter mac是一款功能强大的视频转换器,它可以将各种不同格式的视频文件转换为其他视频格式,以便用户在各种设备上进行播放。WinX HD Video Converter是一个功能强大、易于使用的视频转换器,适用于各种类型的用户࿰…...
数据隐私保护的方法有哪些?
数据隐私保护的方法有哪些? 安企神U盘管理系统下载使用 互联网时代的到来,给我们的生活带来极大的方便,但也给我们保护隐私数据带来巨大的挑战,数据隐私保护是确保个人或企业数据和敏感信息不被未经授权的访问或滥用的关键问题。…...
【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend
今天在运行apt-get update更新软件包后,突然发现安装新的软件出现了这个报错:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1855(unattended-upgr)持有。如图。 这个错误通常是由于其他进程正在…...
嵌入式软件开发工程师应该关注芯片数据手册中的哪些信息
1. 芯片的架构和处理器类型:了解芯片的架构和处理器类型可以帮助开发人员选择合适的开发工具和编程语言。 2. 芯片的时钟频率和电源要求:了解芯片的时钟频率和电源要求可以帮助开发人员设计合适的电路和电源系统。 3. 芯片的存储器类型和容量ÿ…...
基于数字电路交通灯信号灯控制系统设计-单片机设计
**单片机设计介绍,1617基于数字电路交通灯信号灯控制系统设计(仿真电路,论文报告 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 交通灯控制系统在城市交通控制中发挥着重要的作用…...
Spring Boot 配置邮件发送服务
文章归档:https://www.yuque.com/u27599042/coding_star/ctwkrus1r9zrytsq spring boot 版本 3.1.3 邮件发送服务使用的 QQ 邮箱提供的 依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent…...
Matlab Simulink代码生成全流程解析
matlab simulink代码生成 包括:环境配置,参数与信号配置,函数名配置,数据管理,代码生成,以及代码优化等 文档63页在工程领域,利用Matlab Simulink进行代码生成是一项极为实用的技能,…...
Qt串口开发避坑指南:从QSerialPort基础到实战封装,解决粘包和跨平台问题
Qt串口开发避坑指南:从QSerialPort基础到实战封装 1. 串口开发的典型痛点与解决思路 嵌入式开发中,串口通信就像一位性格古怪的老朋友——看似简单却暗藏玄机。许多开发者第一次使用Qt的QSerialPort类时,往往会被其简洁的API迷惑,…...
FreeRTOS实战:基于串口空闲中断与二值信号量构建高效数据接收框架
1. 串口通信的痛点与解决方案 在嵌入式开发中,串口通信是最基础也最常用的外设之一。但处理不定长数据时,很多开发者会遇到这样的困扰:要么频繁进入接收中断导致CPU负载过高,要么需要手动设置数据包长度增加协议复杂度。我在早期项…...
电子萌新必看!用TXS0102芯片搞定3.3V/5V电平转换的5种典型电路
电子萌新必看!用TXS0102芯片搞定3.3V/5V电平转换的5种典型电路 第一次用Arduino连接5V传感器时,看到串口数据全是乱码的崩溃感,相信很多硬件爱好者都经历过。这种"电压鸿沟"问题在混合使用3.3V和5V设备时尤为常见,而TXS…...
OpenClaw定时任务详解:GLM-4.7-Flash每日自动生成工作报告
OpenClaw定时任务详解:GLM-4.7-Flash每日自动生成工作报告 1. 为什么需要自动化日报系统 上周三晚上11点,我盯着空白的周报文档发呆——明明这周完成了3个需求迭代和2次跨部门协作,却怎么都想不起具体细节。翻遍Git记录、邮件和会议纪要才勉…...
从国赛真题到实战演练:蓝桥杯CTF网络安全竞赛核心题型深度剖析
1. 逆向工程实战:从加密程序到Flag还原 去年蓝桥杯CTF国赛的第一道逆向题让不少选手印象深刻。题目给出一个名为encodefile的可执行程序和一个加密后的数据文件enc.dat,要求还原原始flag内容。这类题型在CTF中非常典型,主要考察选手对程序逻辑…...
清单来了:2026年公认好用的专业AI论文网站
2026年AI论文写作工具已从“内容生成”进化为多维度学术支持系统,核心差异体现在文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规五大维度。本次测评覆盖6款主流工具,涵盖中文/英文、全流程/专项、免费/付费场景,让你高效筛选适合自…...
C++传记 类的定义(面向对象)
面向对象编程(OOP)是C的核心特性之一,其核心思想是“封装、继承、多态”,而则是实现面向对象编程的基础载体——它本质上是一种自定义的数据类型,用于封装一组相关的属性(数据)和行为࿰…...
OpenClaw+GLM-4.7-Flash:个人博客自动更新系统搭建
OpenClawGLM-4.7-Flash:个人博客自动更新系统搭建 1. 为什么需要自动化博客维护 作为一个技术博主,我每周至少要花3-4小时在博客维护上:构思主题、撰写内容、调整格式、发布更新。最痛苦的不是写作本身,而是那些重复性的机械工作…...
分布式爬虫安全:构建高可用代理池的架构与实践指南
分布式爬虫安全:构建高可用代理池的架构与实践指南 【免费下载链接】scylla Intelligent proxy pool for Humans™ to extract content from the internet and build your own Large Language Models in this new AI era 项目地址: https://gitcode.com/gh_mirror…...
