Xử lý tham số trong 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 46)

Tham số UDF_ARGS là một cấu trúc có các thành viên như sau :

unsigned int arg_count

Tham số này chỉ số lượng các tham số kiểm tra giá trị này tại hàm khởi tạo nếu cần thiết Ví dụ

if (args->arg_count != 2) {

strcpy(message,"XXX() requires two arguments"); return 1;

}

Đối với các thành viên khác của UDF_ARGS là mảng có giá trị khởi tạo là 0 chỉ số của mảng bắt đầu từ 0 đến args->arg_count – 1.

enum Item_result *arg_type

Là một con trỏ mảng bao gồm kiểu của tham số có thể là string_result, int_result, real_result và decimal_result.

Để đảm bảo kiểu của tham số đưa vào là đúng chúng ta sẽ kiểm tra biến mảng arg_type trong hàm khởi tạo ví dụ như sau:

if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT)

{

strcpy(message,"XXX() requires a string and an integer"); return 1;}

Các tham số có kiểu là decimal_result sẽ trả về kiểu String và có thể điều khiển chúng tương tự như string_result

Một cách khác để yêu cầu các tham số trong các hàm phải thuộc kiểu dữ liệu nhất định chúng ta có thể sử dụng hàm khởi tạo để thiết lập các thành phần arg_type là kiểu dữ liệu mong muốn. Điều này làm cho MySQL buộc các tham số trong hàm xxx() thuộc kiểu dữ liệu khai báo. Ví dụ để 2 tham số đầu có thể là một giá trị chuỗi ký tự hoặc kiểu số nguyên ta thực hiện hàm việc này trong hàm xxx_init() như sau:

args->arg_type[0] = STRING_RESULT;

Chính xác với tham số thuộc kiểu thập phân chẳng hạn 1.3 hoặc giá trị cột có kiểu dữ liệu decimal có thể khai báo là decimal_result. Tuy nhiên giá trị đó cũng có thể coi là kiểu String nếu muốn nhận là là kiểu số trong hàm khởi tạo có thể sử dụng giá trị real_result Ví dụ

args->arg_type[2] = REAL_RESULT;

char **args

args->args giao tiếp thông tin với hàm khởi tạo về các đối số được truyền vào trong các hàm. Ví dụ args->args[i] sẽ chỉ giá trị của đối số thứ i nếu không có đối số thứ i thì args->args[i] có giá trị là 0. Đối số có thể là một biểu thức hoặc hằng ví dụ như args->args[i] =3 hoặc args->args[i] =4*7-2 hoặc args->args[i] =sin(3.14)

Với mỗi lời gọi hàm chính args->args các đối số thực tế được truyền vào là các dòng được xử lý.

Nếu đối số thứ i là Null thù args->args[i] là một con trỏ null nếu đối số đó không phải là Null nó có thể được tham chiếu như sau :

 Một đối số có kiểu là STRING_RESULTđược đưa ra là một con trỏ chuỗi ký tự cộng với độ dài của chuỗi ký tự đó nó có là dữ liệu dạng nhị phân hoặc độ lớn có kiểu dữ liệu dạng nhị phân nội dung chuỗ ký tự được lưu trữ trong biến as args->args[i] và độ dài chuối đó được lưu trữ trong biến args->lengths[i].

 Với đối số kiểu INT_RESULT chúng ta phải thiết lập args->args[i] là một giá trị thuộc kiểu long:

long long int_val;

int_val = *((long long*) args->args[i]);

 Với kiểu đố số là REAL_RESULT, phải thiết lập args->args[i] là một giá trị kiểu double:

double real_val;

real_val = *((double*) args->args[i]);

 Với đối số kiểu DECIMAL_RESULT tương tự như đối số kiểu STRING_RESULT

 Không có đối số kiểu ROW_RESULT (adsbygoogle = window.adsbygoogle || []).push({});

unsigned long *lengths

Với mỗi hàm khởi tạo độ dài của mảng được xác định là độ dài lớn nhất của các tham số được truyền vào chúng ta không thể thay đổi chúng ví dụ khi hàm chính được gọi lengthes gồm độ dài thực tế của đối số được truyền vào ở đậy là dòng hiện tại đang

xử lý. với các tham số kiểu INT_RESULT or REAL_RESULT, lengths vẫn là giá trị lớn nhất của độ dài các tham số .

char *maybe_null

Với hàm khởi tạo là một mảng xác định các đối số truyền vào có thể là null (0 nếu không null ngược lại là 1

 char **attributes

args->attributes bao gồm thông tin về tên của các đối số với đối số thứ i, thuộc tính tên của nó được lưu trữ tại args->attributes[i] và thuộc args- >attribute_lengths[i].Mặc định tên của tham số là tên của biểu thức có thể sử dụng có thể sử dụng từ khóa [AS] alias_name trong trường hợp muốn để tên tham số là alias_name. Giá trị của attributes cho mỗi tham số phụ thuộc vào bí danh mà nó đưa ra.

Giả sử một hàm UDF là my_udf được gọi như sau

SELECT my_udf(expr1, expr2 AS alias1, expr3 alias2);

Trong trường hợp này attributes và attribute_lengths có giá trị như sau:

args->attributes[0] = "expr1" args->attribute_lengths[0] = 5 args->attributes[1] = "alias1" args->attribute_lengths[1] = 6 args->attributes[2] = "alias2" args->attribute_lengths[2] = 6

unsigned long *attribute_lengths

Mảng attribute_lengths xác định độ dài của tên các tham số

Kiểu dữ liệu Tên biến thành viên Mô tả

unsigned int arg_count Số lượng tham số

enum Item_result * arg_type Mảng mô tả kiểu dữ liệu của tham số

char ** args Chỉ giá trị của tham số

unsigned long * lengths Mảng chỉ độ dài của tham số

char * maybe_null Mảng các giá của tham số nếu 1

tham số có thể là null

char ** attributes Mảng con trỏ chỉ các thuộc tính tên của tham số

unsigned long * attribute_lengths Mảng chỉ độ dài của tên của tham số

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 46)