MySQL ストレージエンジンに直接アクセスするストアドプロシージャ

詳細な説明はこっち: Kazuho@Cybozu Labs: MySQL (InnoDB) に直接アクセスしてタイムライン処理を高速化する話
コードはこっち: http://coderepos.org/share/browser/lang/sql/mysql_timeline

ストアドプロシージャっつーか、ぶっちゃけ UDF なんですが。
とりあえず動くようになった。1行1カラムコピーするコードは、こんな感じで書ける。

struct test_native_t : private mysql_direct_access<test_native_t> {
  
  int add_tables() {
    register_table("test", "message", TL_READ);
    register_table("test", "t", TL_WRITE_CONCURRENT_INSERT);
    return 0;
  }
  
  int run() {
    TABLE *cq = get_table(0);
    TABLE *t = get_table(1);

    /* setup */
    cq->use_all_columns();
    cq->file->info(HA_STATUS_VARIABLE);
    cq->file->ha_rnd_init(1);
    t->use_all_columns();
    t->file->info(HA_STATUS_VARIABLE);
    
    /* copy */
    cq->file->rnd_next(cq->record[0]);
    memset(t->record[0], 0, t->s->null_bytes);
    t->field[0]->store(cq->field[0]->val_int(), true);
    t->file->ha_write_row(t->record[0]);
    
    /* cleanup */
    cq->file->ha_rnd_end();
    
    return 0;
  }
};

呼出はこんな感じ。

mysql> select test_native();