51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本
博客迁移至:
从事DBA工作多年
MYSQL源码也是头一次接触
尝试记录下自己看MYSQL5.7源码的历程
申明:个人Python编程很溜,但是C++还停在白痴水平,源码理解方面有点弱,如发现有错误的地方,轻喷
目录:
51ak带你看MYSQL5.7源码1:main入口函数 (2018-03-21)
51ak带你看MYSQL5.7源码2:编译现有的代码 (2018-03-22)
51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本 (2018-03-23)
51ak带你看MYSQL5.7源码4:实现SQL黑名单功能(2018-04-11)
经过开发和测试环境部署
现在到了我们动手的时候了,万事开头难,首先我们实现个小功能
今天我们准备实现这样一个功能:数据永远也不会被DELETE掉
当你把这个版本的MYSQL放到线上环境以后,就永远不用担心有人来DELETE你的数据了
思路很简单:顺腾摸瓜找到Delete所在的FUNC在函数开头就返回一个OK
问题来了,怎么找到这个函数?
有两种:一种很有灵性的同学,可能一眼就看到了sql/sql_delete.cc 这个文件 ,猜到是这个文件
另一种方法就是基础一点,我们顺着这样的代码一层一层找到这里也行。
dispatch_command
|->mysql_parse
|->mysql_execute_command
->mysql_update/mysql_delete
为了快速上手,我们用第一种方法,直接打开sql/sql_delete.cc
找到这个方法:
bool Sql_cmd_delete::execute(THD *thd)
{
DBUG_ASSERT(thd->lex->sql_command == SQLCOM_DELETE); LEX *const lex= thd->lex;
SELECT_LEX *const select_lex= lex->select_lex;
SELECT_LEX_UNIT *const unit= lex->unit;
TABLE_LIST *const first_table= select_lex->get_table_list();
TABLE_LIST *const all_tables= first_table; if (delete_precheck(thd, all_tables))
return true;
DBUG_ASSERT(select_lex->offset_limit == );
unit->set_limit(select_lex); /* Push ignore / strict error handler */
Ignore_error_handler ignore_handler;
Strict_error_handler strict_handler;
if (thd->lex->is_ignore())
thd->push_internal_handler(&ignore_handler);
else if (thd->is_strict_mode())
thd->push_internal_handler(&strict_handler);
/*注:我们要改的就是这里,直接返回一个true,而把真正要执行的地方给注释掉了*/
bool res =true;
/*MYSQL_DELETE_START(const_cast<char*>(thd->query().str));
bool res = mysql_delete(thd, unit->select_limit_cnt);
MYSQL_DELETE_DONE(res, (ulong) thd->get_row_count_func());
*/
/* Pop ignore / strict error handler */
if (thd->lex->is_ignore() || thd->is_strict_mode())
thd->pop_internal_handler(); return res;
}
好了,代码就改这一个小地方,现在去编译运行
然后建 一个测试表往里写几条数据,然后尝试各种DELETE语句,接下来就是见证奇迹的时候了,你会发现数据永远不能被DELETE掉了。。
mysql> select * from t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec) mysql> delete from t1 where id=2;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec)
怎么样,小小的一个改动,就让你再也不担心数据被删除了,感觉很酷有没有
看到这里的同学,现在你已经有了第一个自定义版 的MYSQL了,还不赶紧打包发布到线上去!!
让那些RD同学感受一下来自DBA的控制力吧。
可能有好事的同学会问,这只防了DELETE,没防TRUNCATE和DROP啊。。。
这样问的同学,我觉得你不够有灵性。。
好,今天到此为止
51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本的更多相关文章
- 51ak带你看MYSQL5.7源码2:编译现有的代码
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- 51ak带你看MYSQL5.7源码1:main入口函数
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...
- 51ak带你看MYSQL5.7源码4:实现SQL黑名单功能
博客迁移至: https://www.dboop.com/ 从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 申明:个人Python编程很溜,但是C++还停 ...
- 深入浅出!阿里P7架构师带你分析ArrayList集合源码,建议是先收藏再看!
ArrayList简介 ArrayList 是 Java 集合框架中比较常用的数据结构了.ArrayList是可以动态增长和缩减的索引序列,内部封装了一个动态再分配的Object[]数组 这里我们可以 ...
- Chrome自带恐龙小游戏的源码研究(七)
在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...
- Chrome自带恐龙小游戏的源码研究(完)
在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每 ...
- Chrome自带恐龙小游戏的源码研究(六)
在上一篇<Chrome自带恐龙小游戏的源码研究(五)>中实现了眨眼睛的恐龙,这一篇主要研究恐龙的跳跃. 恐龙的跳跃 游戏通过敲击键盘的Spacebar或者Up来实现恐龙的跳跃.先用一张图来 ...
- Chrome自带恐龙小游戏的源码研究(四)
在上一篇<Chrome自带恐龙小游戏的源码研究(三)>中实现了让游戏昼夜交替,这一篇主要研究如何绘制障碍物. 障碍物有两种:仙人掌和翼龙.仙人掌有大小两种类型,可以同时并列多个:翼龙按高. ...
- Chrome自带恐龙小游戏的源码研究(一)
目录 Chrome自带恐龙小游戏的源码研究(一)——绘制地面 Chrome自带恐龙小游戏的源码研究(二)——绘制云朵 Chrome自带恐龙小游戏的源码研究(三)——昼夜交替 Chrome自带恐龙小游戏 ...
随机推荐
- homebrew 无法安装提示不能在根目录下使用
首先提示一点:能谷歌绝对不要百度解决问题. 1.昨天百度了一天,都都没有找到解决方案.因为昨天是20161130日,我的蓝灯FQ软件的流量使用光了.悲催- 2.今天是20161201日,我可以免费使用 ...
- yaf代码生成工具的使用
具体步骤如下: 1.下载php-yaf源码: git clone https://github.com/laruence/php-yaf/ 2.运行代码生成工具: /Users/helloxiaozh ...
- ui设计未来前景怎么样?ui设计这个行业怎么样?
千锋UI设计师培训不仅有正常的培训课程,还为学员提供了UI+产品经理周末提升班,目的是为了给那些有基础的UI设计师提高能力.今天要为大家说的是一位千锋UI设计师的故事. 大家好,我是千锋UI设计培训部 ...
- web前端开发工程师工资多少
做web前端开发工程师工资高不高?下面千锋小编为大家分析一下:作为目前互联网行业中的主流技术,Web前端一直是占有重要的地位.尤其是近年来HTML5技术的突飞猛进,使Web前端技术有了更好的发展. ...
- 基于DirectShow的MPEG-4视频传输系统的研究与实现
1 引言 近年来,随着国民经济的发展,社会各个部门对于视频监视系统的需求越来越多.但目前的很多监视系统都跟具体的硬件相关,必须要具体的采集卡的支持才能实现.所以有必要开发一种具有通用性的视频监 ...
- VxWorks下USB驱动总结2
3:USBD驱动详解 这一部分将要描述USBD(USB Host Driver)的典型应用.例如初始化,client注册,动态连接注册,设备配置,数据传输,同时还探讨了USBD内部设计的关键特性.这部 ...
- JavaScript向select下拉框中添加和删除元素
JavaScript向select下拉框中添加和删除元素 1.说明 a 利用append()方法向下拉框中添加元素 b 利用remove()方法移除下拉框中最后一个元素 2.设计源码 < ...
- directX播放程序
enum PLAYSTATE {Stopped, Paused, Running, Init};PLAYSTATE g_Current=Init;HWND ghApp;HINSTANCE g ...
- CF AIM Tech Round 3 (Div. 2) D - Recover the String
模拟 首先可以求出 0 和 1 的个数 之后按照01 10 的个数贪心安排 细节太多 错的都要哭了 #include<bits/stdc++.h> using namespace std; ...
- Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台
完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...