2013-04-24 23 views
1

我需要調用觸發器的外部腳本來攔截數據庫中的每個插入。 這是因爲我無法爲這個值進行輪詢,我正在編寫一個帶有ARM架構和只有250MB內存的嵌入式系統。 觸發器是正確的選擇,而觸發的代碼工作得很好,我得到:使用mySQL觸發器調用外部腳本在ubuntu上WHITOUT sys_exec ARMHF

FUNCTION mydb.sys_exec does not exist (MySQL error code: 1305, SQLState: 42000) 

所以我想安裝此: https://github.com/mysqludf/lib_mysqludf_sys

,但它讓我:

ERROR: You need libmysqlclient development software installed 
to be able to compile this UDF, on Debian/Ubuntu just run: 
apt-get install libmysqlclient15-dev 

所以如果我型

sudo apt-get install libmysqlclient15-dev 

我得到: 注意,選擇'libmysqlclient-dev'而不是'libmysqlclient15-dev'

當然,它不是正確的軟件包,因爲它不起作用。 包含在git中的.so文件是爲intelx86編譯的。

任何人有想法? 編譯git中的.c是很不可能的,因爲大量缺失的依賴關係。

或..我怎樣才能執行外部腳本從觸發器沒有sys_exec?

PS:對於完整性,這是觸發腳本:

DELIMITER @@

CREATE TRIGGER command_controller 
AFTER INSERT ON myDB.foo 
FOR EACH ROW 
BEGIN 
DECLARE cmd CHAR(255); 
DECLARE result int(10); 
SET cmd='./foo '; 
SET result = sys_eval(cmd); 
END; 
@@ 
DELIMITER ; 

回答

3

這裏有一個最小的版本,爲我的作品:

#include <string.h> 
#include <stdlib.h> 
#include <mysql.h> 

my_bool sys_exec_init(
    UDF_INIT *initid 
, UDF_ARGS *args 
, char *message 
){ 
    unsigned int i=0; 
    if(args->arg_count == 1 
    && args->arg_type[i]==STRING_RESULT){ 
    return 0; 
    } else { 
    strcpy(
     message 
    , "Expected exactly one string type parameter" 
    ); 
    return 1; 
    } 
} 
void sys_exec_deinit(
    UDF_INIT *initid 
){ 
} 
my_ulonglong sys_exec(
    UDF_INIT *initid 
, UDF_ARGS *args 
, char *is_null 
, char *error 
){ 
    return system(args->args[0]); 
} 

我這個編譯line:

gcc -Wall -I include -I /home/rbouman/mysql/mysql-5.6.10-linux-glibc2.5-x86_64/include -shared -fPIC -o sys_exec.so sys_exec.c