q4m の queue_wait, queue_end の動作を小変更
現状の queue_wait はオーナーモードで呼び出した時に、勝手に queue_end が走るようになっている。また、queue_end は非オーナーモードでも何度でも呼べる。
よく考えられた仕様なのだが、私が若干特殊な使い方をしようとしていることもあって、queue_wait 時に勝手に queue_end してもらいたくない。要するにオーナーモード時は queue_wait してほしくないということだ。また、queue_end もオーナーモードだけで実行出来てほしい。
※ ちなみに、今自分がオーナーモードに居るかどうかは、
select queue_rowid();
で確認できる。オーナーモードでないと、このSQLはエラーになる。
で、queue_wait, queue_end の動作を上記のように変更する簡単なパッチを作成した。対象バージョンは 0.8.4。
使い方は、q4m のソースバージョンを展開してできる以下のディレクトリの下に、パッチファイルを置いて、
/q4m-0.8.4/src
patch コマンドを実行して、make, make install
$ patch < ha_queue.cc.patch # cd ..; make ; make install
後は、mysql を再起動すると変更が反映される。
パッチは以下。
$ cat ha_queue.cc.patch --- ha_queue.cc.org 2009-04-12 22:51:26.000000000 +0900 +++ ha_queue.cc 2009-04-12 22:54:55.000000000 +0900 @@ -2713,6 +2713,11 @@ args->arg_type[args->arg_count - 1] = INT_RESULT; args->maybe_null[args->arg_count - 1] = 0; } + queue_connection_t *conn; + if ((conn = queue_connection_t::current()) != NULL && conn->owner_mode) { + strcpy(message, "queue_wait(): in owner mode"); + return 1; + } for (int i = max(args->arg_count - 2, 0); i >= 0; i--) { args->arg_type[i] = STRING_RESULT; args->maybe_null[i] = 0; @@ -2743,6 +2748,11 @@ UDF_ARGS *args __attribute__((unused)), char *message __attribute__((unused))) { + queue_connection_t *conn; + if ((conn = queue_connection_t::current()) == NULL || ! conn->owner_mode) { + strcpy(message, "queue_end(): not in owner mode"); + return 1; + } initid->maybe_null = 0; return 0; }