mysql_udf_tc 未测试发布版
03-18
受伤了,没时间折腾,先发布未测试版,欢迎各种bug提交,康复后继续
mysql数据同步到tc的table表,直接写文件,php读文件查询。
看手册,不解释。
有问题加qq 176300676
- #ifdef STANDARD
- #include <stdlib .h>
- #include <stdio .h>
- #include <string .h>
- #ifdef __WIN__
- typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
- typedef __int64 longlong;
- #else
- typedef unsigned long long ulonglong;
- typedef long long longlong;
- #endif /*__WIN__*/
- #else
- #include <my_global .h>
- #include <my_sys .h>
- #include <m_string .h>
- #endif
- #include <mysql .h>
- #include <ctype .h>
- #include <float .h>
- #include <tcutil .h>
- #include <tctdb .h>
- #include <stdlib .h>
- #include <stdbool .h>
- #include <stdint .h>
- #ifdef HAVE_DLOPEN
- /* TC_CREATE */
- my_bool tc_create_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
- {
- return 0;
- }
- void tc_create_deinit(UDF_INIT *initid)
- {
- }
- char * tc_create(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
- {
- TCTDB *tdb;
- int ecode;
- char *errormsg;
- char *tcfile;
- tdb = tctdbnew();
- tcfile = args->args[0];
- /* open the database */
- if(!tctdbopen(tdb, tcfile, TDBOWRITER | TDBOCREAT))
- {
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "error: %s\n", tctdberrmsg(ecode));
- }
- else
- {
- sprintf(errormsg, "OK");
- }
- *length = strlen(errormsg);
- return errormsg;
- }
- /* TC_SET */
- my_bool tc_set_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
- {
- if (args->arg_count < 3)
- {
- strcpy(message,"Wrong arguments to metaphon; Use the source");
- return 1;
- }
- return 0;
- }
- void tc_set_deinit(UDF_INIT *initid)
- {
- }
- char *tc_set(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
- {
- char *dbfile,*errormsg,pkbuf[200];
- TCTDB *tdb;
- TCMAP *cols;
- int i = 0;
- int ecode,pksiz;
- memcpy(result, "result string", 13);
- *length = 13;
- dbfile = args->args[0];
- tdb = tctdbnew();
- if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
- }
- cols = tcmapnew();
- for(i = 2;i<args ->arg_count;i++)
- {
- tcmapput2(cols, args->attributes[i], args->args[i]);
- }
- pksiz = sprintf(pkbuf,"%s",args->attributes[1]);
- if(!tctdbput(tdb, pkbuf, pksiz, cols)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg,"put error: %s\n", tctdberrmsg(ecode));
- }
- else
- {
- errormsg = "OK";
- }
- tcmapdel(cols);
- if(!tctdbclose(tdb)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
- }
- *length = strlen(errormsg);
- return errormsg;
- }
- /* TC_DEL */
- my_bool tc_del_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
- {
- if (args->arg_count < 2)
- {
- strcpy(message,"Wrong arguments to metaphon; Use the source");
- return 1;
- }
- return 0;
- }
- void tc_del_deinit(UDF_INIT *initid)
- {
- }
- char * tc_del(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
- {
- TCTDB *tdb;
- char *dbfile,*errormsg,*pkbuf;
- int ecode;
- dbfile = args->args[0];
- pkbuf = args->args[1];
- tdb = tctdbnew();
- if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
- }
- if(!tctdbout2(tdb,pkbuf))
- {
- ecode = tctdbecode(tdb);
- sprintf(errormsg,"delete error: %s\n", tctdberrmsg(ecode));
- }
- else
- {
- errormsg = "OK";
- }
- if(!tctdbclose(tdb)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
- }
- *length = strlen(errormsg);
- return errormsg;
- }
- /* TC_SETINDEX */
- my_bool tc_sexindex_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
- {
- if (args->arg_count < 2)
- {
- strcpy(message,"Wrong arguments to metaphon; Use the source");
- return 1;
- }
- return 0;
- }
- void tc_sexindex_deinit(UDF_INIT *initid)
- {
- }
- char * tc_sexindex(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
- {
- TCTDB *tdb;
- char *dbfile,*errormsg,*pkname[200];
- int ecode,indextype;
- dbfile = args->args[0];
- *pkname = args->attributes[1];
- tdb = tctdbnew();
- if(!tctdbopen(tdb, dbfile, TDBOWRITER | TDBOCREAT)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "open error: %s\n", tctdberrmsg(ecode));
- }
- if(args->args[2]=="string")
- {
- indextype = TDBITLEXICAL;
- }
- else if(args->args[2]=="int")
- {
- indextype = TDBITDECIMAL;
- }
- if(!tctdbsetindex(tdb,*pkname,indextype))
- {
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "setindex error: %s\n", tctdberrmsg(ecode));
- }
- if(!tctdbclose(tdb)){
- ecode = tctdbecode(tdb);
- sprintf(errormsg, "close error: %s\n", tctdberrmsg(ecode));
- }
- *length = strlen(errormsg);
- return errormsg;
- }
- #endif /* HAVE_DLOPEN */
- </args></stdint></stdbool></stdlib></tctdb></tcutil></float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>
编译安装脚本,自理
- #!/bin/sh
- gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I/opt/tokyocabinet-1.4.46/include -I. -shared -L/usr/lib -ltokyocabinet -lz -lbz2 -lrt -lpthread -lm -lc udf_tt.c -o lib_mysqludf_tt.so
- #gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -static udf_tt.c -o lib_mysqludf_tt.so
- cp -f ./lib_mysqludf_tt.so /usr/lib/lib_mysqludf_tt.so
- service mysqld restart
使用:
- drop function tc_create;
- create function tc_create returns string soname 'lib_mysqludf_tt.so';
- drop function tc_set;
- create function tc_set returns string soname 'lib_mysqludf_tt.so';
- select tc_set("/home/sunboyu/test",`User`,`Host`) FROM user limit 1