Wednesday, January 09, 2008

TeProFoKATeMUR - News from The Project Formerly Known as The MySQL UDF Repository

Hi all - boy, have I got news for you!

I would like to announce that The MySQL UDF Repository is no more. The rumour is that its growing popularity has caused it to be noticed by some folks at MySQL AB's legal department, kindly requesting that the project's name be changed to something even cooler.

However, these are just rumours - this is only the internet, so relying on a first-hand source, I can safely confide in you that the project's name and website are being changed mainly out of religious conviction to offer even more and better free UDFs for the MySQL database.

During the transition, the project can be referred to using this unpronounceable symbol:



However, in some circles, people refer to this symbol as TeProFoKATeMUR, which is believed to be an acronym of ThE Project Formerly Known As "ThE MySQL UDF Repository". The real incrowd however prefers to call it simply The Symbol.

The latest news that I heard through the grape vine is that the Project's identity crisis may already be over as I am writing this. I hear people whispering that a new name for the project will be announced shortly, and although the final name is not yet released it will most likely be either one of "The Order of Valiant Knights In Defense of the Honour of Fast-performing Freely Available Functions for MySQL" or simply The UDF Repository For MySQL.

I wouldn't know whether it is good or bad that the project is abandoning it's name. What I do know is that the project's new website is looking way better than the old one.

udf-site

It has got an easier to remember URL too: http://www.mysqludf.org/. The Project's google group has not moved though - it is still available at http://groups.google.com/group/mysql-udf-repository and welcoming new members all the time.

If this is indicative for the other things the project has to offer, then these changes sure are promising. In terms of last developments, it is believed that the group is working on a UDF library for MySQL that wraps around libcurl to enable internet access using MySQL functions:

mysql> select * from mysql.func;
+----------------------------+-----+----------------------+----------+
| name | ret | dl | type |
+----------------------------+-----+----------------------+----------+
| http_request | 0 | lib_mysqludf_curl.so | function |
| lib_mysqludf_curl_info | 0 | lib_mysqludf_curl.so | function |
| http_version_1_0 | 2 | lib_mysqludf_curl.so | function |
| http_version_1_1 | 2 | lib_mysqludf_curl.so | function |
| http_method_get | 2 | lib_mysqludf_curl.so | function |
| http_method_delete | 2 | lib_mysqludf_curl.so | function |
| http_version_none | 2 | lib_mysqludf_curl.so | function |
| http_method_head | 2 | lib_mysqludf_curl.so | function |
| http_method_post | 2 | lib_mysqludf_curl.so | function |
| http_method_put | 2 | lib_mysqludf_curl.so | function |
| http_method_trace | 2 | lib_mysqludf_curl.so | function |
| http_authtype_basic | 2 | lib_mysqludf_curl.so | function |
| http_authtype_digest | 2 | lib_mysqludf_curl.so | function |
| http_authtype_gssnegotiate | 2 | lib_mysqludf_curl.so | function |
| http_authtype_ntlm | 2 | lib_mysqludf_curl.so | function |
| http_authtype_any | 2 | lib_mysqludf_curl.so | function |
| http_authtype_anysafe | 2 | lib_mysqludf_curl.so | function |
| url_encode | 0 | lib_mysqludf_curl.so | function |
| url_query | 0 | lib_mysqludf_curl.so | function |
| url_encode_component | 0 | lib_mysqludf_curl.so | function |
+----------------------------+-----+----------------------+----------+
20 rows in set (0.00 sec)

mysql> select lib_mysqludf_curl_info();
+-----------------------------------------------------------------------------------+
| lib_mysqludf_curl_info() |
+-----------------------------------------------------------------------------------+
| lib_mysqludf_curl version 0.0.1/libcurl/7.16.4 GnuTLS/1.6.3 zlib/1.2.3 libidn/1.0 |
+-----------------------------------------------------------------------------------+
1 row in set (0.11 sec)

mysql> set @page := http_request('http://www.mysqludf.org/' as url);
Query OK, 0 rows affected (0.04 sec)

mysql> select substring_index(substring_index(@page,'</title>',1),'<title>',-1);
+-------------------------------------------------------------------+
| substring_index(substring_index(@page,'</title>',1),'<title>',-1) |
+-------------------------------------------------------------------+
| UDF Repository for MySQL - Home |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)

An interesting year ahead for people interested of MySQL UDFs....

4 comments:

adaniels said...

What is the use of the http_* functions other than http_method_get? Can't you just do:
http_request('http://www.mysqludf.org/' AS url, 'GET' AS http_method, '1.0' AS http_version);

rpbouman said...

Hi Arnold, good question!

Indeed my plan was - and still is - to implement it something like this:

http_request(
'http://www.mysqludf.org/' as url
, http_method('GET')
, http_version('1.0')
);

I still plan on making this work like shown here. But I set up a generalization to smoothly map parameters to curl options, and within this framework it was easier to first provide the helper functions that are there now.

In fact, what I have in mind, these should all be equivalent:

http_request(
'http://www.mysqludf.org/' as url
, http_method('GET')
);

http_request(
'http://www.mysqludf.org/' as url
, 'GET' as method
);

http_request(
'http://www.mysqludf.org/' as url
, http_method_get()
);

So eventually this will all be implemented. But before I do that I want to be able to pass request headers. As it turns out this is slightly different from passing other curl options, and I am still brooding on the right interface or interfaces for that. For example, I would like this to work:

http_request(
'http://www.mysqludf.org/' as url
, http_headers(
encoding
, language
);
);

but this should work too:

http_request(
'http://www.mysqludf.org/' as url
, 'Accept-Encoding: bla
Accept-Language: en-us' as http_headers
);

or this, if the args can be sufficiently unambiguous

http_request(
'http://www.mysqludf.org/' as url
, encoding
, language
);

as well as the equivalent:

http_request(
'http://www.mysqludf.org/' as url
, col1 as encoding
, col1 as language
);

Anonymous said...

A curl/xml mashup would be amazing if anyone gets around to it. It would be so amazingly useful I'm almost afraid to talk about it, for fear that it might upset some people at large ecommerce websites.

rpbouman said...

Hi Anonymous,

can you tell us a little bit more about what you had in mind for the "xml/curl mashup"?

Do you think it has some advantage over a plain LAMP solution with a separate webserver and script?

Kind regards,

Roland

SAP HANA Trick: DISTINCT STRING_AGG

Nowadays, many SQL implementations offer some form of aggregate string concatenation function. Being an aggregate function, it has the effe...