Repository navigation
Expand file tree
/
Copy pathSetParameterGeneratorForCode.dms
More file actions
executable file
·241 lines (206 loc) · 7.63 KB
/
Copy pathSetParameterGeneratorForCode.dms
File metadata and controls
executable file
·241 lines (206 loc) · 7.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
// SetParameterGeneratorForCode
class MainForm extends VCLForm {
var path = WScript.Path + 'scripts\Tool\';
function MainForm(main, setting) {
this.loadFromFile(new File(this.path + 'SetParameterGeneratorForCode.dfm'));
this.main = main;
// 設定読み込み
fromSetting(setting);
}
// フォーム上の設定値をSettingから設定
function fromSetting(setting) {
this.left = setting.windowLeft;
this.top = setting.windowTop;
this.txtSource.text = setting.source;
this.txtTables.text = setting.tables;
this.txtComment.text = setting.comment;
}
// フォーム上の設定値をSettingにコンバート
function toSetting() {
var setting = new Setting();
setting.windowLeft = this.left;
setting.windowTop = this.top;
setting.tables = this.txtTables.text;
setting.source = this.txtSource.text;
setting.comment = this.txtComment.text;
return setting;
}
function chkChange(sender) {
// NULLにチェック状態で、デフォルト値の使用可否を制御する
this.edtDefaultValue.enabled = !sender.checked;
}
}
class Setting {
var path = WScript.Path + 'scripts\Tool\';
var windowLeft;
var windowTop;
var hideDialog;
var existSection;
var tables;
function loadSetting() {
// iniファイル読み込み
var ini = new Ini(new File(this.path + 'SetParameterGeneratorForCode.ini'));
this.windowLeft = ini.read('Window','Left',100);
this.windowTop = ini.read('Window','Top',100);
this.existSection = ini.read('SetParameterGeneratorForCode','ExistSection', 0);
this.tables = ini.read('SetParameterGeneratorForCode','tables', '');
this.source = ini.read('SetParameterGeneratorForCode','Source', 'cmd.Parameters.Add(Me.CreateParameter("@$Name", SqlDbType.$Type, entity.$Name)) ' + "'" + '$Comment');
this.comment = ini.read('SetParameterGeneratorForCode', 'Comment', "'");
return this;
}
function saveSetting() {
var ini = new Ini(new File(this.path + 'SetParameterGeneratorForCode.ini'));
ini.write('Window','Left',this.windowLeft);
ini.write('Window','Top',this.windowTop);
ini.write('SetParameterGeneratorForCode','ExistSection', this.existSection);
ini.write('SetParameterGeneratorForCode','tables', this.tables);
ini.write('SetParameterGeneratorForCode','Source', this.source);
ini.write('SetParameterGeneratorForCode','Comment', this.comment);
ini.update(); // iniファイル更新
}
}
class Generator() {
function process() {
var setting = new Setting().loadSetting();
if (setting.hideDialog) {
// HideDialog設定がtrueならダイアログを出さずに出力する
generate(setting.existSection, setting.tables, setting.defaultValue, setting.defaultNull);
} else {
var frm = new MainForm(true,setting);
if (frm.showModal() === 1) {
// 出力ボタンが押されてfrmを閉じたなら、設定を保存し出力する
setting = frm.toSetting();
setting.saveSetting();
generate(setting.source, setting.tables, setting.comment);
}
}
}
function generate(source, tables, comment) {
var w = application.getActiveWindow();
var noParameterErrorMessage;
var startBlock = '-- ## SetParameterGeneratorForCode generated'; // セクション開始
var sqlWk; // ワーク用
// パラメータ検索対象の文字列を設定
if (w.selectedText) {
// 選択中の文字列があるならそれを検索対象とする
sqlWk = w.selectedText;
noParameterErrorMessage = "選択文字列中にパラメータが存在しません。";
} else {
sqlWk = w.sql;
noParameterErrorMessage = "SQL中にパラメータが存在しません。";
}
// コメントをブランクに置き換える(検索対象から外す)
sqlWk = sqlWk.replace(new RegExp('(/\*.*?\*/)|(--.*?(\r\n|\n))','g'),' ');
// クォーテーションで囲まれた部分をブランクに置き換える(検索対象から外す)
// 念のため正規表現ではなく愚直にやる
var st = -1;
var i = 0;
while((i = sqlWk.indexOf("'",i)) !== -1) {
// 囲みの始まり(かもしれない)クォーテーションを発見した
if (sqlWk.charAt(i+1) == "'") {
// 連続しているなら無視
i += 2; //インデックスを2つ進める
} else {
if (st == -1) {
// 見つけたのが囲み開始のクォーテーションなら
st = i;
i++;
} else {
// 見つけたのが囲み終了のクォーテーションなら囲まれている範囲をブランクに置き換える
sqlWk = sqlWk.substr(0,st-1) + " " + sqlWk.substr(i + 1);
i = st + 2;
st = -1;
}
}
}
// sql中からパラメータを探し列挙
// ここではVBScriptの正規表現を使用する(exec()のgオプション使用時の後方参照に不具合らしきものを見つけたので)
var regVbs = WScript.CreateObject("VBScript.RegExp");
regVbs.pattern = '[^\w\-][@|:]([\w\-]+)';
regVbs.global = true;
regVbs.multiline = true;
var pNames = []; // SQL中に発見したパラメータ名の配列
var ma = regVbs.execute(sqlWk);
if (!isNull(ma)) {
for(var i=0 ; i<ma.count ; i++) {
if (!isUndefined(ma[i].submatches[0])) {
var pn = ma[i].submatches[0];
var existFlg = false;
for (var j=0 ; j<pNames.length ; j++) {
if (pNames[j] === pn) {
// 既にパラメータ名が存在する
existFlg = true;
break;
}
}
if (!existFlg) {
pNames.push(pn);
}
}
}
}
// DBに接続
var conn = application.dbTree.getSelectedDatabaseConnection();
var pTypes = [];
var pComments = [];
var tableArr = tables.split(',');
var rs = null;
for (t = 0; t < tableArr.length; t++) {
try {
rs = conn.getTableColumnList(tableArr[t].trim());
} catch(e) {
alert('テーブルが見つかりません。対象のDBに接続してください。');
exit();
}
for (var i = 0; i < rs.length; i++) {
for (var j = 0; j < pNames.length; j++) {
if (rs[i].columnName == pNames[j]) {
pTypes[j] = rs[i].dataType.replace(/\(.*/, '').replace(/ .*/, '');
pComments[j] = rs[i].comment;
}
}
}
}
var sources = [];
var beginCommentIndexes = [];
for(var i=0 ; i<pNames.length ; i++) {
var pName = pNames[i];
var pType = pTypes[i] != null ? pTypes[i] : '';
var pComment = pComments[i] != null ? pComments[i] : '';
sources[i] = source.replace(/\$Name/g, pName).replace(/\$Type/g, pType).replace(/\$Comment/g, pComment);
}
// ソースコードを整形
if (comment.length > 0) {
var len = sources.length;
var maxIndex = -1;
var searchStr = comment;
var searchRegex = new RegExp(searchStr);
for (var i = 0; i < len; i++) {
beginCommentIndexes[i] = sources[i].search(searchStr);
if (maxIndex < beginCommentIndexes[i]) {
maxIndex = beginCommentIndexes[i];
}
}
for (var i = 0; i < len; i++) {
var spaceLength = maxIndex - beginCommentIndexes[i] + 1;
if (spaceLength > 0) {
sources[i] = sources[i].replace(searchRegex, new Array(spaceLength).join(' ') + searchStr);
}
}
}
if (sources.length > 0) {
Clipboard.asText = sources.join("\n");
alert("クリップボードにソースコードを貼り付けました。");
} else {
alert(noParameterErrorMessage);
}
}
}
(function(){
var w = application.getActiveWindow();
if (w.formType == "A5SqlEditor" ) {
new Generator().process();
} else {
alert("SQLエディタのタブを選択して下さい。");
}
})();