2008년 01월 04일
웹개발 할때 좋은 노하우
| 출처 : http://okjsp.pe.kr/bbs?act=VIEW&seq=70567&bbs=bbs6&keyfield=&keyword=&pg |
"맡은일에대한 보람(?), 그리고 하고싶은일을 한다는 약간의 즐거움(?)이 --> 저의 경우엔 회사에서 항상 두가지 일을 함께 함니다. 첫 째는 윗사람이 시키는 그리고 또 하나는 저만의 프로젝트가 있습니다. ㅋㅋ( 매뚜기 프로그래머들의
디버거를 포함한 소스 편집기( IDE ) 정도는 준비해야 합니다. 특히 디버거는 이제, 자신만의 프로젝트를 위한 최소한의 환경이 완성되었다면 슬슬 작업을
cvs( wincvs 추천 )으로 자신이 작성한 소스를 관리하세요. 소스를 서버에서
첫째 에서 셋째에 대한 실제 예제를 보여 드리면( 저의 노하우를 알려드립니다 ㅋ )
jsp 프로그램중에 비지니스 처리 부분에서는 대부분 SQL 문이 포함됩니다. 예를 들어
select col_1, col_2, col_3, --------------------------------------
jsp 에서 다음 [ 보기 2 ] 처럼 sql 문자 변수로 저장해서 사용하게 됩니다. ---------------------------------------------------- sql = "select col_1, col_2, col_3,"; ----------------------------------------------------
이렇게 공백처리에 오류가 있기 때문입니다. 뿐만 아니라 변수 sql 문자열 처리 이런 사소한 오류 때문에 디버깅을 한다면 ""엄청난"" 시간 손실이 옵니다. 이런 SQL 문을 안전하게 주석처리하는 웹 프로그램은 간단히 작성할 수 있습니다. 최종 결과로 enter 코드 뒤에 공백이 추가된 sql 문자열 이 다음 처럼 생성됩니다.
sql = "select col_1, col_2, col_3, "; -----------------------------------------------------
둘 째 효과적인 소스코딩 : 사실 저처럼 프로그램 코딩을 전문적으로 하는 사람은 코드 하나 하나에 신경을 select col_1, col_2, col_3, col_4, col_5, col_6 from tb_test where col_2 = 'cod01' or col_1 = 'key01' 몇 십줄에서 100 라인이 넘는 sql 이 이렇게 출력되면 SQL 문장의 오류를 찾는건 ----------------------------------------------------------------- sql = "\n select col_1, col_2, col_3 ";
-----------------------------------------------------------------
우선 "3) EOL과 column 구분자" 부분의 EOL ( \n : End of Line ) 처리를 SQL 문자열 또 한 SQL 오류검사만을 위한 것이아니라 간혹 이전에 작성된 SQL 구문이 필요한 경우가
sql 변수에서 생성된 SQL 구분은 정상적으로 실행됩니다. 단순 주석처리하면서 SQL
그렇다면, 모든 sql 문자열 작업을 이렇게 할수 있겠습니까 ?. 현실적으로 힘듭니다. 대부분의 업무용 SQL 은 위에서 작성된 [ 보기 1~3 ] 처럼 단순하지 않습니다. 다양한 ----------------------------------------------------------------- String cod = request.getParameter("cod") sql = "\n select col_1, col_2, col_3 "; sql += "\n where col_2 = '" + cod + "' "; // 1) if( key.equal("Y") { -----------------------------------------------------------------
그리고 SQL 구문 "or col_1 = 'key01'" 은 jsp 의 parameter 로 넘어온 key 값이 이런 SQL 작성은 "절대" 피해야할 소스의 표본중에서 *대표*급니다. ㅋㅋㅋㅋ 아래 sql 작성에 사용된 tip 은 sql 문자열 생성을 간결하게 처리하는 방법을 보여주는 ----------------------------------------------------------------- String cod = request.getParameter("cod")
-----------------------------------------------------------------
1) 의 설명은 그다지 필요 없네요. 그냥 parameter 로 넘오온 cod 변수의 값을 문자열 -------------------------------------------- 으로 실행됩니다. 또한 변수 key 값이 'Y' 가 아닌 경우 col_2 = col_2 로 조건절에 -------------------------------------------- 제가 이 방법을 SQL의 절대 고수인 저의 스승에게 전수 받은날 전 한동안 어리석었던 이 벙법은 온갖 다양한 응용이 가능합니다. web 화면에서 combo box 로 넘오는 parameter 처리서 부터 like 구문 처리, 숫자, 문자
간혹 개발자 분들이 2) 에서 작성된 decode 구문이 SQL 문법상 편법이며 바람직하지 과연 그럴까요. 이 설명은 DB index에 관련과 연관이 있습니다. 결론적으로 decode 구문은 SQL 실행에
저의 SQL 절대 고수인 스승왈 ~ "만일 index 가 col_1, col_2 두 컬럼으로 작성되었을 경우 col_1 의 조건이 없다면 실제, decode 를 사용한 SQL 조건절 생성은 비지니스 로직 처리를 하는 jsp 프로그램 decode 방법을 사용하면 거미줄처럼 복잡하게 얽인 SQL 생성 문자열이 한 눈에 해석이 "스승왈 너두 하산할때가 되었느냐 ? 꺅 아니옵니다 ㅋㅋ" [ 보기 6 ] 프로그램을 보면, sql 문자열 작성에서 사용되는 변수들인 cod, key 는 ( jsp 에서 처리는 ) String cod1 = request.getParameter("cod1") System.out.println( "cod1 " + cod1 ); -------------------------------------------------------
----------------------------------------------------------------- <%@ page import="java.util.Enumeration" %> Hashtable hpam = new Hashtable(); //1) sql = "\n select col_1, col_2, col_3 "; %> -----------------------------------------------------------------
-----------------------------------------------------------------
cvs 사용은 단순 백업용 프로그램이기 보다는 프로젝트를 관리하는 하나의 필수품 ( 대부분 FSF 자유소프트 들이고 간혹 라이센스 등록이 있지만 강제적이지 않는 것들만 주 : 아래 나열된 프로그램을 모두 설치하려는 뜻은 아님니다. 설치 만 하더라도
* 가상 머신과 unix/mingw 환경 vmware : http://www.vm-ware.co.kr/download/( 상용 프로그램 ) msys : http://www.mingw.org/ dev-cpp : 홈피: http://www.bloodshed.net/dev/devcpp.html
* MS 관련 Tool : 웹 작업을 주로 하므로 지금은.. ㅋ Platform SDK 2003 : http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm Visual C++ 2005 Express : http://msdn.microsoft.com/vstudio/express/visualC/default.aspx Microsoft Script Editor 10.0 : MSE7
Apache : http://www.apache.org/ JSEclipse_1.5.1 : http://www.interaktonline.com/Products/Eclipse/JSEclipse/Try-Download/ Paint.NET 2.62 : http://www.eecs.wsu.edu/paint.net/ Python 2.4 : http://www.python.org ActivePerl : 공식홈피 : http://www.perl.com/download.csp
기타 : powertoys : http://ftp.iinet.net.au/pub/microsoft/powertoys/ * 개발정보 홈피 OKJSP : http://www.okjsp.pe.kr/
* 외국 http://www.w3schools.com/ : www 과 관련된 40 여개의 언어에 대한 설명 http://technet.microsoft.com/ : MS 기술정보 사이트 http://www.sourceforge.org/ : 오픈 소스 개발 리소스
http://kldp.org/ : 국내 대표 gnu 관련 번역/프로젝트 사이트
문장의 말투가 매끄럽지 못함이 송그스럽나이다~~~ 막쓰다보니 아니 사실은 수정을 해도 그 모양입니다 ~ ㅋ [Your user agent does not support frames or is currently configured not to display frames. However, you may visit the related document.] |
| 검색어()제거 |
tag는 login 후 사용하실 수 있습니다.
- 감사합니다.
제가 소개한 내용은 강요하려는 것이 아님니다. 수많은 개발방법론 중에
한가지를 소개한 내용입니다. ㅎㅎ
그리고 작성된 내용을 그대로 사용하라는 것도 결코 아님이다.
사실 이런 방법론은 각자의 선택이고 습관이기 때문에 바꾸기 무척 어렵습니다.
제가 하려고자 한 것은 재미있는 것들이 코딩속에 있다는 것을 말하고 십었습니다.
웹특성상 매우큰 이미지들이 서버에서 수많은 클라이언트 웹 브라우저로 전송됩니다.
javascritp 크기가 조금 크다는 것은 퍼퍼먼스에 전혀 영향이 가지않으며 jsp 에서
공백이 좀 추가된다고해서 퍼퍼먼스에 영양은 주지도 않습니다.
이것은 수많은 스트레스 테스트에서 얻어낸 결과입니다.
수많은 날밤을 세면서 좀더 잼있는 코딩이 되도록 ㅋㅋ - OTL
- 2006-05-21 01:59:06
- x
- 대단하시군요...
보통 개발자들 나름의 개발방법론 가지고 있는 사람들 별로 없는거 같던데..
아닌가? -_-;
sql스승도 있었습니까? 하하
코딩이건, sql 이건, 고수들과 같이 작업하는것 하나만으로도
배울것이 무척 많죠... - 울대개방
- 2006-05-21 15:30:44
- x
- 좋은 정보 감사드립니다...
퍼갑니다...^^ - 아스키
- 2006-05-21 18:34:50
- x
- 좋은 자료 감사합니다...
- netker
- 2006-05-21 22:55:15
- x
- javascritp > javascript 송구스러운 딴지입니다^^;
좋은자료 감사합니다 - gedo
- 2006-05-22 10:57:32
- x
- 좋은자료 고마워요
블로그로 좀 퍼가겠습니다~ - 지나가다가
- 2006-05-22 13:40:08
- x
- 본좌급이시네요 ㅎㅎ
오픈소스에 이어 오픈 노하우 시대가 오는건가요~!! - jisqo
- 2006-05-22 15:47:43
- x
- 암만 봐도 좋은 글입니다. ^^
이런 분들이 계셔서 세상은 살만 한것 아닐까요? ^^ - 협객
- 2006-05-22 23:13:36
- x
- 재미있었습니다. 마지막부분에 하나 첨언하자면....
cod1이 여러개 넘어오는 경우가 있습니다.
Hashtable을 이용하든지, ArrayList나 Vector를 추가적으로 더 이용해서 Parsing을 하신 다음에, 처리부분에서 cod1.get("cod", i) 하셔서 입력된 값들을 찾아낼 수 있도록 하는 것도 생각해볼 만 할 겁니다. OTL님 정도면 쉽게 구현하실 수 있으시겠네요. 저는 ArrayList의 HashMap과 HashMap의 ArrayList 두가지 형태로 모두 구현해봤었는데, 어느 것이 나은지는 아직 판단이 안섭니다.
DB에서 조회한 결과를 저장할 때에는 HashMap의 ArrayList로 처리하는 것이 좋고, (각 record는 HashMap에 담고, 그것을 ArrayList에 담으면 되죠.) HttpRequest로 넘어오는 데이터는 ArrayList의 HashMap으로 처리하는 것이 좋았던 것 같습니다. ( request.getParameterValues() 가 배열로 넘어오기 때문에 HashMap 처리보다 ArrayList 처리가 쉬웠습니다. ^^) 하나의 Data Class를 통일된 Data Type으로 사용하려고 하다보니 DB 기준으로 처리하도록 Request Parsing하는 부분을 처리하긴 했습니다만.. :)
전반적으로 좋은 내용 감사합니다. 특히 replaceAll 좋습니다. decode가 MS SQL에서도 된다는 것은 오늘 처음 알았네요.. 진작에 사용할 것을.. ^^
select *
from table_a
where 1=1 <=== 이 부분 주목!
and condition
형태로 쓰는 것도 조건절을 주석처리하며 테스트하는데 상당히 좋은 것 같습니다. - solace
- 2006-05-23 10:17:54
- x
decode가 안되면 이렇게 하면 될까요
col_1 = decode(':col_1:', 'Y', 'key01', col_1 )
--->
col_1 = (case when ':col_1'='Y' then 'key_01' else col_1 end )
아니면 함수를 작성할 까요. 좋은 의견이 자꾸자꾸 생겼으면 합니다.- ㅎㅎ
- 2006-05-23 11:14:32
- x
- 저도 블로그로 좀 가져 갈께여.. ^^a (blog.naver.com/spyrogira256)
- 윤재진
- 2006-05-23 14:14:42
- x
- 좋은 정보 감사합니다...그런데... jsEclipce 상용아닌가요? 상용으로 알고 있었는데...
버전관리 SVN 추천합니다. 아 jsp 개발툴로 myEclipse 도 좋은데 상용이라..ㅋ - 땡이
- 2006-05-24 11:25:42
- x
팁 : Microsoft Script Debugger : scd10en.exe 오류 위치 찾지 못할때.
간혹 Microsoft Script Debugger 에서 실제 오류가난 script 위치를 정확히 찾지 않는
경우가 있습니다. 그런 경우는 100%(99.9% ㅋ) 는 당므처럼 <body> tag에 onload
event 함수가 사용된 경우입니다.
<body onload="onload();" >
이 경우 오류위치를 <body onload="onload();" > 으로 찾아줍니다. 실제로는 onload() 함수
안에서 호출된 다른 함수오류인데 말이지요.
이런 경우 간단하게 onload event 함수를 삭제하고 실행하세요 ㅋ
<body> <!-- onload="onload();" -->
이렇게 onload 함수를 주석처리하면 javascript 구문오류난 곳으로 정확히 디버가가
찾아줍니다.
이 간단한걸 몰라서 엄라나 헤멨는지 ㅎㅎ- ㅎㅎ
- 2006-05-24 13:07:33
- x
- 나름대로 다들 삽질을 피하기 위한 몸부림들이 하나씩은 있네요.... ㅋㅋㅋ
지저분한 sql
toad -> ctrl+shift+f ... formatter....
로 정리....
prepareStatement에게 줄 sql은
ultraEditor -> alt+c .... column mode....
죄송합니다만 제 생각엔
될 수 있음 첨 습관 들일 때 부터 String보다는
StringBuffer로 습관을 들이는게 좋지 않을까요?
뭐 진짜 성능 차이나봐야 얼마나 나겠습니까? ㅋㅋㅋ....
그치만 티끌 모아 태산은 이야기가 틀릴 듯 싶습니다.
그리고 PreparedStatement로 습관을 들이는 것이 좋지 않을까 싶습니다.
될 수 있음 오라클서버에게 파싱오버헤드를 줄이는 것이 좋겠지요.
이 건 아마 필수죠.... 다른 디비야 모르겠습니다만 오라클은 특히... - 글 잘 봤습니다.
- 2006-05-25 11:37:02
- x
PreparedStatement 가 뭔가요 헤헤 -.-;;
뒹굴 뒹굴..
데굴 데굴..- ㅋㅋ
- 2006-05-25 11:45:58
- x
- 참.... 중요한 습관 하나 더 sql 실행과 동시에 where절 바뀌면 바로바로 플랜 떠봅시다~~~ ㅋㅋㅋㅋ
옵티마이저가 말 안들으면 바로바로 훈수 둬야죠... - 글 잘 봤습니다.
- 2006-05-25 11:47:40
- x
- 기능 :
SQL 문장을 JSP 변수로 변환하는 html 화면입니다.
사용 :
아래 ohmysqlstr.html 소스를 긁어서 저장하시고 실행하면 간단한 화면이
실행됩니다. 윗 부분은 textarea 영역으로 SQL 문장을 입력하시고, [ 변환 ]
버튼을 누르면 화면 아랫쪽 div 영역에 JSP 변수로 사용할 수 있도록 출력됩니다.
[ 결과복사 ] 버튼을 누르면 변환된 내용이 클립보드에 저장됩니다. jsp 소스에서
붙여넣기로 사용하시면 됩니다.
화면이 너무 단순해서 변수명이나 주석삭제등 간단한 것을 추가했습니다. ㅋㅋ
( 주석은 informix SQL 주석인 -- 만 삭제 됩니다 )
제한 :
WinXP 에서 MS IE 6.0 와 FireFox 1.0.6 에서만 테스트되었습니다.
< ohmysqlstr.html >
===============================================================================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Oh My SQL String Tool kkk</title>
<style type="text/css">
.textarea { font-family:"굴림체"; font-size:9pt; width:100%; height:50%; background-color:#f2f2f2; BORDER-RIGHT: #567442 1px solid; BORDER-TOP: #c0c0c0 1px solid;BORDER-LEFT: #c0c0c0 1px solid;BORDER-BOTTOM: #567442 1px solid; padding:3px; }
.div { font-family:"굴림체"; font-size:9pt; width:100%; height:50%; padding:3px; overflow:auto; text-align:justify; }
</style>
<script language = 'javascript'>
var g_rmcomm = false; // true : 주석제거
var g_strtype = false; // true : 문자버퍼 변수 사용
var g_strname = ""; // SQL 문자변수명
var g_eol = ""; // end of line
function main_onload() {
main_onResize();
g_eol = geteol();
g_rmcomm = rmcomm.checked;
g_strtype = usebff.checked;
g_strname = (valunm.value == "" ) ? "sql" : valunm.value.trim();
}
function main_onResize() {
h = main.clientHeight/2 - 30;
if( 0 < h ) sqlinput.style.height = h;
}
function rmcomm_onclick( chk ) { g_rmcomm = chk; }
function usebff_onclick( chk ) { g_strtype = chk; }
function valunm_onchange( val ) { g_strname = val; }
function geteol() {
var ie = false, mz = false;
var eol = "";
ie = /msie/ig.test(navigator.userAgent);
mz = !ie && /mozilla\/5/ig.test(navigator.userAgent);
eol = ie ? "\r\n" : "\n";
return eol;
}
function copy_onclick() {
window.clipboardData.setData('Text', g_eol+window.sqlresult.innerText+g_eol);
}
function run_onclick() {
var strfmt1 = "sql = \"\\n :sql: \";";
var strfmt2 = "sql += \"\\n :sql: \";";
var arr = null;
var max = 0;
var len = 0;
var i = 0;
var strbuff = "";
arr = sqlinput.value.split( g_eol );
if( g_rmcomm ) { arr = rmcomment( arr ); }
if( arr.length < 0 ) return;
g_strname = (valunm.value == "" ) ? "sql" : valunm.value.trim();
if( g_strtype ) {
strfmt2 = strfmt1 = g_strname + ".append(\"\\n :sql: \");";
} else {
strfmt1 = g_strname + " = \"\\n :sql: \";";
strfmt2 = g_strname + " += \"\\n :sql: \";";
}
strfmt1 = setnb( strfmt1 );
strfmt2 = setnb( strfmt2 );
max = getmaxlen( arr );
sqlresult.innerHTML = strfmt1.replace( ":sql:", fixsql( setnb(arr[0]), max-getlen(arr[0])) ) + "<br>";
for( i=1; i<arr.length; i++ ){
if( arr[i] == "" ) continue;
sqlresult.innerHTML += strfmt2.replace( ":sql:", fixsql( setnb(arr[i]), max-getlen(arr[i])) ) + "<br>";
}
}
function rmcomment( arr ) {
var i = 0;
for( i=0; i<arr.length; i++ ) {
arr[i] = arr[i].replace( /(^|[\s]+)--(.*)((?=[\s]+)|$)/gi, "");
}
return arr;
}
function setnb( str ) {
return str.replace(/[ ]/g," ");
}
function getmaxlen( arr ) {
var max = 0;
var i = 0;
for( i=0; i<arr.length; i++ ) {
len = getlen( arr[i] );
max = len < max ? max : len;
}
return max;
}
function fixsql( str, len ) {
while( 0 < len-- ) { str += " "; }
return str;
}
// 영/한 글씨 length 계산
function getlen(str) {
var len = 0;
var chr = "";
var i = 0;
for( i = 0; i < str.length; i++) {
chr = escape(str.substr(i,1));
if( chr.charAt(1) == "u" )
len += 2;
else
len += 1;
}
return len;
}
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
</script>
</head>
<body id='main' style="overflow=hidden" leftmargin="0" topmargin="5" marginwidth="0" marginheight="0" onLoad="main_onload()" onResize="main_onResize()">
<input type="checkbox" id="rmcomm" value="" onClick="rmcomm_onclick(this.checked)" checked='true'> 주석제거
<input type="checkbox" id="usebff" value="" onClick="usebff_onclick(this.checked)" > 버퍼변수
<input type="text" id="valunm" value="sql" onChange="valunm_onchange(this.value)" size="10"> 변수명
<input type="Button" id="run" value=" 변 환 " onClick="run_onclick()">
<input type="Button" id="copy" value="결과 복사" onClick="copy_onclick()">
<table><tr height=1><td></td></tr></table>
<textarea id="sqlinput" class="textarea" cols="30" style="height:50%"></textarea>
<div id='sqlresult' class="div" style="height:50%"></div>
</body>
</html>
=============================================================================== - 붕어
- 2006-05-25 18:17:45
- x
sql = "\n select col_1, col_2, col_3 ";
sql += "\n"; // 주 1)
조금더 높은 고수는 아래처럼 합니다.
ret.append('\n').append("select col_1, col_2, col_3 ");
ret.append('\n').append(", col_4, col_5, col_6 "); // 주 1
ret.append('\n').append("where ");
하지만 더 높은 고수는 아래처럼 합니다.
ret.append('\n').append("select ");
ret.append('\n').append(" col_1,"); // 주석
ret.append('\n').append(" col_2,"); // 상태1,2,3
ret.append('\n').append(" col_3,");
ret.append('\n').append(" col_4,");
ret.append('\n').append(" col_5,");
ret.append('\n').append(" col_6 ");
ret.append('\n').append("from ");
ret.append('\n').append(" table ");
ret.append('\n').append("where ");
ret.append('\n').append(" pk = 1");
하지만 더 높은 고수는 아래처럼 합니다.
ResultSet rs = executeQuery("userManager.userlist");
----------------------------------
<namespace="userManager" desc="회원목록조회">
<userlist>
select
col_1,
col_2,
col_3,
col_4,
col_5,
col_6
from
table
where
pk = 1
</userlist>
----------------------------------
하지만 더 높은 고수는 이렇게 합니다.
UserBean = UserModel.getUserList( userModel_pk );
----------------------------------
<hibernate-mapping package="user.model">
<class name="userlist" table="USER_INFO" dynamic-update="true">
<id name="user_id" type="long" column="USER_ID">
<generator class="native"/>
</id>
<property name="title" type="string" column="TITLE" not-null="true"/>
<property name="name" type="string" column="NAME" not-null="true"/>
<property name="regtime" type="date" column="REGTIME" not-null="true"/>
<many-to-one name="user" class="user.model.list" column="user_id" not-null="true"/>
</class>
</hibernate-mapping>
----------------------------------- lamp
- 2006-06-11 21:50:08
- x
- 메모글은 공백은 안되네요...
- lamp
- 2006-06-11 21:51:08
- x
- ohmysqlstr.html 을 약간 수정해서 올립니다.
<ohmysqlstr_n>.html
---------------------------------------------------------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Oh My SQL String Tool kkk</title>
<style type="text/css">
body { font-family:"굴림체"; font-size:9pt; }
.btntxt { font-family:"굴림체"; font-size:9pt; }
.textarea { font-family:"굴림체"; font-size:9pt; width:100%; height:50%;
background-color:#f2f2f2;
BORDER-RIGHT: #567442 1px solid; BORDER-TOP: #c0c0c0 1px solid;
BORDER-LEFT: #c0c0c0 1px solid; BORDER-BOTTOM: #567442 1px solid;
padding:3px; }
.div { font-family:"굴림체"; font-size:9pt; width:100%; height:50%;
padding:3px; overflow:auto; text-align:justify; }
</style>
<script language = 'javascript'>
var g_rmcomm = false; // true : 주석제거
var g_strtype = false; // true : 문자버퍼 변수 사용
var g_strname = ""; // SQL 문자변수명
var g_eol = ""; // end of line
var g_eolpos = true; // end of line position
// treu : right, false : left
function main_onload() {
main_onResize();
g_eol = geteol();
g_rmcomm = rmcomm.checked;
g_strtype = usebff.checked;
g_strname = (valunm.value == "" ) ? "sql" : valunm.value.trim();
}
function main_onResize() {
h = main.clientHeight/2 - 30;
if( 0 < h ) sqlinput.style.height = h;
}
function rmcomm_onclick( chk ) { g_rmcomm = chk; run_onclick(); }
function eofpos_onclick( chk ) { g_eolpos = chk; run_onclick(); }
function usebff_onclick( chk ) { g_strtype = chk; run_onclick(); }
function valunm_onchange( val ) { g_strname = val; run_onclick(); }
function geteol() {
var ie = false, mz = false;
var eol = "";
ie = /msie/ig.test(navigator.userAgent);
mz = !ie && /mozilla\/5/ig.test(navigator.userAgent);
eol = ie ? "\r\n" : "\n";
return eol;
}
function copy_onclick() {
window.clipboardData.setData('Text', g_eol+window.sqlresult.innerText+g_eol);
}
function run_onclick() {
var strfmts = "";
var strfmtc = "";
var arr = null;
var max = 0;
var len = 0;
var i = 0;
var strbuff = "";
arr = sqlinput.value.split( g_eol );
if( g_rmcomm ) { arr = rmcomment( arr ); }
if( arr.length < 0 ) return;
g_strname = (valunm.value == "" ) ? "sql" : valunm.value.trim();
if( g_strtype ) {
if( g_eolpos ) {
strfmtc = strfmts = g_strname + ".append(\" :sql: \\n\");";
} else {
strfmtc = strfmts = g_strname + ".append(\"\\n :sql: \");";
}
} else {
if( g_eolpos ) {
strfmts = g_strname + " = \" :sql: \\n\";";
strfmtc = g_strname + " += \" :sql: \\n\";";
} else {
strfmts = g_strname + " = \"\\n :sql: \";";
strfmtc = g_strname + " += \"\\n :sql: \";";
}
}
strfmts = setnb( strfmts );
strfmtc = setnb( strfmtc );
max = getmaxlen( arr );
if( g_strtype ) {
var sname = "StringBuffer " + g_strname + "= new StringBuffer();<br><br>";
} else {
var sname = "String " + g_strname + "=\"\";<br><br>";
}
sqlresult.innerHTML = sname + strfmts.replace( ":sql:", fixsql( setnb(arr[0]), max-getlen(arr[0])) ) + "<br>";
for( i=1; i<arr.length; i++ ){
if( arr[i] == "" ) continue;
sqlresult.innerHTML += strfmtc.replace( ":sql:", fixsql( setnb(arr[i]), max-getlen(arr[i])) ) + "<br>";
}
if( g_strtype ) {
sqlresult.innerHTML += "<br>" + g_strname + ".toString();";
}
}
function rmcomment( arr ) {
var i = 0;
var re = new RegExp("(^|[\s]+)--(.*)((?=[\s]+)|$)","ig");
for( i=0; i<arr.length; i++ ) {
arr[i] = arr[i].replace( /(^|[\s]+)--(.*)((?=[\s]+)|$)/gi, "");
}
return arr;
}
function setnb( str ) {
return str.replace(/[ ]/g," ");
}
function getmaxlen( arr ) {
var max = 0;
var i = 0;
for( i=0; i<arr.length; i++ ) {
len = getlen( arr[i] );
max = len < max ? max : len;
}
return max;
}
function fixsql( str, len ) {
while( 0 < len-- ) { str += " "; }
return str;
}
// 영/한 글씨 length 계산
function getlen(str) {
var len = 0;
var chr = "";
var i = 0;
for( i = 0; i < str.length; i++) {
chr = escape(str.substr(i,1));
if( chr.charAt(1) == "u" )
len += 2;
else
len += 1;
}
return len;
}
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}
</script>
</head>
<body id='main' style="overflow=hidden" leftmargin="0" topmargin="5" marginwidth="0" marginheight="0" onLoad="main_onload()" onResize="main_onResize()">
<input type="checkbox" id="rmcomm" value="" onClick="rmcomm_onclick(this.checked)" checked='true'>주석제거
<input type="checkbox" id="eofpos" value="" onClick="eofpos_onclick(this.checked)" checked='true'>EOF위치
<input type="checkbox" id="usebff" value="" onClick="usebff_onclick(this.checked)" >버퍼변수
변수명: <input type="text" id="valunm" value="sql" onChange="valunm_onchange(this.value)" onkeyup="valunm_onchange(this.value)" size="10">
<input class='btntxt' type="Button" id="run" value="변 환" onClick="run_onclick()"><input
class='btntxt' type="Button" id="copy" value="복 사" onClick="copy_onclick()">
<table><tr height=1><td></td></tr></table>
<textarea id="sqlinput" class="textarea" cols="30" style="height:50%" onChange="run_onclick();" onkeydown="run_onclick();" onburo ></textarea>
<div id='sqlresult' class="div" style="height:50%"></div>
</body>
</html>
# by | 2008/01/04 17:29 | 트랙백(1) | 덧글(0)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : Casino royale peter sellers.
Dbs casino royale. Casino royale release date. Casino royale....more