MySQL是一个流行的开源数据库管理系统,它支持多种操作系统,包括Linux和Windows。然而,对于Windows移动设备,需要一个特殊的ODBC驱动程序,称为"MySql Connector",以便通过任何Microsoft DB API(如ADO)来使用它。此外,每当MySQL有重大更新时,例如最近的4.1版本,都需要重新安装这个驱动程序。这不仅增加了客户端机器的维护负担,而且对于希望实现"点击即运行"业务模式的应用程序来说,也是一个问题。
为了解决这个问题,开发了一个轻量级的MySQL客户端,它不需要安装任何额外的驱动程序或运行时环境。这个客户端利用了Windows自带的msvcrt.dll库,这样就不需要为了像strlen()这样的函数而分发新的Visual C++运行时环境。希望微软有一天能够通过服务包来分发这些运行时环境,使它们更加普及。
在Windows上编译MySQL的源代码是一个挑战,因为它缺少项目文件,而且构建系统也相当复杂。经过多次尝试,决定实现一个最小化的本地MySQL客户端,它不需要libmysql库的大部分功能。这样做的好处是,可以做一些之前无法想象的事情,比如在不需要重新认证的情况下重用SQL连接,或者将非查询命令镜像到更多的SQL服务器上,从而实现即时且事务性的备份。
此外,还可以实现负载均衡,通过询问SQL服务器的CPU和内存使用情况,将SQL查询发送到负载最轻的服务器上。这种客户端非常小,不依赖外部运行时环境,因此很容易移植到移动设备上。
这个微型客户端的基本组成部分如下:
这是一个非常基础的实现,满足了项目第一阶段的所有需求。它处理了所有常见的数据类型,如字符串、整数和日期。源代码中的文档链接是部分的。
#include <windows.h>
#include <wincrypt.h>
#include <commctrl.h>
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"crypt32.lib")
#pragma comment(lib,"comctl32.lib")
char *user = "root";
BYTE* pasw = (BYTE*)"your_password";
HWND list; BYTE temp[20], resp[20], *chal;
DWORD WINAPI Sql(void *command, void *onvalue=0, void *onfield=0) {
// ...省略代码...
}
void OnValue(char *txt, int row, int col, int typ) {
// ...省略代码...
}
void OnField(char *txt, int row, int col, int len) {
// ...省略代码...
}
long GetLong(char *txt) {
return atol(txt);
}
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmnd, int show) {
// ...省略代码...
}