teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

セキュリティの関わる問題なので削除させていただきました。

2018/06/18 10:03

投稿

amaguri
amaguri

スコア227

title CHANGED
@@ -1,1 +1,1 @@
1
- cakephp HiveQlで更新系クエを使用し時 EXPLAINファイルを解析て更新先DB名を抽出するにはどうしらいいか?
1
+ セキュティの関わる問題なので削除させていだきました
body CHANGED
@@ -1,1 +1,1 @@
1
- 削除させていただきます。よろくお願いします。。。。。。。。。。。。
1
+ セキュリティの関わる問題なので削除させていただきまし

1

削除

2018/06/18 10:03

投稿

amaguri
amaguri

スコア227

title CHANGED
File without changes
body CHANGED
@@ -1,226 +1,1 @@
1
- 今回やりたいこと
2
- 作成した管理画面のwriterformから更新系のHiveQlを入力した時
3
- その更新先のデータベースを抽出するにはどういたらいいか?
4
-
5
-
6
-
7
- drop database DB名;
8
-
9
- drop table TB名;
10
- とHiveQlで宣言された時その対象のDB名を抽出する。
11
-
12
-
13
- ただ
14
- クエリの宣言も様々ですし
15
-
16
- use DB名1;
17
- drop database DB名2;
18
- と打たれた時に更新クエリの対象DBはDB名2なのでそこを抽出したいので、その対象のDBはどこかをEXPLAINファイルを解析して抽出できるようにしたいです。
19
-
20
- おそらく既存のコードだけだはそれができないと思いますので
21
- どうすればできるようになるか教えていただきたいです。
22
-
23
- 既存コード
24
- ```php
25
- //EXPLAINファイルを解析してクエリ種類とデータベース名を抽出
26
- function CheckExplainParce($u_userid,$u_id){
27
- $cnt=0;//$cnt=無効
28
- $results=array();//結果=配列()
29
- $cur_db="default";//$cur_db(使用DB)="default"
30
- $sql_query="";//$sql_query=""(クエリ種類?)存在価値ある??
31
- $sql_query_no=0;//$sql_query_no=無効
32
- $exp_file=DIR_RESULT."/${u_userid}/${u_id}.exp";//大事
33
-
34
- if ( !($fp=fopen($exp_file,"r")) ){ return $results; }//fopen()=ファイルをオープン。 $fp=開けた$exp_fileが"r"ではない場合 $resultsを返す。
35
- while(!feof($fp)){//while=ループ文 feof — ファイルポインタがファイル終端に達しているかどうか調べる $fのファイルポインタがファイル終端に達していない場合以下をループする。
36
-
37
-
38
- $data = fgets($fp, 10240); //fgets — ファイルポインタから1行取得する $data = ($fp, 10240)でファイルポインタから1行取得する
39
- $data=str_replace(array("\r\n","\n","\r"), '', $data);//str_replace — 検索文字列に一致したすべての文字列を置換する 配列(改行、改行、改行),空白,fgets($fp, 10240); かいぎょうを空白に変換
40
- if ( eregi("^use ",$data) ){//eregi — 大文字小文字を区別せずに正規表現によるマッチングを行う useからはじまる、$data(どうなってるか不明?)の場合
41
- list($dummy,$cur_db)=split("[ ;]",$data); //list — 配列と同様の形式で、複数の変数への代入を行う split — 正規表現により文字列を分割し、配列に格納する ($dummy,$cur_db("default"?))=("[ ;]"を,$dataに配列に格納する)
42
- }"[ ;]",$data//よくわからない
43
-
44
- //クエリ
45
- if ( eregi("^explain ",$data) ){//explainからはじまる,$data(どうなっているか不明)の場合
46
- $sql_query=substr($data,8);//substr — 文字列の一部分を返す $sql_query=($dataの8)を返す
47
- //$this->log("QUERY=[$sql_query]",LOG_DEBUG);
48
- $sql_query_no++;//$sql_query_noに1を足す
49
- }
50
-
51
- // トークン部分の解析
52
- //
53
- // 【解析仕様】
54
- // ・トークンは『ABSTRACT SYNTAX TREE』行と『STAGE DEPENDENCIES』行の間にある
55
- // ・データベース名及びテーブル名(以降 オブジェクト部)は次のターゲットトークンの次の行以降にインデントされて定義されている
56
- // → TOK_TABNAME、TOK_TABTYPE、TOK_ALTERTABLE、TOK_TABTYPE、TOK_SHOW
57
- // ・オブジェクト部には『データベース名行 + テーブル名行』または『テーブル名行』のパターンがある
58
- // ・オブジェクト部の範囲はターゲットトークンのインデントと同じまたは浅い行の前行までとする
59
- // ・オブジェクト部に別のターゲットトークンがあった場合、オブジェクト部はその前行までとし、別のターゲットトークン以降を新しいオブジェクト部として処理する
60
- //
61
- if (eregi("^ABSTRACT SYNTAX TREE", $data) and !feof($fp)) {//^ABSTRACT SYNTAX TREE"からはじまる$data(どうなってるか不明?)と$fpがファイルポインタがファイル終端に達していない場合
62
- $data = fgets($fp, 10240);//$data = ($fp, 10240)でファイルポインタから次の1行取得する
63
- $data = str_replace(array("\r\n","\n","\r"), '', $data);//配列(改行、改行、改行),空白,fgets($fp, 10240); かいぎょうを空白に変換
64
-
65
- $sql_type="";//$sql_type=空白
66
-
67
- while (!feof($fp)) {//$fのファイルポインタがファイル終端に達していない場合以下をループする。
68
- if (eregi("^STAGE DEPENDENCIES", $data)) { break; }//STAGE DEPENDENCIESからはじまる$data(どうなってるか不明?)の場合、ループ終了
69
-
70
- $sql_type = CommonComponent::CheckTOK2SQLtype(trim($data), $sql_type);//トークン名からクエリに変換 //trim — 文字列の先頭および末尾にあるホワイトスペースを取り除く
71
-
72
- if (eregi("^TOK_TABNAME|^TOK_TABTYPE|^TOK_ALTERTABLE|^TOK_TABTYPE|^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE", trim($data))) {//trim — 文字列の先頭および末尾にあるホワイトスペースを取り除く "^TOK_TABNAME|^TOK_TABTYPE|^TOK_ALTERTABLE|^TOK_TABTYPE|^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE"からはじまる(文字列の先頭および末尾にあるホワイトスペースを取り除いた$data())の場合
73
- $tok_indent = strlen($data) - strlen(ltrim($data));//strlen — 文字列の長さを得る ltrim — 文字列の最初から空白 (もしくはその他の文字) を取り除く $tok_indent = ($data)の長さ - (($data))の文字列の最初から空白 (もしくはその他の文字) を取り除いた長さ
74
- $token = trim($data);// $token =文字列の先頭および末尾にあるホワイトスペースを取り除いた($data)(何が入っているかさっぱり)
75
-
76
- $data = fgets($fp, 10240);//$data = ($fp, 10240)でファイルポインタから次の1行取得する
77
- $data = str_replace(array("\r\n","\n","\r"), '', $data);//配列(改行、改行、改行),空白,fgets($fp, 10240); かいぎょうを空白に変換
78
-
79
- $objects = array();//$objects = 配列()
80
-
81
- while (!feof($fp)) {//fpがファイルポインタがファイル終端に達していない場合
82
- if (eregi("^TOK_TABNAME|^TOK_TABTYPE|^TOK_ALTERTABLE|^TOK_TABTYPE|^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE", trim($data))) { break; }//"^TOK_TABNAME|^TOK_TABTYPE|^TOK_ALTERTABLE|^TOK_TABTYPE|^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE"からはじまる(文字列の先頭および末尾にあるホワイトスペースを取り除いた$data())の場合,ループ終了 break=ループ終了
83
- if ($tok_indent >= (strlen($data) - strlen(ltrim($data)))) { break; }//>= より多いか等しい $tok_indentの長さが($data) -(($data))の文字列の最初から空白 (もしくはその他の文字) を取り除いた長さと等しいかそれより多い場合、ループ終了
84
-
85
- if (!eregi("^TOK_|.", trim($data))) {//^TOK_|.からはじまる文字列の先頭および末尾にあるホワイトスペースを取り除いた$data(どうなってるか不明?)ではない場合
86
- $objects[] = trim($data);//$objectsの[]の中身=先頭および末尾にあるホワイトスペースを取り除いた$data(どうなってるか不明?)
87
- }
88
- $data = fgets($fp, 10240);//$data = ($fp, 10240)でファイルポインタから1行取得する
89
- $data=str_replace(array("\r\n","\n","\r"), '', $data);//配列(改行、改行、改行),空白,fgets($fp, 10240); かいぎょうを空白に変換
90
- }
91
-
92
- if (count($objects) >= 2) {//count — 変数に含まれるすべての要素、 あるいは$objectsつまりarray()に含まれる何かの数を数える $objectsが2と等しいかそれより大きい場合
93
- $results[$cnt]->no = $sql_query_no;
94
- $results[$cnt]->type = $sql_type;
95
- $results[$cnt]->db = $objects[0];
96
- $results[$cnt]->tbl = $objects[1];
97
- $cnt++;
98
- } else if (count($objects) == 1) {//上のifが偽で$objectsつまりarray()が1と等しい場合
99
- $results[$cnt]->no = $sql_query_no;
100
- $results[$cnt]->type = $sql_type;
101
- if (eregi("^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE", $token)) {//"^TOK_SHOW|^TOK_CREATEDATABASE|^TOK_DROPDATABASE"からはじまる $tokenつまり(trim($data)の場合
102
- $results[$cnt]->db = $objects[0];
103
- $results[$cnt]->tbl = "";
104
- } else {//上のifが偽の場合
105
- $results[$cnt]->db = $cur_db;
106
- $results[$cnt]->tbl = $objects[0];
107
- }
108
- $cnt++;
109
- } else if (count($objects) == 0 and eregi("^TOK_SHOW", $token)) {//上のeleseifが偽で$objectsつまりarray()が0と等しい&"^TOK_SHOW"からはじまる $tokenつまり(trim($data)の場合
110
- $results[$cnt]->no = $sql_query_no;
111
- $results[$cnt]->type = $sql_type;
112
- $results[$cnt]->db = $cur_db;
113
- $results[$cnt]->tbl = "";
114
- $cnt++;
115
- }
116
- } else {//上のif,eleseifが全て偽の場合
117
- $data = fgets($fp, 10240);//$data = ($fp, 10240)でファイルポインタから1行取得する
118
- $data = str_replace(array("\r\n","\n","\r"), '', $data);//配列(改行、改行、改行),空白,fgets($fp, 10240);
119
- }
120
- }
121
-
122
- $sql_query = "";//$sql_query = 空白
123
- }
124
- }
125
- fclose($fp);//fclose — オープンされたファイルポインタをクローズする $fpをクローズする
126
- return $results;//$resultsを返す。
127
- }
128
-
129
- ```
130
-
131
- ```php
132
- function CheckTOK2SQLtype($data,$sql_type){
133
- if ( $data == "TOK_DESCTABLE" ){ return "desc"; }
134
- if ( $data == "TOK_CREATETABLE" ){ return "create table"; }
135
- if ( $data == "TOK_TABREF" ){ return "select"; }
136
- if ( $data == "TOK_INSERT" ){ return "insert"; }
137
- if ( $data == "TOK_DROPTABLE" ){ return "drop table"; }
138
- if ( eregi("^TOK_SHOW",$data) ){ return "show"; }
139
- if ( eregi("^TOK_ALTER",$data) ){ return "alter table"; }
140
-
141
- if ( $data == "TOK_CREATEDATABASE" ){ return "create database"; }
142
- if ( $data == "TOK_DROPDATABASE" ){ return "drop database"; }
143
-
144
- return $sql_type;
145
- }
146
- ```
147
-
148
- ```
149
- hive ql
150
- create table wanko(id int,name varchar(50));
151
-
152
-
153
- explainファイル
154
-
155
- OK
156
- ABSTRACT SYNTAX TREE:
157
-
158
- TOK_CREATETABLE
159
- TOK_TABNAME
160
- wanko
161
- TOK_LIKETABLE
162
- TOK_TABCOLLIST
163
- TOK_TABCOL
164
- id
165
- TOK_INT
166
- TOK_TABCOL
167
- name
168
- TOK_VARCHAR
169
- 50
170
-
171
-
172
- STAGE DEPENDENCIES:
173
- Stage-0 is a root stage
174
-
175
- STAGE PLANS:
176
- Stage: Stage-0
177
- Create Table Operator:
178
- Create Table
179
- columns: id int, name varchar(50)
180
- input format: org.apache.hadoop.mapred.TextInputFormat
181
- output format: org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
182
- serde name: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
183
- name: webhive_test1.wanko
184
-
185
- Time taken: 0.141 seconds, Fetched: 29 row(s)
186
-
187
- ```
188
- 以下HiveQl EXPLAINファイル
189
-
190
- DB名
191
- webhive_test1
192
- ・TB wanko
193
-
194
- DB名
195
- webhive_test2
196
- ・TB nyanko
197
-
198
-
199
-
200
- ```
201
- hivepl
202
- drop table wanko;
203
-
204
-
205
- explainファイル
206
-
207
- OK
208
- ABSTRACT SYNTAX TREE:
209
-
210
- TOK_DROPTABLE
211
- TOK_TABNAME
212
- wanko
213
-
214
-
215
- STAGE DEPENDENCIES:
216
- Stage-0 is a root stage
217
-
218
- STAGE PLANS:
219
- Stage: Stage-0
220
- Drop Table Operator:
221
- Drop Table
222
- table: wanko
223
-
224
- Time taken: 0.031 seconds, Fetched: 17 row(s)
225
-
226
- ```
1
+ 削除させていだきます。よろしくお願します。。。。。。。。。。。。。