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