404 motivation not found | t_ishidaのブログ

10月/07

31

おまけ、sql整形マクロ(失敗作)

概要

整形してないよりはましと言う程度に、

整形してくれます。

使い方

選択領域のSQL文の改行、インデント付けます。

ログに吐かれたSQL文に手でインデント付けるのが

面倒くさくなって、勢いで作ってしまった。

が、これは本当にしょーもない・・・

ってか、もう、ソース見て突っ込み入れまくって、

僕を辱めて~って感じ。

どうせ構文解析っぽい事するなら、

中途半端にやらないで、

ブロックの開始終了のルール決めて、

木構造作るべきだった。

/*****************************************
 * へなちょこSQL整形
 * @todo
 *  ・改行を(手前|後|しない)の制御入れていない
 *****************************************/

var sql_strings = {
'select' : { current_indent :  0, after_indent : 1  , new_line : 'current' } ,
'where'  : { current_indent : -1, after_indent : 0  , new_line : 'current' } ,
'from'   : { current_indent : -1, after_indent : 0  , new_line : 'current' } ,
'and'    : { current_indent :  0, after_indent : 0  , new_line : 'current' } ,
'or'     : { current_indent :  0, after_indent : 0  , new_line : 'current' } ,
'in'     : { current_indent :  0, after_indent : 1  , new_line : 'current' } ,
'('    : { current_indent :  0, after_indent : 1  , new_line : 'current' } ,
')'    : { current_indent : -1, after_indent : -1 , new_line : 'current' } ,
'*'    : { current_indent :  0, after_indent : 0  , new_line : 'current' } ,
','      : { current_indent :  0, after_indent : 0  , new_line : 'current' } ,
'update' : { current_indent :  0, after_indent : 1  , new_line : 'current' } ,
'set'    : { current_indent :  0, after_indent : 1  , new_line : 'current' } ,
'isnert' : { current_indent :  0, after_indent : 1  , new_line : 'current' } ,
'into'   : { current_indent :  0, after_indent : 1  , new_line : 'current' }
};

var R           = RegExp;
var sql;
if( IsTextSelected ) {
sql = GetSelectedString();
BeginSelect();
} else {
sql = GetLineStr(0);
}
var sql_regex = '^(';
for( var key in sql_strings ) sql_regex += key +'|';
sql_regex = sql_regex.replace(/|$/,'') + ')$';

var buf          = '';
var is_reteral   = false;
var sql_struct = [];
var chars        = sql.replace(/(rn)/g,' ').split('');

for( var i = 0; i < chars.length; i++ ){
if( !is_reteral ) {
if ( chars[i] == "'" ) {
buf += chars[i];
is_reteral = true;
} else if ( chars[i].match( sql_regex ) ) {
sql_struct.push( { type : 'elm', val : buf}  );
sql_struct.push( { type : 'kwd', val : R.$1 }  );
buf = '';
} else if (chars[i] != ' ') {
buf += chars[i];
} else {
if ( buf.match( sql_regex ) ) {
sql_struct.push( { type : 'kwd', val :R.$1 }  );
buf = '';
} else if( buf ) {
sql_struct.push( { type : 'elms', val :buf } );
buf = '';
}
}
} else {
if ( chars[i] == "'") {
if( chars[i + 1] == "'" ) {
buf += chars[i] + chars[i+1];
i++;
} else {
buf += chars[i];
sql_struct.push( { type : 'chars', val : buf } );
buf = '';
is_reteral = false;
}
} else {
buf += chars[i];
}
}
}

var indent_level = 0;
buf = '';
for ( var i = 0; i < sql_struct.length; i++ ) {
if( sql_struct[i].type == 'kwd' ){
//@todo 改行を手前でするか後でするかの機能を追加しないと。
var x = sql_struct[i].val;
if( x.match( /^[()*]$/ ) ) x = '' + x;
var obj = sql_strings[x];
if( buf.replace(/ +/g ,'')  ) say( buf );
say( indentTo( indent_level + obj.current_indent )  + sql_struct[i].val );
indent_level += obj.after_indent;
buf           = indentTo( indent_level );
} else {
//bufにスペース区切りで突っ込む
buf += sql_struct[i].val + ' ';
}
}
function say( s ){
InsText(s + 'n');
}

//
// どこまでインデント?
//
function indentTo( level ){
var ret = '';
for( var i = 0; i < level * 2 ; i++ ) ret = ' ' + ret;
return ret;
}

//
// JSON形式にDumpする。
//
function dump( obj ){
var fmt = {
'number' : function(val){ return val ;          } ,
'string' : function(val){ return '"' + val +'"';} ,
'object' : dump
};
var ret = '{';
for(var key in obj ){
if(ret != '{' ) ret += ',';
ret = ret + key  + ':' + fmt[typeof(obj[key])](obj[key]);
}
return  (ret + '}').replace(',}','};');
}
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< 前置き

マクロ更新 >>

Find it!

Theme Design by devolux.org

Tag Cloud