Wednesday, June 24, 2009

MySQL: хранимые процедуры

Некоторые "особенности" работы с функциями/процедурами/триггерами в MySQL.

  1. Внутри блока BEGIN-END должен соблюдаться следующий порядок :
    BEGIN
    DECLARE variables;
    DECLARE cursors;
    DECLARE conditions;
    DECLARE handlers;
    ...
    END;

  2. Если какая-то команда (например PREPARE) не допускается в функции (триггере), то вызвать из неё процедуру, содержащую такую команду также не получится.


  3. PREPARE/EXECUTE не работает с локальными переменными - только глобальные переменные (типа @a, @b).

    Это работать не будет:
    DECLARE sql VARCHAR(32) DEFAULT 'SELECT 1';
    PREPARE stmt FROM sql;

    То же самое относится и к EXECUTE .. USING ..


  4. FETCH [cursor_name] INTO .. не работает с глобальными переменными.  (!?)

    Это работать не будет:
    FETCH mycursor INTO @a;

  5. PREPARE не может использоваться для объявления курсора.


  6. COMMIT не может использоваться в функциях и триггерах (соответственно, см п.2).


  7. Тело процедуры нельзя изменить с помощью ALTER PROCEDURE. Для этого надо последовательно выполнить DROP PROCEDURE и CREATE PROCEDURE.

Thursday, June 18, 2009

Perl: дебаг LWP::UserAgent и семейства

Довольно часто при использовании LWP (LWP::Useragent, WWW::Mechanize, etc.) возникает необходимость просмотра/анализа HTTP-заголовков. Для firefox есть плагин - Live HTTP Headers. А в этой заметке я расскажу, как получить нечто подобное в Perl.

Cредствами самого LWP::UserAgent, печатать HTTP-заголовки можно так:

use LWP::UserAgent;
my $ua = LWP::UserAgent->new();

$ua->add_handler(
"request_send",
sub {
my $r = shift;
print "==>n", $r->as_string;
return;
},
);
$ua->add_handler(
"response_done",
sub {
my $r = shift;
print "<==n", $r->status_line, "n", $r->headers->as_string, "n";
},
);

$ua->get("http://google.com");


В результате получаем:
==>
GET http://google.com
User-Agent: libwww-perl/5.834

<==
301 Moved Permanently
Cache-Control: public, max-age=2592000
Connection: close
Date: Wed, 29 Sep 2010 20:11:29 GMT
Location: http://www.google.com/
Server: gws
Content-Length: 219
Content-Type: text/html; charset=UTF-8
Expires: Fri, 29 Oct 2010 20:11:29 GMT
Client-Date: Wed, 29 Sep 2010 20:11:29 GMT
Client-Peer: 74.125.232.20:80
Client-Response-Num: 1
Title: 301 Moved
X-XSS-Protection: 1; mode=block

==>
GET http://www.google.com/
User-Agent: libwww-perl/5.834
...



Для разнообразия, еще один способ с использованием модуля Aspect:

use Aspect;

my $pointcut = call 'LWP::UserAgent::send_request';

before {
print "==>n", shift->params->[1]->as_string;
} $pointcut;

after {
my $resp = shift->return_value;
print "<==n", $resp->status_line, "n", $resp->headers->as_string, "n";
} $pointcut;

my $ua = LWP::UserAgent->new();
$ua->get("http://google.com");


В результате печатается то же самое.

Wednesday, June 17, 2009

калькулятор в unix

В любой unix-системе есть много чего, что можно заюзать в качестве калькулятора.
Вот несколько примеров:

  1. bc. Без аргументов запускается интерактивный калькулятор.  Можно использовать и так: echo "2^32-1" | bc

  2. Интерпретаторы (awk, perl, python, ruby, etc). Можно использовать как в интерактивном режиме, так и для одиночных выражений. Мне лично удобней python :)

  3. javascript. В адресной строке браузера можно вычислить выражение указав его после псевдопротокола javascript:, например javascript:5%2. В консоли браузера можно писать только выражение.

  4. mysql. SELECT 1024 + POW(2, 10);

  5. vim, bash, expr. Подходят для целочисленных вычислений.

  6. ...