Biên dịch và cài đặt hàm UDF

Một phần của tài liệu Mở rộng truy vấn MySQL và ứng dụng chuyển đổi dữ liệu dạng bảng sang JSON (Trang 49)

Các bước tiếp theo sau khi đã hoàn thành thao tác lập trình các hàm trên chúng ta phải thực hiện các bước sau để có thể sử dụng các hàm đó trong MySQL

 Biên dịch các hàm UDF

 Tải các hàm UDF vào máy chủ MySQL

File cài đặt hàm UDF phải được biên dịch và cài đặt trên máy chủ chạy MySQL quá trình mô tả dưới đây được ví dụ cho các hàm UDF trong file sql/udf_example.c File đi kèm theo mã nguồn MySQL được phát hành.

Để đảm bảo một hàm UDF sẽ được thực thi ở các máy khách thì phải được đồng bộ ở các máy chủ khách ngược lại việc đồng bộ này sẽ bị thất bại khi chúng ta cố gắng thực hiện các hàm này.

File udf_example.c bao gồm các hàm sau

 metaphon() trả về chuỗ metaphone của chuỗi tham số.

 myfunc_double() trả về tổng của các giá trị trong bảng mã ASCII của các ký tự trong tham số chia tổng này cho độ dài của các tham số

 myfunc_int trả về tổng độ dài của các tham số

 lookup() Trả về địa chỉ Ip của máy chủ lưu trữ

 reverse_lookup() Trả về tên của máy từ địa chỉ Ip .

 avgcost() trả về giá trị trung bình của các giá trị.

3.1.5.1 Biên dịch hàm UDF

3.1.5.1.1 Biên dịch hàm UDF trên máy chủ Linux

Bƣớc 1: Tạo ra một File liêk kết động bằng cách sử dụng lệnh sau

shell> gcc -shared -o udf_example.so udf_example.c

Nếu sử dụng câu lênh gcc với lệnh configure và libtool chúng ta có thể sử dụng câu lệnh tạo file *.so đơn giản hơn như sau

shell> make udf_example.la

Sau khi biên dịch thành một đối tượng chia sẻ chứa các hàm UDF chúng ta cần phải cài đặt chúng và thông báo cho MySQL biết. Khi sử dụng câu lệnh gcc để biên dịch file udf_example.c thành file udf_example.so. Việc biên dịch nếu sử dụng câu lệnh make sẽ tạo ra file udf_example.so.0.0.0 trong thư mục libs. Copy các đối tượng chia sẻ vào thư mục plugins của máy chủ.

Đây là những thay đổi dành cho phiên bản MySQL 5.1 đối với các phiên bản cũ hơn đối tượng chia sẻ có thể được tìm thấy ở bấy kỳ thư mục nào bởi hệ thống tìm kiếm trong thư viện liên kết động.

Trên một số hệ thống chương trình ldconfig có thể cấu hình hệ thống liên kết đồng không nhận ra đối tượng chia sẻ trừ khi nó được đặt tên bắt đầu bằng lib trong trường hợp đó ta thay đổi tên file udf_example.so thành libudf_example.so

3.5.1.1.2 Biên dịch hàm UDF trên máy chủ Windows

Trên hệ thống windows để biên dịch các hàm UDF cần thực hiện như sau Bước 1: Tải mã nguồn phát triển của Hệ quản trị CSDL MySQL 5.1

Bước 2: Cài đặt chương trình Cmake nếu cần thiết (phiên bản 2.6 hoặc cao hơn)

Bước 3: Trong mã nguồn tìm kiếm thư mục sql. Trong đó có file udf_example.def và udf_example.c. Copy cả 2 file đó vào thư mục làm việc.

Bước 4: Dùng chương trình Cmake tạo file với nội dung như sau

PROJECT(udf_example)

# Path for MySQL include directory

INCLUDE_DIRECTORIES("c:/mysql/include") ADD_DEFINITIONS("-DHAVE_DLOPEN")

ADD_LIBRARY(udf_example MODULE udf_example.c udf_example.def) TARGET_LINK_LIBRARIES(udf_example wsock32)

Bước 5: Tạo VC project và solution File bằng lệnh Cmake –G “<Generator>” (adsbygoogle = window.adsbygoogle || []).push({});

Sử dụng lệnh cmake-help để liệt kê danh sách các tham số Bước 6: Tạo File udf_example.dll bằng lệnh

devenv udf_example.sln /build Release

3.5.1.2 Cài đặt hàm UDF trên máy chủ MySQL

Sau khi tạo xong đối tượng chia sẻ được cài đặt sẽ có một thông báo của mysql về việc thêm hàm mới với câu lệnh. Nếu đối tượng File có phần hậu tố khác với .so trên hệ thống hãy sửa lại cho đúng.

Lệnh tạo hàm trong mysql

CREATE FUNCTION <tên hàm> RETURNS <kiểu dữ liệu> SONAME <tên File chia sẻ>

Ví dụ:

mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME 'udf_example.so';

mysql> CREATE FUNCTION myfunc_double RETURNS REAL SONAME 'udf_example.so';

mysql> CREATE FUNCTION myfunc_int RETURNS INTEGER SONAME 'udf_example.so';

mysql> CREATE FUNCTION sequence RETURNS INTEGER SONAME 'udf_example.so';

mysql> CREATE FUNCTION lookup RETURNS STRING SONAME

'udf_example.so';

mysql> CREATE FUNCTION reverse_lookup

-> RETURNS STRING SONAME 'udf_example.so'; mysql> CREATE AGGREGATE FUNCTION avgcost

-> RETURNS REAL SONAME 'udf_example.so';

Để xóa hạm sử dụng câu lệnh Drop function : như sau

mysql> DROP FUNCTION metaphon;

mysql> DROP FUNCTION myfunc_double; mysql> DROP FUNCTION myfunc_int; mysql> DROP FUNCTION sequence; mysql> DROP FUNCTION lookup;

mysql> DROP FUNCTION reverse_lookup; mysql> DROP FUNCTION avgcost;

Câu lệnh Create Function và Drop function sẽ cập nhật vào bảng func trong cơ sở dữ liệu mysql. Tên hàm, kiểu và thư viện chia sẻ sẽ được lưu trữ trên bảng. Chúng ta phải có quyền Insert hoặc Delete đối với CSDL Mysql mới có thể tạo và xóa các hàm .

Chúng ta không nên sử dụng lệnh Create Function để thêm một hàm mà trước đó đã tạo ra. Nếu chúng ta muốn cài đặt lại một hàm nên sử dụng câu lệnh xóa trước sau đó cài đặt lại bằng câu lệnh Create function. Chúng ta nên thực hiện như vậy ví dụ nếu chúng ta biên dịch lại một phiên bản mới cho các hàm của chúng ta để mysqld nhận được phiên bản mới nếu không máy chủ tiếp tục sử dụng phiên bản cũ.

Một hàm hoạt động là một hàm được tải lên bằng lệnh Create Function và không bị xóa bởi lệnh Drop function tất cả các hàm sẽ được nạp lại mỗi khi máy chủ khởi động trừ khi sử dụng lệnh mysqld với tham số skip-grant-tables. Trong trường hợp này hàm UDF không được khởi tạo và sẽ không sẵn sàng cho việc sử dụng.

Một phần của tài liệu Mở rộng truy vấn MySQL và ứng dụng chuyển đổi dữ liệu dạng bảng sang JSON (Trang 49)