一段直接路径读取文件LINUX C代码
最近搞个MYBATIS-PLUS里面的MAPPER DAO方法审计.就是把里面的SQL提取出来,然后使用SQL质量工具进行审计!
SQLE 在这方面功能强大,就是细节不够完美,它有SCANDR工具可以把某个目录下XML文件扫描并上传到SQLE里面进行审计.
通过自由裁剪的MYSQL 审核规则,一条条SQL进行! 问题是那么多SQL,不符合规范的是来之哪个文件,哪个方法?
像这样子就满意了
我通过提示方式来判断这个SQL来之哪里
SCANDER工具 它扫描 上传 显示是否通过,不通过显示是哪条规则,最后总是报个错误出来.
社区版也就这样,功能超强,细节不完美,要完美估计要买企业版.
所以作为一个初级程序员 之 C 就只好自己动手丰衣足食了!
经过3周,3个周的工作日,加班2个小时到8点,才初步成型. 上班时间要干其它活,只要下班,才能专心写代码,调试代码.
下面一段是用直接IO读写文件,就是绕过LINUX的系统缓存.
PG一大BUG 就是使用双缓存,导致某些SQL执行时快时慢,对DBA要精细调整两边的缓存比! MYSQL和ORACLE不这样干!
PG ACE 大部分没有代码动手的能力,有PPT,文档编辑能力以及演讲口才能力.
要使用DIO需要3个小条件
1 需要堆上分配
2 需要512字节对齐
3 需要4KB整数倍写入文件
下面代码开始大部分是在程序当前目录下创建一个XXX.SQL文件,
有就只写,追加,直接,同步方式写入数据.
int fd = open(filePath, O_CREAT | O_APPEND | O_WRONLY | O_DIRECT | O_SYNC, 0644);
从双层MAP对象里提取出SQL
MAP<STRING,MAP<STRING,STRING>> OBJECT;
这个对象保存了 文件名,方法名,SQL的对应关系
定义个通用类型的内存地址变量 memAddr_buf
memAddr_buf = memalign(512, 512 * 8); 通过这个函数进行512字节对齐,对4096字节,它自动在堆上分配4096字节
memcpy(memAddr_buf, it->second.c_str(), it->second.size()); 通过内存CP函数把MAP里的SQL拷贝进去*(char*)((char*)memAddr_buf + sql_size) = '\n'; 这段内容后面添加个换行符号,有意思的代码.是AI浣熊告知的. 然后就写入文件一次必须4KB字节倍数,成功返回写入字节,错误返回-1int ret = write(fd, memAddr_buf, 4096);free(memAddr_buf); 最后就是释放内存. 这4个函数OPEN,WRITE,MEMALIGN,FREE都是LINUX系统提供的函数.
char current_dir[PATH_MAX]; //创建文件 并导出SQL语句到文件里char fileName[]="ParseXMLFetchSQL.sql";char filePath[PATH_MAX];if(getcwd(current_dir,sizeof(current_dir)) != NULL){if (is_debug) {printf("Current Working Directory:%s\n",current_dir);}strcpy(filePath, current_dir);strcat(filePath, "/");strcat(filePath, fileName);if (is_debug) {printf("filePath:%s\n",filePath);}int fd = open(filePath, O_CREAT | O_APPEND | O_WRONLY | O_DIRECT | O_SYNC, 0644);if (fd == -1){printf("Error Open File %s\n",filePath);close(fd);return 1;}else{if (is_debug) {printf("fileName Number:%d\n",filename_sql_map.size());}for (auto it = filename_sql_map.begin(); it != filename_sql_map.end(); ++it){std::map<std::string,std::string> read_sql_map;read_sql_map = it->second;if (is_debug) {printf("SQL Number:%d\n",read_sql_map.size());}void* memAddr_buf;memAddr_buf = memalign(512, 512 * 8);if (!memAddr_buf) { printf("Failed to alloc write buffer\n"); free(memAddr_buf); } for(auto it = read_sql_map.begin(); it != read_sql_map.end(); ++it){ unsigned int sql_size=it->second.size(); memset(memAddr_buf,'\0',4096); memcpy(memAddr_buf, it->second.c_str(), it->second.size());*(char*)((char*)memAddr_buf + sql_size) = '\n';int ret = write(fd, memAddr_buf, 4096);if (ret == -1){printf("Error Write File %s\n",filePath);close(fd);free(memAddr_buf);return 1;} } // for sql mapfree(memAddr_buf); }//for filename_sql_map }}
下面是头文件. 有兴趣的朋友可以试试
/*By Sharkz(小凡仙) 曾凡坤 2024-07-08*//* Standard C++ headers */#include <iostream> //输入输出流
#include <fstream> //文件流
//#include <sstream> //字符串流
#include <stdexcept> //标准异常
#include <map> //MAP 类
#include <string> //字符串类
//#include <chrono> //获得纳秒时间 Calc_time_diff
#include <vector> //动态数组
#include <cstdlib>//C LANGE LIB
#include <limits.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>//Liunx sys lib
#include <fcntl.h> //linux 文件库
#include <unistd.h> //进程库
#include <dirent.h> //posix /*g++ -g main.cpp -std=c++11 -o main.exe./main.exe -d /home/shark/projects/CPP_Projects/ParseXmlSql > run.log
*/using namespace std;
写后文件内容是这样的,两个SQL中间一大段是NULL
哎 搞到高兴之处,把生产的14个SQL的文件传给SQLE进行审核,居然说语法不支持,开始我以为HINT放的位置不对, 另外SQLE还说SQL太长了,要分成多个SQL的提示. 以前直接审计XML文件,对有些超长的方法也是这样报错,我以为想当然. 直到看到一个DELETE语句 不到50个字母,也这样说,就忽然明白了什么. SQLE没有去空. 我写文件一次写入4096个字节,也可以说字符,大部分提取的SQL顶多是1500个字母,后面好几千都NULL.
哎 搞得我要放弃这段DIO,直接写文件的代码.
心里不是个滋味!
再论国产数据库的选择
如何选择国产数据库?
基于MYSQL的JAVA初级优化措施
Oracle优化新常态
相关文章:

一段直接路径读取文件LINUX C代码
最近搞个MYBATIS-PLUS里面的MAPPER DAO方法审计.就是把里面的SQL提取出来,然后使用SQL质量工具进行审计! SQLE 在这方面功能强大,就是细节不够完美,它有SCANDR工具可以把某个目录下XML文件扫描并上传到SQLE里面进行审计. 通过自由裁剪的MYSQL 审核规则,一条条SQL进行! 问题是那…...
Android让所有APK横屏显示
在Android6.0.1里面,Box产品的HDMI输出都是以横屏显示,而有些APK会申请竖屏显示,此时通过修改frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java文件里面的updateRotationUncheckedLocked函数的如下语句&…...
【智能制造-26】PLC标准-SICAR
什么是SICAR? SICAR 是西门子基于 TIA Portal 的汽车行业自动化标准。 SICAR 标准具有以下特点和优势: 提供了统一的硬件和软件标准,以及统一的接口。涵盖了从 PLC 程序、HMI 画面到特定工艺功能块(如机器人、阀岛、视觉系统等&…...
浅学爬虫-处理复杂网页
在处理实际项目时,网页通常比示例页面复杂得多。我们需要应对分页、动态加载和模拟用户行为等问题。以下是一些常见的场景及其解决方案。 处理分页 许多网站将内容分成多个页面,称为分页。要抓取这些数据,需要编写一个能够遍历所有分页的爬…...

nginx反向代理严重错误[crit] (13: Permission denied) while reading upstream问题
nginx作为使用最广泛的一款反向代理软件,其性能也是非常优秀的,一般情况下,直接配置就可以使用,而且也都是稳定高效的,但是在实际应用中,对于不同的应用场景,总是会出现各种各样的问题ÿ…...
精通Python爬虫中的XPath:从安装到实战演示
🔸 插件安装 首先,我们需要安装用于处理XPath的库lxml。在命令行中运行以下命令: pip install lxml🔹 lxml是一个强大的库,支持XPath查询和XML处理,是爬虫开发中的重要工具。 🔸 DOM节点学习 …...

redis的使用场景
目录 1. 热点数据缓存 1.1 什么是缓存? 1.2 缓存的原理 1.3 什么样的数据适合放入缓存中 1.4 哪个组件可以作为缓存 1.5 java使用redis如何实现缓存功能 1.5.1 需要的依赖 1.5.2 配置文件 1.5.3 代码 1.5.4 发现 1.6 使用缓存注解完成缓存功能 2. 分布式锁…...
记录new Date()的各种方法以及时间差的计算方法
new Date().toLocaleDateString() —— 2024/8/2new Date().toLocaleTimeString() —— 10:21:48new Date().toLocaleString() —— 2024/8/2 10:21:48new Date().toLocaleDateString() —— Fri Aug 02 2024new Date().toDateString() —— Fri Aug 02 2024new Date…...

vue项目创建+eslint+Prettier+git提交规范(commitizen+hooks+husk)
# 步骤 1、使用 vue-cli 创建项目 这一小节我们需要创建一个 vue3 的项目,而创建项目的方式依然是通过 vue-cli 进行创建。 不过这里有一点大家需要注意,因为我们需要使用最新的模板,所以请保证你的 vue-cli 的版本在 4.5.13 以上ÿ…...
从Docker拉取镜像一直失败超时?这些解决方案帮你解决烦恼
设置国内源: 提示:常规方案(作用不大) 阿里云提供了镜像源:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登录后你会获得一个专属的地址 使用命令设置国内镜像源:通过vim /etc/docker/d…...

R语言大尺度空间数据分析模拟预测及可视化:地统计与空间自相关、空间数据插值、机器学习空间预测、空间升降尺度、空间模拟残差订正、空间制图等
目录 专题一 R语言空间数据介绍及数据挖掘关键技术 专题二 R语言空间数据高级处理技术 专题三 R语言多维时空数据处理技术、数据清洗整合和时间序列分析 专题四 R语言地统计与空间自相关、空间插值方法 专题五 R语言机器学习与空间模型预测及不确定性评估 专题六 R语言空…...
深入理解Java内存管理机制
Java内存管理是Java开发中一个至关重要的主题。理解内存管理机制不仅有助于编写高效的代码,还可以帮助我们避免常见的内存问题,如内存泄漏和内存不足。本篇博客将详细介绍Java内存管理机制,并通过代码示例帮助读者更好地理解这一过程。 1. J…...

Helm 学习之路,一文弄懂
1. 什么是 Helm 1.1 概述 Helm 是 Kubernetes 应用程序的包管理器,和redhat中yum 管理包类似. 1.2 架构图v3 1.3 下载 官当 最新版本 官方github curl -LO https://get.helm.sh/helm-v3.15.2-linux-amd64.tar.gz 1.4 安装 解压 #由于是二进制,直接解压到/usr/local/b…...

【面试题解答】一个有序数组 nums ,原地删除重复出现的元素
面试题解答 仅供学习 文章目录 面试题解答题目一、python代码1.1 代码1.2 示例用法1.2.1 示例11.2.2 示例2 二、讲解2.1 初始化2.2 遍历2.3 返回 题目 要解决这个问题,可以使用双指针方法进行原地修改,以确保每个元素最多出现两次。 一、python代码 1.1…...

【数据结构算法经典题目刨析(c语言)】随机链表的复制(图文详解)
💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述 二、思路分析 要完成一个带随机指针的链表的复制,有一个巧妙的办法:分三步走 1.完成节…...

cqyjldfx
CVE-2023-27179 靶标介绍: GDidees CMS v3.9.1及更低版本被发现存在本地文件泄露漏洞,漏洞通过位于 /_admin/imgdownload.php 的 filename 参数进行利用。攻击者可以通过向 filename 参数传递恶意输入来下载服务器上的任意文件。 提示有本地文件泄露&a…...

大数据——HBase原理
摘要 HBase 是一个开源的、非关系型的分布式数据库系统,主要用于存储海量的结构化和半结构化数据。它是基于谷歌的 Bigtable 论文实现的,运行在 Hadoop 分布式文件系统(HDFS)之上,并且可以与 Hadoop 生态系统的其他组…...

《电视技术》是什么级别的期刊?是正规期刊吗?能评职称吗?
问题解答 问:《电视技术》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《电视技术》级别? 答:国家级。主管单位:中国电子科技集团公司 主办单位ÿ…...
网络编程 --------- 2、socket网络编程接口
1、什么是socket 套接字 socke套接字是一个编程的接口 (网络编程的接口)、是一种特殊的文件描述符 (read/write),不局限于TCP/IP 。socket是独立于具体协议的网络编程接口这个接口是位于 应用层和传输层之间 。 类型: (1)流式套接字 SOCK_ST…...
C# Deconstruct详解
总目录 前言 该文来源于探索弃元的使用,由弃元了解到元组,由元组又了解到解构方法Deconstruct。 另外本文中 解构和析构一个意思,不要在意! 一、Deconstruct是什么? 1. 关于元组 如果我们想了解Deconstruct 的使用&…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...