[scrap] MySQL UDF

from DataBase/MySQL 2008. 4. 28. 16:31
● UDF(User Defined Function : 사용자 정의 함수) 추가 방법
 UDF는 C나 C++언어로 작성해야 합니다.
 따라서 이 절은 C나 C++언어에 기초적인 이해가 있는 분을 대상으로 합니다.
 UDF 만드는 과정 :
  1. C/C++로 함수를 만든다.
  2. 공유 라이브러리로 소스를 컴파일 한다.
  3. MySQL에서 CREATE FUNCTION을 이용하여 만든 함수를 등록시킨다.
 ▶ MySQL과 C/C++의 자료형 구별하기
  MySQL 자료형과 C/C++ 자료형의 관계 MySQL Type C/C++ Type
  ---------------------------------
  STRING char* INTEGET long long REAL double
 ▶
  UDF 만드는 방법 xxx() : UDF의 기본 함수. 실제 함수의 기능을 한다.
  xxx_init() : xxx() 함수를 초기화하는 함수. 메모리를 할당하거나 인자들을 검사한다. 꼭 필요한 것은 아님
  xxx_deinit() : xxx_init()에서 메모리를 할당하였으면 xxx_dainit()에서 할당한 메모리를 해제해야 한다.꼭 필요한 함수는 아니다.
 ▶ xxx() 함수
 ▶ UDF_INIT 구조체 : 다음과 같이 정의되어 있다.
  typedef struct st_udf_init {
   my_bool maybe_null;
   /* 1 if function can return NULL*/
   unsigned int decimals;
   /* for real function */
   unsigned int max_length;
   /* free pointer for function data */
   my_bool const_item;
   /* 0 if result is independent of arguments */
  }
  UDF_INIT;
 ▶ UDF_ARGS : 중요한 구조체로 다음과 같이 정의 되 있다.
  typedef struct st_udf_args {
   unsigned int arg_count;
   /* Number of arguments */
   enum Item_result *arg_type;
   /* Pointer to item_results */
   char **arg니
   /* Pointer to argument */
   unsigned long *lengths;
   /* Length of string arguments */
   char * maybe_null;
   /* Set to 1 for all maybe_null args */
  }
  UDF_ARGS;
 ※ arg_count : 함수로 넘어온 인자들의 개수
 ※ arg_type : 각 인자의 자료형
 ※ args : 실제 함수 인자의 값이 저장되어 있는 변수 UDF를 만드는 소스코드가 있지만 따로 공부하기로 하자!!!
 ▶ 컴파일 방법 : 임의로 getgrade라는 udf를 생각하자!!
  $ gcc -shared -o getgrade.so getgrade.c
  컴파일을 이렇게 하면 getgrade.so 라는 공유 라이브러리 파일이 생기고 이 파일을 /usr/lib 디렉토리로 복사한다.
 ▶ GETGRADE() 등록
  mysql> CREATE FUNCTION GETGRADE RETURN STRING SONAME "getgrade.so";
 ▶ UDF 사용해 보기
,