Tự viết function cho mysql sử dụng Ansi C
Khi các hàm được cung cấp sắn của mysql là không đủ dùng .
Chúng ta nghĩ đến việc viết function hoặc procedure .
Nếu việc viết procedure hướng đến việc sử lý dữ liệu nội tại của database .
Thì việc viết function lại hướng đến các tiện ích làm việc trên các kiểu dữ liệu cơ bản của mysql .
Trong bài viết này mình sẽ hướng dẫn viết function ( để extends mysql ) .
1.Chuẩn bị thư viện.
sudo apt-get install libmysql++-dev
2.Dùng một Editor để soạn file C
include header :
#include
Viết hàm init
int hamming_dist_init(UDF_INIT *initid, UDF_ARGS *args,
char *message)
Trong ví dụ này mình viết hàm hamming_dist nên hàm init cho nó sẽ là hamming_dist_init .
Hàm này sẽ được gọi ngay khi hàm chính được gọi . Thường việc tiền sử lý sẽ được viết ở đây ( ví dụ như việc check param).
int hamming_dist_init(UDF_INIT *initid, UDF_ARGS *args,
char *message)
{
if (args->arg_count != 2)
{
strcpy(message,”hamming_dist() requires two arguments”);
return 1;
}
return 0;
}
Kiểm tra xem số tham số có =2 hay không . Nếu khác 2 thì thôgn báo lỗi và kết thúc hàm .
Viết hàm chính
Hàm chính có mẫu như sau :
long long hamming_dist(UDF_INIT *initid, UDF_ARGS *args,char *is_null, char *error)
Đây là mẫ hàm trả về kiểu long64 nếu định trả về String , mẫu sẽ khác . Hay muốn viết các hàm Aggregate sẽ dùng mẫu này :
void xxx_reset(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error);
Đầy đủ hàm mình đang viết :
long long hamming_dist(UDF_INIT *initid, UDF_ARGS *args,char *is_null, char *error)
{uint64_t a1 = *((uint64_t*) args->args[0]);
uint64_t a2 = *((uint64_t*) args->args[1]);uint32_t v1 = a1^a2;
uint32_t v2 = (a1^a2)>>32;v1 = v1 – ((v1>>1) & 0×55555555);
v2 = v2 – ((v2>>1) & 0×55555555);
v1 = (v1 & 0×33333333) + ((v1>>2) & 0×33333333);
v2 = (v2 & 0×33333333) + ((v2>>2) & 0×33333333);
int c1 = (((v1 + (v1>>4)) & 0xF0F0F0F) * 0×1010101) >> 24;
int c2 = (((v2 + (v2>>4)) & 0xF0F0F0F) * 0×1010101) >> 24;return c1+c2;
}
Mình thực hiện một số tính toán rồi trả về kiểu long long (64 bit)
Các bạn có thể viết hàm đơn giản như hàm add
long long add(UDF_INIT *initid, UDF_ARGS *args,char *is_null, char *error)
{
long a = *((long*) args->args[0]);
long b = *((long*) args->args[0]);
return a+b;
}
Nhìn qua 2 hàm trên các bạn có thể hiểu cách lấy tham số .(args <– nó đấy ).
3.Compile :
gcc -shared -o hamming.so -std=c99 $(mysql_config –cflags) hamming_dist.c $(mysql_config –libs)
Nhớ sửa tên source file và output file nhé ( xem lại bài trước về các compile http://i-php.net/2010/10/ket-noi-den-csdl-mysql-su-dung/ )
4.Triển khai .
copy file hamming.so vừa tạo ra được vào thu mục plugin của mysql .
sudo cp hamming.so /usr/lib/mysql/plugin/
Trên các OS khác thì thư mục này sẽ khác nhau , và cái này có thể config được trong file my.conf ( hoặc mysql.ini )
Thực hiện lệnh tạo function trong mysql
CREATE FUNCTION hamming_dist RETURNS INT SONAME ‘hamming.so’;
5.Kiểm tra select hamming_dist(1121234123123,131231313131234);
Chúc các bạn thành công .
(i-php.net)
Các tin khác cùng chuyên mục
- Kỹ thuật lập trình HTML/CSS mới nhất 2020 - 04
- Funny web2.0
- Giải thử vài câu đề thi tốt nghiệp ptth môn toán
- MỘT NGÀY PHẢI KHÁC MỌI NGÀY
- Level 1 - Lập trình hướng đối tượng (P2)
- Level 1 - Lập trình hướng đối tượng (P1)
- PHP 5.3, Phần 3: Không gian tên
- PHP 5.3, Phần 2: Bao đóng và các hàm lambda
- PHP 5.3, Phần 1: Các thay đổi về giao diện đối tượng
- Tăng tốc độ xử lý CSDL MySQL
Liên kết
Tin được quan tâm nhất
- Ant Group của Jack Ma hé lộ bước đi đầu tiên...
- Ô tô giao hàng tự lái sẽ bắt đầu hoạt...
- Clip cô giáo phạt học sinh tự ném vỡ...
- Tiền điện tử lớn thứ ba thế giới Ripple...
- Joe Biden kêu gọi hiện đại hóa hệ thống...
- Viettel khai trương nền tảng Hồ sơ sức khỏe...
- Các hãng di động nên ngừng cãi nhau về việc...
- Công nghệ AI của Alibaba và Tân Hoa Xã: Đối...
- Một năm đáng thất vọng của YouTube trên toàn...
- EVN lần đầu diễn tập an toàn thông tin mạng...
- Đây là chiếc iPhone được mua nhiều nhất...
- Bộ Tài chính ra quy chế mới về quản lý, sử...
- Cập nhật nhãn mới giúp người tiêu dùng...
- Kiếm tiền từ 5G: Thách thức lớn nhất của...
- "Hô biến" iPhone thành cục đá: Có thể bị...
- Phí trước bạ ô tô không gia hạn giảm, sẽ...
- Tại sao Apple chế tạo ô tô?
- Viettel cung cấp dịch vụ 5G tại thành phố...
- Đội KingTigerPrawn của Hàn Quốc giành giải...
- Thứ trưởng Phan Tâm: “Triển khai hạ tầng 5G...
- Nhiều mẫu iPhone chính hãng đang khan hàng tại...
- Mỹ quy định drone cần có ID, trang bị đèn ban...
- Trung Quốc điều tra Alibaba: Bài học cho Jack Ma...
- Chuyên gia dự báo 5 xu hướng tấn công mạng...
- Apple MagSafe vẫn còn rất nửa vời
- Các tỉnh cuối cùng đã ngừng phát sóng...
- 55/63 tỉnh thành sử dụng Zalo trong cải cách...
- Headline: CR7: “Mong muốn của tôi là luôn...
- Samsung dự kiến xuất xưởng dưới 300 triệu...
- Vì sao Trung Quốc ‘sờ gáy’ Alibaba?
- Những smartphone được người Việt mua nhiều...
- Vì sao mua hàng ở sàn TMĐT Mỹ không cần...
- Đằng sau bức ảnh động viên Đà Nẵng chiến...
- VNPT cung cấp MyTV Box 2020 - Tính năng nâng cấp...
- Clip hành động ghê tởm của shipper trước khi...
- Các đội thi chung kết WhiteHat Grand Prix 6 phát...