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;
 }