当前位置: 首页 > news >正文

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是一种轻量级协议&#xff0c;旨在通过CAN BUS 在航空航天和机器人应用中实现可靠通信。 UAVCAN网络是分散的对等网络&#xff0c;其中每个对等体&#xff08;节点&#xff09;具有唯一的数字标识符 - 节点ID&#xff0c;并且仅需要…...

京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜

鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉&#xff01; 9月份&#xff0c;空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示&#xff0c;今年9月&#xff0c;京东平台空气净化器的销量将近15万&#xff0c;同比增长约1%&#xff1b;销售额将近2亿元&…...

vue使日历组件点击时间渲染到时间输入框

首先&#xff0c;你需要在 Vue 中创建一个日历组件&#xff0c;该组件应该能够显示一个月的日历并允许用户选择日期。然后&#xff0c;当用户点击一个日期时&#xff0c;你需要将所选日期的值传递给父组件。最后&#xff0c;你可以在父组件中创建一个时间输入框&#xff0c;当用…...

TensorFlow学习:使用官方模型和自己的训练数据进行图片分类

前言 教程来源&#xff1a;清华大佬重讲机器视觉&#xff01;TensorFlowOpencv&#xff1a;深度学习机器视觉图像处理实战教程&#xff0c;物体检测/缺陷检测/图像识别 注&#xff1a; 这个教程与官网教程有些区别&#xff0c;教程里的api比较旧&#xff0c;核心思想是没有变…...

MATLAB算法实战应用案例精讲-【图像处理】相机标定

目录 知识储备 距离算法和相似度计算方法 1、常见的距离算法 2、常见的相似度(系...

python画气泡标尺图

目录 渐变气泡图彩色气泡图 在进行实验结果分析的时候&#xff0c;气泡标尺图能非常清晰对不同的结果进行多维度的比较&#xff0c;特别是在深度学习模型大小和精度进行比较的时候非常合适使用&#xff0c;以下是几个例子。 渐变气泡图 import seaborn as sns import matplotl…...

Java并发编程指南:如何正确使用信号量和线程池熔断机制

前言&#xff1a; 在分布式系统中&#xff0c;选择合适的熔断机制是保护系统免受故障影响的关键。本文将介绍使用信号量和线程池两种常见的熔断机制&#xff0c;并提供Java和Spring Cloud Alibaba框架下的示例代码&#xff0c;帮助您深入理解和应用。 1. 信号量熔断机制 信号…...

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的&#xff1a; 串口屏内部有三个分区&#xff0c;分别为A、B、C三个区&#xff1a; A区&#xff1a;系统区&#xff0c;存储组态工程文件 B区&#xff1a;数据区&#xff0c;存储配置信息&#xff0c;记录数据、历史曲线等 C区&#xff1a;备…...

php之 角色的权限管理(RBAC)详解

RBAC&#xff08;Role-based access control&#xff09;是一种常见的权限管理模型&#xff0c;通过将用户分配至特定的角色&#xff0c;以及为角色分配访问权限&#xff0c;实现了权限管理的目的。以下是关于RBAC的详细解释&#xff1a; 角色&#xff1a;RBAC模型的核心是角色…...

asp.net乡村旅游管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乡村旅游管理系统是一套完善的web设计管理系统系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用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:矩阵置零

题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[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是一款功能强大的视频转换器&#xff0c;它可以将各种不同格式的视频文件转换为其他视频格式&#xff0c;以便用户在各种设备上进行播放。WinX HD Video Converter是一个功能强大、易于使用的视频转换器&#xff0c;适用于各种类型的用户&#xff0…...

数据隐私保护的方法有哪些?

数据隐私保护的方法有哪些&#xff1f; 安企神U盘管理系统下载使用 互联网时代的到来&#xff0c;给我们的生活带来极大的方便&#xff0c;但也给我们保护隐私数据带来巨大的挑战&#xff0c;数据隐私保护是确保个人或企业数据和敏感信息不被未经授权的访问或滥用的关键问题。…...

【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend

今天在运行apt-get update更新软件包后&#xff0c;突然发现安装新的软件出现了这个报错&#xff1a;正在等待缓存锁&#xff1a;无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1855&#xff08;unattended-upgr&#xff09;持有。如图。 这个错误通常是由于其他进程正在…...

嵌入式软件开发工程师应该关注芯片数据手册中的哪些信息

1. 芯片的架构和处理器类型&#xff1a;了解芯片的架构和处理器类型可以帮助开发人员选择合适的开发工具和编程语言。 2. 芯片的时钟频率和电源要求&#xff1a;了解芯片的时钟频率和电源要求可以帮助开发人员设计合适的电路和电源系统。 3. 芯片的存储器类型和容量&#xff…...

基于数字电路交通灯信号灯控制系统设计-单片机设计

**单片机设计介绍&#xff0c;1617基于数字电路交通灯信号灯控制系统设计&#xff08;仿真电路&#xff0c;论文报告 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 交通灯控制系统在城市交通控制中发挥着重要的作用&#xf…...

Spring Boot 配置邮件发送服务

文章归档&#xff1a;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…...

从一次生产事故复盘:我们如何优雅地处理用户上传的‘异常’Excel文件(附Apache POI配置详解)

从生产事故到防御体系&#xff1a;构建Excel文件处理的工程化解决方案那天凌晨2点&#xff0c;我被一阵急促的告警声惊醒。监控系统显示&#xff0c;核心文件处理服务的错误率在10分钟内飙升到35%&#xff0c;大量用户上传的Excel文件无法正常解析。更糟糕的是&#xff0c;部分…...

Stitches项目架构分析:RequireJS模块化设计与Grunt构建流程完全指南 [特殊字符]

Stitches项目架构分析&#xff1a;RequireJS模块化设计与Grunt构建流程完全指南 &#x1f680; 【免费下载链接】stitches HTML5 Sprite Sheet Generator 项目地址: https://gitcode.com/gh_mirrors/sti/stitches Stitches是一个基于HTML5的雪碧图生成器&#xff0c;它采…...

Kerberos身份认证原理与实战排错指南

1. 为什么今天还要花时间搞懂 Kerberos&#xff1f;——一个被低估的“老协议”正在悄悄支撑着你的日常你每天登录公司内网查邮件、访问财务系统提交报销、用 Jenkins 构建代码、甚至在 Windows 域环境中打开一台同事的共享文件夹……这些看似顺滑的操作背后&#xff0c;大概率…...

Redis沙盒体验:在浏览器中零门槛掌握NoSQL核心技能

Redis沙盒体验&#xff1a;在浏览器中零门槛掌握NoSQL核心技能 【免费下载链接】try.redis A demonstration of the Redis database. 项目地址: https://gitcode.com/gh_mirrors/tr/try.redis 当你第一次听说Redis时&#xff0c;是否被那些晦涩的技术术语吓退&#xff1…...

孤舟笔记 互联网常用框架篇二 Dubbo服务请求失败怎么处理?集群容错策略你用过几种

文章目录先说结论Failover&#xff1a;换家店试试Failfast&#xff1a;不行就算了Failsafe&#xff1a;忘了这事Failback&#xff1a;回头再说Forking&#xff1a;同时点几家Broadcast&#xff1a;通知所有人怎么选择回答技巧与点评加分回答面试官点评个人网站分布式系统中&…...

Unity渲染排序三要素:SortingLayer、Order in Layer与RenderQueue协同原理

1. 为什么刚进Unity的美术和程序总在“图层遮挡”上反复拉扯&#xff1f;“这个UI怎么被背景挡住了&#xff1f;”“粒子特效一开就穿模&#xff0c;明明Z轴没问题&#xff01;”“我调了Order in Layer到999&#xff0c;还是被另一个Sprite挡住——它连Sorting Layer都没改过&…...

PCL 法向量夹角剔除错误匹配点对【2026最新版】

目录 一、 算法简介 1、主要函数 2、参考文献 二、 代码实现 三、 结果展示 四、 参考链接 博客长期更新,本文最新更新时间为:2026年5月24日。代码在PCL1.15.1中测试通过 一、 算法简介 在三维点云配准中,对应点(correspondence)的准确性直接决定了配准算法的精度和鲁棒性…...

3分钟解锁网易云音乐NCM文件:ncmdumpGUI小白也能懂的完整教程

3分钟解锁网易云音乐NCM文件&#xff1a;ncmdumpGUI小白也能懂的完整教程 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经下载了网易云音乐的歌曲&a…...

基于SMD与贝壳的微型音频装置:从电路设计到嵌入式开发的完整实践

1. 项目概述&#xff1a;一个藏在贝壳里的声音世界你小时候有没有捡起一个海螺壳&#xff0c;把它贴在耳边&#xff0c;然后听到里面传来“呜呜”的海风声&#xff1f;那个瞬间&#xff0c;仿佛整个海洋都被装进了小小的贝壳里。今天这个项目&#xff0c;就是把那个童年的魔法&…...

2026论文顶级降AI率工具大曝光:一键把AIGC率降至安全线!

步入2026年&#xff0c;学术圈的规则已经彻底变了味。过去那种只盯着查重率的“降重焦虑”早就被更可怕的“降AI焦虑”取代了。AI检测算法越来越聪明&#xff0c;高校审核标准也越来越严苛&#xff0c;光是把重复率压下去已经完全不够用了。现在摆在学生和科研人员面前的难题是…...