dbやtableの名前の取得方法(続編)

こんな関数がありました。

  • make_db_list
  • make_table_list

でもって、コソコソ調べたら。。。THDを引数に取る関数を実装して、その中にこんな感じのコードを書くと、、、

  List<char> files;
  INDEX_FIELD_VALUES idx_field_vals;
  bool with_i_schema;
  bool is_wild_value = 0;

  int retVal = make_db_list(thd, &files, &idx_field_vals,
                            &with_i_schema, is_wild_value);
  printf("make_db_list returns %d\n", retVal);

  char *file_name;
  List_iterator_fast<char> it(files);
  while ((file_name=it++)) {
    printf("file_name=%s\n", file_name);
  }

わーいわーい!こんな感じで"SHOW DATABASES"の同類ができましたよ!

make_db_list returns 0
file_name=information_schema
file_name=mysql
file_name=test

さらにデータベース名やそのpathを指定して、find_files関数を呼ぶと、、

    List<char> tables;
    char path[200];
    strxmov(path, mysql_data_home, "/", db_name, NullS);
    printf("path=%s\n", path);
    retVal = find_files(thd, &tables, db_name, path, 0, 0);
    List_iterator_fast<char> it2(tables);
    char *tbl_name;
    while ((tbl_name= it2++)) {
      printf("tbl_name=%s\n", tbl_name);
    }

わーいわーい!テーブル名もやっとこ取れましたよ!!

db_name=test
path=./test
tbl_name=t1
tbl_name=t2

で、とりあえず取れるのは良いとして、次は方法についてなのですが、はっきり言ってこの方法がベストかどうかは微妙です。

そもそも、MySQL 5.0系からはinformation_schemaが導入されていて、SHOW系コマンドは内部的にはinformation_schemaに対するSELECTを実行するような実装になっています。

従って、上記のような方法を取らずに、information_schemaから引っ張ってくるのが良いのではという考えもあります。しかし、以下のような条件があると、、、

  • MySQL 4.0系、4.1系に対しても適用可能なpatchを作りたい
  • information_schemaが持っていないような情報を取れるSHOW系コマンドを実装したい

information_schemaの利用だけでは要件を満たせないことになるので、独自に取得したろーかという話も出てくるのです。このあたりは、もうちょい進めながら考えようかとおもいまふ。