Logo

MySQL自定义函数(User Define Function)开发实例——发送TCP/UDP消息

photo

2024年06月25日

开发背景

当数据库中某个字段的值改为特定值时,实时发送消息通知到其他系统。

实现思路

监控数据库中特定字段值的变化可以用数据库触发器实现。还需要实现一个自定义的函数,接收一个字符串参数,然后将这个字符传通过udp消息发送到指定端口。

在触发器中执行这个自定义函数并在其他系统中监听指定端口的消息。从而实现数据库内容变化通知到其他系统的功能。

开发前准备

MySQL自定义函数仅支持C/C++开发,所以需要一些C/C++的基础。

这里以在Windows系统使用Visual Studio2022开发进行介绍。

添加依赖项libmysql.lib、ws2_32.lib,引入头文件”mysql.h” <winsock2.h>  <ws2tcpip.h>

自定义函数命名为SendG,使用方式为SendG(‘abcde’) 

MySQL自定义函数设计说明

提前说明:本文只介绍满足前面提到的需要的情况下涉及到的自定义函数设计方法。

这里要涉及两个方法

bool SendG_init(UDF_INIT* init, UDF_ARGS* args, char* message)   这个后缀_init方法显然是一个前置函数

void SendG(UDF_INIT* init, UDF_ARGS* args, char* result, unsigned long* length, char* is_null, char* error) 主体函数

当我们每次调用SendG(‘abcde’) 首先会调用 _init后缀的函数,然后才会调用主体函数中的业务逻辑。因此我们可以在SendG_init函数中检查参数是否正确,在SendG函数中执行具体的业务逻辑。

至于UDF_INIT   UDF_ARGS等结构的使用方法则不用担心,MySQL的头文件中有详细介绍,基本一看就能大概知道怎么用,例如以下是UDF_ARGS的定义:

具体实现代码

#include "pch.h"
#include <winsock2.h>
#include "mysql.h"
#include <ws2tcpip.h>
extern "C" {
    __declspec(dllexport)
        bool SendG_init(UDF_INIT* init, UDF_ARGS* args, char* message) {
        if (args->arg_count != 1) 
            return true;
        else if (args->arg_type[0] != STRING_RESULT)
            return true;
        return false;
    }
    __declspec(dllexport)
    void SendG(UDF_INIT* init, UDF_ARGS* args, char* result, unsigned long* length, char* is_null, char* error) {
        SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
        sockaddr_in RecvAddr{};
        RecvAddr.sin_family = AF_INET;
        RecvAddr.sin_port = htons(54321);
        inet_pton(AF_INET, "127.0.0.1", &RecvAddr.sin_addr);
        *is_null = 1;
        sendto(sock, args->args[0], args->lengths[0], 0, (SOCKADDR*)&RecvAddr,sizeof(RecvAddr));
        closesocket(sock);
    }
}

我们在SendG_init中检查参数的个数和类型是否正确,SendG_init的返回值true代表有错误,false才表示没问题。

然后会执行SendG主体函数,这里创建一个SOCKET使用UDP协议将传入的字符串发送给本机的54321端口,最后关闭SOCKET。

这里需要注意两点:

1、函数必须使用extern “C”导出C语言格式的函数

2、在这个例子中SendG方法是不需要有执行结果的,所以它的返回值类型是void,其次因为没有返回值所以这里必须使用*is_null=1允许方法返回NULL。如果有返回值则正常返回具体的类型,可选的返回值类型在Item_result中定            义它与UDF_ARGS在同一个头文件中,这里就不具体展开了。

自定义函数的部署与卸载

首先将生成的dll放在MySQL的plugin目录中,可使用select @@plugin_dir查询。然后使用CREATE FUNCTION SendG RETURNS string SONAME ‘SUDP.dll’  部署函数

现在执行select SendG(‘abcde’)就会向54321端口发送abcde了。可以让 SendG接受两个参数,把端口号作为第二个参数,这样SendG函数的功能就更加灵活了。

卸载使用 DROP FUNCTION SendG;

总结

MySQL的UDF提供了开发自定义函数的功能,实际在这里我们可以执行我们自己写的任意代码,别说发UDP/TCP消息了就是发邮件都行。

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它
所有附件
该文章没有附件.
本文为原创文章,请注意保留出处!
C#获取当前路径 2024年06月25日

C#中,有很多方式可以获取程序运行的当前目录,常见的方式有:1、stringstrPath1=...C#获取当前路径

shell 编程简记 2024年06月25日

1.环境变量环境变量是指操作系统中记录一些配置信息的变量,这些变量在不同的程序之间共享,可以被操...shell编程简记

热门文章

无法握住的故土 在我们心灵最温暖的角落,总有一寸土地是属于故乡的。虽然我们看似已远离故土,可骨子里对故乡的依恋却是从未冷却过。我们无论漂泊他乡,还是在繁华都市平步青云,可故乡的悠悠情思总会潜入梦乡与你缠绵。是儿时那一缕缕茉莉的清香萦绕在梦境,也是邻家那已锈迹斑斑的铁壶里,开出艳丽的花儿在梦的边缘摇曳。故土就这样根深蒂固地在我们的灵魂深处烙下深深的印记。 作者:Pastore Antonio
1596 浏览量
EWS(Exchange Service)基本使用(获取个人会议,会议室会议内容,会议室列表,发送会议,修改会议,删除会议) 最近公司要求和exchange服务对接,所以稍微研究了一下官方文档,做出以下总结,欢迎大家补充。先...EWS(ExchangeService)基本使用(获取个人会议,会议室会议内容,会议室列表,发送会议,修改会议,删除会议) 作者:Pastore Antonio
1585 浏览量
Sql Server 部署SSIS包完成远程数据传输 本篇介绍如何使用SSIS和作业完成自动更新目标数据任务。**温馨提示:如需转载本文,请注明...SqlServer部署SSIS包完成远程数据传输 作者:Pastore Antonio
1579 浏览量
SQL Server AG集群启动不起来的临时自救大招 背景前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群...SQLServerAG集群启动不起来的临时自救大招 作者:Pastore Antonio
1573 浏览量
windows 下安装 memcahce 官网上并未提供Memcached的Windows平台安装包,我们可以使用以下链接来下载,你需...windows下安装memcahce 作者:Pastore Antonio
1567 浏览量