1.MySQL:å¦ä½ç¼åUDF_MySQL
2.curlålibcurlçåºå«ç®ä»
3.webRTC服务器搭建(基于Janus)与Demo运行
4.64位系统上源码编译32位libcurl库
5.MySQL源码下载及安装步骤mysql下载源码
6.C/C++开发人员要了解的码下几大著名C/C++开源库
MySQL:å¦ä½ç¼åUDF_MySQL
bitsCN.com
1.ä»ä¹æ¯UDF
UDF顾åæä¹ï¼å°±æ¯User defined Functionï¼ç¨æ·å®ä¹å½æ°ãæ们ç¥éï¼MySQLæ¬èº«æ¯æå¾å¤å 建çå½æ°ï¼æ¤å¤è¿å¯ä»¥éè¿å建åå¨æ¹æ³æ¥å®ä¹å½æ°ãUDF为ç¨æ·æä¾äºä¸ç§æ´é«æçæ¹å¼æ¥å建å½æ°ã
UDFä¸æ®éå½æ°ç±»ä¼¼ï¼æåæ°ï¼ä¹æè¾åºãå为两ç§ç±»åï¼å次è°ç¨ååèéå½æ°ãåè è½å¤é对æ¯ä¸è¡æ°æ®è¿è¡å¤çï¼åè åç¨äºå¤çGroup Byè¿æ ·çæ åµã
2.为ä»ä¹ç¨UDF
æ¢ç¶MySQLæ¬èº«æä¾äºå¤§éçå½æ°ï¼å¹¶ä¸ä¹æ¯æå®ä¹å½æ°ï¼ä¸ºä»ä¹æ们è¿éè¦UDFå¢ï¼è¿ä¸»è¦åºäºä»¥ä¸å ç¹ï¼
1)UDFçå ¼å®¹æ§å¾å¥½ï¼è¿å¾çäºMySQLçUDFåºæ¬ä¸æ²¡æåå¨
2)æ¯åå¨æ¹æ³å ·ææ´é«çæ§è¡æçï¼å¹¶æ¯æèéå½æ°
3)ç¸æ¯ä¿®æ¹ä»£ç å¢å å½æ°ï¼æ´å æ¹ä¾¿ç®å
å½ç¶UDFä¹æ¯æ缺ç¹çï¼è¿æ¯å 为UDFä¹å¤äºmysqldçå å空é´ä¸ï¼ä¸è°¨æ çå å使ç¨å¾å®¹æ导è´mysqld crashæã
3.å¦ä½ç¼åUDF
UDFçAPIå æ¬
name_init()ï¼
å¨æ§è¡SQLä¹åä¼è¢«è°ç¨ï¼ä¸»è¦åä¸äºåå§åçå·¥ä½ï¼æ¯å¦åé åç»ç¨å°çå åãåå§ååéãæ£æ¥åæ°æ¯å¦åæ³çã
name_deinit()
å¨æ§è¡å®SQLåè°ç¨ï¼å¤§å¤ç¨äºå åæ¸ ççå·¥ä½ãinitådeinitè¿ä¸¤ä¸ªå½æ°é½æ¯å¯éç
name()
UDFç主è¦å¤çå½æ°ï¼å½ä¸ºå次è°ç¨åæ¶ï¼å¯ä»¥å¤çæ¯ä¸è¡çæ°æ®ï¼å½ä¸ºèéå½æ°æ¶ï¼åè¿åGroup byåçèéç»æã
name_add()
å¨æ¯ä¸ªåç»ä¸æ¯è¡è°ç¨
name_clear()
å¨æ¯ä¸ªåç»ä¹åè°ç¨
为äºä¾¿äºç解ï¼è¿éç»åºä¸¤ç§UDFç±»åçAPIè°ç¨å¾ï¼
ä¸é¢å°å°±ä¸è¿°å 个APIè¿è¡è¯¦ç»ç讲解ï¼
1). name_init
ååï¼
my_boolname_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
UDF_INITç»æä½å¦ä¸ï¼
å段
ç±»å
æè¿°
maybe_null
my_bool
å¦æ为1表示该UDFå¯ä»¥è¿åNULL
decimals
unsigned int
è¿åå¼ä¸ºå®æ°æ¶ï¼è¡¨ç¤ºç²¾åº¦ï¼èå´0~
max_length
unsigned long
对äºè¿åå¼ä¸ºINTEGERç±»åå¼ä¸ºï¼å¯¹äºREALç±»åå¼ä¸ºï¼å¯¹äºå符串类åï¼åå¨å½æ°æé¿åæ°çé¿åº¦
ptr
char
*é¢å¤çæéï¼æ们å¯ä»¥å¨è¿éåé å åãéè¿initdä¼ éç»å ¶ä»API
const_item
my_bool
为1表示å½æ°æ»æ¯è¿åç¸åçå¼
extension
void
*ç¨äºæ©å±ï¼
UDF_ARGSç»æä½å¦ä¸ï¼
å段
ç±»å
æè¿°
arg_count
unsigned int
åæ°ä¸ªæ°
arg_type
enum Item_result
*åæ°ç±»åæ°ç»ï¼è®°å½æ¯ä¸ä¸ªåæ°çç±»åï¼å¯ä»¥æ¯STRING_RESULTãREAL_RESULTãINT_RESULT以åDECIMAL_RESULT
args
char
**åæ ·æ¯ä¸ä¸ªæ°ç»ï¼ç¨äºåå¨å®é æ°æ®ã
STRING_RESULTä¸DECIMAL_RESULTç±»å为char*ï¼INT_RESULTç±»å为long long*ï¼REAL_RESULTç±»å为double*ï¼æè ä¸ä¸ªNULLæé
lengths
unsigned long
*æ°ç»ï¼ç¨äºåå¨æ¯ä¸ä¸ªåæ°çé¿åº¦
maybe_null
char
*该æ°ç»ç¨äºè¡¨ææ¯ä¸ªåæ°æ¯å¦å¯ä»¥ä¸ºNULLï¼ä¾å¦
attributes
char
**æ¯ä¸ªåæ°çåå
attribute_lengths
unsigned long
*æ¯ä¸ªåæ°ååçé¿åº¦
extension
void
*ç¨äºæ©å±ï¼
Messageï¼ç¨äºæå°é误信æ¯ï¼è¯¥æéæ¬èº«æä¾é¿åº¦ä¸ºMYSQL_ERRMSG_SIZEï¼æ¥åå¨ä¿¡æ¯ï¼
2).name_deinit
ååï¼
void name_deinit(UDF_INIT*initid)
该å½æ°ä¼è¿è¡ä¸äºå åéæ¾åæ¸ ççå·¥ä½ï¼å¨ä¹åæ们æå°initid->ptrï¼æ们å¯ä»¥å¨è¯¥åºå·è¿è¡å åçå¨æåé ï¼è¿éå°±å¯ä»¥ç´æ¥è¿è¡å åéæ¾ã
3).name()
ååï¼é对ä¸åçè¿åå¼ç±»åï¼æä¸åçå½æ°ååï¼
è¿åå¼ç±»å
å½æ°åå
STRING or DECIMAL
char *name(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
INTEGER
long long name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
REAL
double name(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
å½è¿åå¼ä¸ºSTRINGç±»åæ¶ï¼åæ°resultå¼è¾ä¸ä¸ªbufferæ¥åå¨è¿åå¼ï¼ä½ä¸è¶ è¿åèï¼å¨lengthåæ°ä¸åå¨äºå符串çé¿åº¦ã
æ¯ä¸ªå½æ°ååè¿å æ¬äºis_nullåerroråæ°ï¼å½*is_null被设置为1æ¶ï¼è¿åå¼ä¸ºNULLï¼è®¾ç½®*error为1ï¼è¡¨æåçäºé误ã
4).name_add()åname_clear()
ååï¼
void name_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null,char *error)
void name_clear(UDF_INIT *initid, char *is_null, char *error)
对äºèåç±»åçUDFï¼name_adddåname_clearä¼è¢«åå¤è°ç¨ã
4. 两个ä¾å
ä¸é¢å°ä¸¾ä¸¤ä¸ªç®åçä¾åï¼ä¸ä¸ªå次è°ç¨åå½æ°ï¼ä¸ä¸ªèéç±»åå½æ°ï¼æ¥æè¿°åä¸ä¸ªUDFçè¿ç¨ã
1)æ¥åä¸ä¸ªåæ°ï¼å¹¶è¿å该åæ°çå¼
//åå§å
my_booludf_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
if (args->arg_count != 1){ //æ£æ¥åæ°ä¸ªæ°
strcpy(message,
"udf_intexample() can onlyaccept one argument");
return 1;
}
if (args->arg_type[0] != INT_RESULT){ //æ£æ¥åæ°ç±»å
strcpy(message,
"udf_intexample() argumenthas to be an integer");
return 1;
}
return 0;
}
//æ¸ çæä½
voidudf_int_deinit(UDF_INIT *initid)
{
}
//主å½æ°
long long udf_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
long long num = (*(long long *)args->args[0]); //è·å第ä¸ä¸ªåæ°å¼
return num;
}
2)æ¥åä¸ä¸ªæµ®ç¹æ°ç±»åçåæ°ï¼å¹¶å¯¹æ¯ä¸ªåç»è¿è¡æ±å
//åå§å
my_booludf_floatsum_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
double *total = (double *) malloc (sizeof(double));
if (total == NULL){ //å ååé 失败
strcpy(message,"udf_floatsum:alloc mem failed!");
return 1;
}
*total = 0;
initid->ptr = (char *)total;
if (args->arg_count != 1){ //æ£æ¥åæ°ä¸ªæ°
strcpy(message, "too moreargs,only one!");
return 1;
}
if (args->arg_type[0] != REAL_RESULT){ //æ£æ¥åæ°ç±»å
strcpy(message, "wrongtype");
return 1;
}
initid->decimals = 3; //设置è¿åå¼ç²¾åº¦
return 0;
}
//æ¸ çãéæ¾å¨initå½æ°ä¸åé çå å
voidudf_floatsum_deinit(UDF_INIT *initid)
{
free(initid->ptr);
}
//æ¯ä¸è¡é½ä¼è°ç¨å°è¯¥å½æ°
voidudf_floatsum_add(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
double* float_total;
float_total = (double*)initid->ptr;
if (args->args[0])
*float_total += *(double*)args->args[0];
}
//æ¯ä¸ªåç»å®æåï¼è¿åç»æ
doubleudf_floatsum(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)
{
double* float_total;
float_total = (double *)initid->ptr;
return *float_total;
}
//å¨è¿è¡ä¸ä¸ä¸ªåç»åè°ç¨ï¼è®¾ç½®initid->ptræåçå¼ä¸º0ï¼ä»¥ä¾¿ä¸ä¸æ¬¡åç»ç»è®¡
voidudf_floatsum_clear(UDF_INIT *initid, char *is_null, char *error)
{
double *float_total;
float_total = (double *)initid->ptr;
*float_total = 0;
}
3) Mysql-udf-/statuses/user_timeline/.json?count=1&source=')
UDFå ·æé常é«çèªç±åº¦ï¼ä½ å¯ä»¥ç¼åä½ ä»»ä½æ³è¦å®ç°çåè½å½æ°ï¼çè³å¯ä»¥å¼ç¨MySQLå æ ¸ç代ç ååéã
å½ç¶ï¼UDFä¹æçå±éæ§ï¼å¦ä¸ï¼
a) å¨mysqlåºä¸å¿ é¡»æfunc表ï¼å¹¶ä¸å¨‑‑skip‑grant‑tableså¼å¯çæ åµä¸ï¼UDFä¼è¢«ç¦æ¢ï¼
b) å½UDFæææ¶ï¼æå¯è½ä¼å¯¼è´mysqld crashæï¼
c) ææçUDFçå½æ°å¿ é¡»æ¯çº¿ç¨å®å ¨çï¼å¦æéè¦ç¨å ¨å±åéï¼éè¦å äºæ¥ï¼å°½éå¨name_initä¸åé èµæºï¼å¹¶å¨name_deinitä¸éæ¾
d) éè¦æinsertæé
ä½è zhaiwx
bitsCN.com
curlålibcurlçåºå«ç®ä»
curlç®ä»
curlæ¯å©ç¨URLè¯æ³å¨å½ä»¤è¡æ¹å¼ä¸å·¥ä½çå¼æºæä»¶ä¼ è¾å·¥å ·ã
å®æ¯æå¾å¤åè®®ï¼DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP,
LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet and TFTPã
curlåæ ·æ¯æSSLè¯ä¹¦,HTTP POST, HTTP
PUT,FTPä¸ä¼ ï¼åºäºè¡¨åçHTTPä¸ä¼ ï¼ä»£ç(proxies)ãcookiesãç¨æ·å/å¯ç 认è¯(Basic, Digest,
NTLMç)ãä¸è½½æ件æç¹ç»ä¼ ï¼ä¸è½½æ件æç¹ç»ä¼ (file transfer resume)ï¼/meetecho/jan...获取Janus最新代码。
1.2 安装依赖:依赖库通过命令行或源码安装。码下遇到问题时,码下如libcurl4未安装,码下需解决。码下
1.2.1 命令行安装:确保所有官方推荐的码下js作业源码库都已成功安装。
1.2.2 源码安装:libnice和libwebsocket是码下关键,老版本libnice需手动编译。码下
1.2.3 libsrtp:非必须,码下但推荐升级到最新版以避免bug。码下
1.2.4 usrsctp:用于Data Channel,码下如需消息通道则需要安装。码下
1.3 编译Janus:安装文档生成工具后,码下执行configure,码下查看配置信息。码下
1.4 运行Janus:复制配置文件并进行SSL配置,启用HTTPS和WSS支持。
1.4.1 生成和配置SSL证书
1.4.2 检查运行端口和警告信息
2. Demo运行
网页端Demo在源码的html目录中,使用/downloads/mysql/)下载最新的MySQL源码包。MySQL官方网站提供了多个不同的版本,可以根据需要选择合适的版本。例如,对于Linux系统,可以选择.tar.gz格式的源码包进行下载。第二步:解压MySQL源码
下载完毕之后,手机qqpsd源码就需要解压MySQL源码包。可以使用以下命令解压:
$ tar zxvf mysql-x.x.x.tar.gz
其中,mysql-x.x.x.tar.gz是下载得到的源码包的名称。解压过程可能需要几分钟的时间,具体时间因系统配置不同而有所不同。
第三步:安装依赖库
在编译安装MySQL的时候,需要依赖很多的库文件。这时,需要首先安装这些依赖库:
$ sudo apt-get install build-essential autoconf automake libtool m4 make gcc g++ libncurses5 libncurses5-dev zlib1g-dev libssl-dev libcurl4-openssl-dev libxml2-dev gettext
第四步:配置源码
在完成依赖库安装之后,接下来需要对MySQL源码进行配置。可以使用以下命令执行源码配置:
$ cd mysql-x.x.x
$ cmake .
$ make
其中,第一条命令进入MySQL源码的目录,第二条命令进行配置,第三条命令则是编译源码。
第五步:安装MySQL
经过第四步编译,就可以执行以下安装命令:
$ sudo make install
这样就完成了MySQL的安装。在安装过程中,会提示输入MySQL的相关配置信息,例如root密码等。安装完成后,可以使用以下命令启动MySQL服务:
$ sudo systemctl start mysql
为了避免每次手动启动服务,还可以设置MySQL为系统服务并设置为开机启动:
$ sudo systemctl enable mysql
总结
在这篇文章中,我们介绍了从MySQL官网下载最新的MySQL源码,然后解压、banner切换源码配置源码并安装MySQL的步骤。要注意的是,在安装MySQL时会提示输入一些配置信息,例如root密码等,需要仔细填写。通过这些步骤,我们可以既熟悉MySQL源码的编译与安装,同时也能更好地对MySQL进行深入了解。
C/C++开发人员要了解的几大著名C/C++开源库
在开源软件领域,众多知名的国产软件如暴风音影、腾讯会议、PC版微信等,背后都依托于一些大型的C/C++开源库。本文将深入介绍几种日常工作中常用的C/C++开源库,为开发者提供借鉴与参考。
**多媒体处理开源库FFmpeg
**FFmpeg,享有盛名的音视频多媒体处理开源库,几乎每个做过音视频编解码开发的开发者都熟悉。它包含了广泛而全面的音视频编码协议,如H、H、MPEG4、H等,并提供了一整套音视频处理解决方案。电子贺卡 源码从音视频采集与编码、解码、格式转换到视频抓图和加水印,FFmpeg都能轻松应对。其强大的sdk接口允许开发者直接接收和发送码流,读写文件,进行编解码操作,以及修改解码数据格式等。
FFmpeg基于C语言实现,执行效率接近汇编语言,特别适合对实时性有高要求的音视频处理场景。项目中常包含优化效率的汇编代码,直接控制操作以达到最优性能,不依赖通用编译器生成的汇编代码。
几乎所有的视频播放器都依赖FFmpeg的音视频解码功能,包括暴风影音、QQ影音、腾讯视频、爱奇艺视频、优酷视频等。播放器通过将压缩的视频图像帧解码为并连续显示来实现动态播放效果。帧率达到帧时,人眼就能感知连续动态的播放。
FFmpeg支持多种音视频格式的plc 源码下载相互转换,广泛应用于格式工厂、暴风转码、QQ音影视频格式转换工具、狸窝视频转换器、迅捷视频转换器等软件。
**实时音视频处理开源库WebRTC
**WebRTC,由Google发起的实时音视频通讯开源库,提供了从音视频采集、编码、网络传输到解码渲染的整套解决方案。WebRTC使得开发者能够轻松构建实时音视频应用,无需下载插件,只需编写简单的JavaScript程序即可实现。
WebRTC基于C/C++实现,具有跨平台性能,支持Windows、MAC、iOS和Android等多系统,通过调用相应系统的SDK即可构建音视频应用。虽然称为WebRTC,它不仅支持Web间通讯,还支持Windows、Android和iOS平台。
WebRTC因其出色的音视频效果和网络适应性,广泛应用于视频会议、实时音视频直播等领域。腾讯会议、华为WeLink、字节飞书、阿里钉钉、科达、ZOOM、小鱼易连等均采用了WebRTC方案提供视频会议服务。声网(Agora)基于开源WebRTC库,提供了多个行业的音视频互动解决方案,服务覆盖了包括小米、陌陌、斗鱼、哔哩哔哩、新东方、小红书、HTC VIVE、The Meet Group、Bunch、Yalla等企业和机构。
**Chromium浏览器内核开源库Chromium
**Chromium是Google的久负盛名的浏览器开源项目,作为Chrome浏览器的引擎,其设计理念强调简单、高速、稳定与安全。Chromium采用了WebKit渲染引擎和V8 JavaScript引擎,支持沙盒、黑名单、无痕浏览等功能,提供了稳定与安全的网页浏览环境。
Chromium与Chrome浏览器的关系:Chromium是Google的开源项目,而Chrome是基于Chromium维护的浏览器,添加了更多功能并进行了优化。Chromium面向的是极客、开发人员和体验新功能的用户。
Chromium的根目录下包含了多个文件夹,如Android WebView实现、Chromium浏览器代码、base模块、breakpad崩溃报告、build构建配置、cc合成器实现等。Chromium使用多进程架构,支持多种协议的网络通信,提供丰富的API接口,适合开发者深入研究。
**Chromium嵌入式框架开源库CEF
**CEF,Chromium Embedded Framework,是一个基于Chromium的开源浏览器控件,使用C++实现。它作为浏览器控件嵌入到应用程序中,允许在应用窗口中打开网页。CEF提供了稳定且丰富的API接口,支持Windows、Linux、Mac等多个平台,能与Webkit渲染引擎和HTML5特性兼容。
CEF典型应用场景包括:嵌入浏览器控件到本地应用、创建轻量级浏览器壳、离线渲染Web内容、自动化Web测试等。许多C/S架构的PC桌面程序,如QQ、PC版微信、企业微信、钉钉、飞书、迅雷、爱奇艺视频客户端、优酷视频客户端、有道词典、有道云笔记、MindMaster等,都内嵌了CEF浏览器控件。
**多协议网络传输开源库libcurl
**libcurl是一个跨平台的网络传输库,支持多种协议如ftp、ftps、、ldap等,使用C语言实现,适用于Windows、Unix、Linux等多个操作系统。libcurl提供了一套统一的API接口,简化了网络通信的实现,使得开发者能够轻松实现基于多种协议的数据通信。
**开源操作系统ReactOS
**ReactOS是一款基于Windows NT架构的开源操作系统,目标是实现与Windows XP系统在应用程序和驱动设备兼容性上的完全匹配。使用类似的系统架构和API接口,ReactOS为开发者提供了深入了解Windows系统内部实现的途径。
**开源多媒体播放器VLC
**VLC全称为VideoLan Client,是一款跨平台的多媒体播放器,使用C语言实现,支持多种音视频协议和流媒体功能。VLC不仅支持本地文件播放,还能直接播放网络流媒体视频,以及没有下载完成的文件。VLC还具备视频转码和网络传输能力,可在Windows和Linux上使用C++/Qt编写,OS X版使用Cocoa框架,提供卓越的原生体验。
本文所介绍的开源库和项目,不仅在软件开发领域有着广泛的应用,也是学习C/C++语言、深入理解底层技术实现的重要资源。通过研究这些开源库的源代码,开发者可以学习到进程间通信、线程管理、网络协议实现等关键技术,对提升编程技能大有裨益。