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…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
