NUOVA FUNZIONE IN MySQL
Writing by corra on Wednesday, 30 of March , 2005 at 7:45 pm
Preso dalla voglia di esplorare l’ignoto, oggi ho scritto un programmino in C++ per aggiungere una nuova funzione a MySQL.
Ho avuto qualche problema dovuto al fatto che non programmavo in tale linguaggio da almeno 8 anni, o giu’ di li’. Poi ho avuto qualche problemino nella ricerca e installazione di alcune librerie che mi mancavano.
Alla fine ho scritto una funzioncina che ho chiamato numcrypt che converte una qualsiasi stringa minuscola (scusate ma non ho inserito funzioni per la gestione del casesensivity) nella stringa con alcuni caratteri convertiti in altri. Esempio: corra diviene c0rr@, benvenuto diviene b3nv3nut0, e cosi’ via.
Utilita’ pressoche’ nulla, ma tanto basta per farmi divertire parecchio.
Ecco il programma
#ifdef STANDARD
#include
#include
typedef unsigned long long ulonglong;
typedef long long longlong;
#else
#include
#include
#endif
#include
#include
#include
#ifdef HAVE_DLOPEN
extern “C” {
my_bool numcrypt_init( UDF_INIT *initid, UDF_ARGS *args, char *message );
void numcrypt_deinit( UDF_INIT *initid );
char *numcrypt( UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error );
}
my_bool numcrypt_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
{
return 0;
}
void numcrypt_deinit(UDF_INIT *initid)
{
}
char *numcrypt(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
{
const char *word = args->args[0];
const char *w_end=word+args->lengths[0];
char *org_result = result;
for (1; word != w_end; word++)
switch (*word)
{
case ‘o’:
*result++ = ‘0′;
break;
case ‘i’:
*result++ = ‘1′;
break;
case ‘e’:
*result++ = ‘3′;
break;
case ‘a’:
*result++ = ‘@’;
break;
case ‘b’:
*result++ = ‘8′;
break;
default:
*result++ = *word;
}
*length= (ulong) (result - org_result);
return org_result;
}
#endif
L’ho compilato con:
gcc -shared -o prova.so prova.cc
Ho quindi copiato prova.so in una directory opportuna affinche’ mysqld potesse linkarlo.
Infine su MySQL e’ bastato fare:
mysql>create function numcrypt returns string soname "prova.so";
E voila! MySQL ha una nuova funzione! Provare per credere:
mysql> select numcrypt('ho scritto la mia prima function in C++ per MySQL, bella di padella');
+---------------------------------------------------------------------------------+
| numcrypt('ho scritto la mia prima function in C++ per MySQL, bella di padella') |
+---------------------------------------------------------------------------------+
| h0 scr1tt0 l@ m1@ pr1m@ funct10n 1n C++ p3r MySQL, 83ll@ d1 p@d3ll@ |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Semplice a dirsi, ma io ci ho perso una mezza giornata.
Le giornate come quella di oggi in cui si “impara qualcosa”, sono quelle che si ricordano sempre con piacere.
Tutta conoscenza buona per il futuro…qualora ce ne fosse bisogno.
PS Grazie a Fabulus per qualche preziosa consulenza.

