날짜: 1996-05-09 | 글쓴이: 도아 | 4776 번 | 프린트 | 메일로보내기

제 9강 - msqlperl - relshow 구현


이제 앞에서 배운 msqlperl을 이용해서 Unix 명령행에서 테이블 스키마를 보는데 사용했던 relshow를 구현하도록 하자.

relshow 명령은 다음과 같이 세가지 형식으로 사용된다.

Unix 명령행 설명 CGI
relshow DB 목록을 출력 listdb.cgi
relshow dB 표의 목록을 출력 listtb.cgi
relshow dB table 표의 스키마를 출력 listfd.cgi

위와 같은 relshow 명령은 listdb.cgi, listtb.cgi, listfd.cgi라는 세 개의 CGI로 구현되었다. DB 목록(listdb.cgi)

데이터베이스의 목록을 출력하기위해 listdbs 메소드를 사용했다. 소스

 1 : #!/usr/local/bin/perl -w
 2 : 
 3 : use Msql;
 4 : 
 5 : $dbh = Msql->connect;
 6 : defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
 7 : 
 8 : @arr = $dbh->listdbs;
 9 : 
10 : print &PrintHeader;
11 : print &HtmlTop("데이타베이스 목록입니다.");
12 : print '<form method=post action="/~artech/cgi-bin/listtb.cgi">', "\n";
13 : print '<select name="database">', "\n";
14 : 
15 : for(0..$#arr) {
16 : 	print "<option>$arr[$_]\n"; 
17 : } 
18 : 
19 : print "</select>\n"; 
20 : print "<input type=submit value='보내기'>";
21 : print "</form>";
22 : print &HtmlBot; 
실행결과
설명
use Msql;
Msql.pm이라는 모듈을 사용하겠다는 선언이다. msqlperl을 사용하기 전에는 반드시 이 문장을 이용해서 Msql.pm 모듈을 가져와야 한다.

$dbh = Msql->connect;
Msql 크래스를 이용해서 로칼 dB 엔진에 접속한다. 웹서버와 dB 서버가 서로 다른 호스트에 있는 경우에는 dB 서버의 주소를 주면된다. 그러나 웹서버와 dB 서버가 같은 호스트에 있는 경우에는 TCP/IP 소켓을 이용하는 것보다는 Unix 소켓을 이용하는 것이 성능면에서는 우수하므로 굳이 호스트의 주소를 줄 필요는 없다.

defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
데이터베이스 엔진과의 접속이 설정되었는지를 검사하는 부분이다. 접속이되지 않은 경우 cgi-lib.pl의 CgiDie() 함수를 이용해서 오류메시지를 출력한다. 펄의 관례상 서브루틴은 &로 시작해야 하지만, &를 생략하고 일반 언어의 함수처럼 사용해도 무관하다.

@arr = $dbh->listdbs;
데이타베이스의 목록을 가져와서 @arr이라는 배열에 저장한다. 데이터베이스의 목록을 가져오는 CGI이므로 selectdb 메소드를 사용해서 데이터베이스를 선택할 필요는 없다. 사실상 mSQL 엔진에대한 질의가 끝나는 지점이며, 이 후는 이렇게 가져온 데이터는 HTML로 변환하는 부분에 불과하다.

10~22
@arr 배열의 내용으로 선택목록을 만드는 부분이다. <FROM> 태그의 Action은 listdb.cgi로 되어있으며, <SELECT> 태그의 NAME 속성이 database로 되어있다는 것에 주의하기바란다. 사용자가 데이터베이스를 선택하면
database=선택한DB
형식으로 listtb.cgi에 인자를 전달하게된다.
테이블 목록(listtb.cgi)

listtb.cgi는 listdb.cgi로부터 넘겨받은 데이터베이스에대한 테이블의 목록을 보여주는 CGI이다. 소스

 1 : #!/usr/local/bin/perl -w
 2 : 
 3 : require './cgi-lib.pl';
 4 : 
 5 : &ReadParse;
 6 : 
 7 : use Msql;
 8 : 
 9 : $dbh = Msql->connect;
10 : defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
11 : 
12 : $dbh->selectdb($in{'database'});
13 : 
14 : @arr = $dbh->listtables;
15 : 
16 : print &PrintHeader;
17 : print &HtmlTop("테이블 목록입니다.");
18 : 
19 : print "<form method=post action="/~artech/cgi-bin/listfd.cgi">";
20 : print "<select name="table">\n";
21 : for(0..$#arr) {
22 : 
23 : print "<option>$arr[$_]\n";
24 : }
25 : print "</select>\n";
26 : print "<input type=hidden name=database value="$in{database}">";
27 : print "<input type=submit value='보내기'>";
28 : print "</form>";
29 : 
30 : print &HtmlBot;
실행결과
설명
require './cgi-lib.pl';
앞서 보았듯 cgi-lib.pl이라는 라이브러리를 가져오는 부분이다. cgi-lib.pl이라는 라이브러리가 펄의 표준 라이브러리 경로(@INC)에 포함되어 있지 않은 경우에는 라이브러리의 완전한 경로를 주어야 한다. 이 라이브러리가 현재 디렉토리에 있는 경우에는 예에서처럼 현재 디렉토리임을 반드시 표시해 주어야 한다.

&ReadParse;
cgi-lib.pl에서 가장 중요한 루틴으로 폼 데이터를 디코딩하는 루틴이다. cgi-lib.pl은 Off-line 모드를 지원하므로 사용자의 입력이 다음과 같이 인코딩되어 전달된다면
database=commlab&table=book
Unix 명령행에서 다음과 같이 입력하면 된다.
listdb.cgi database=commlab table=book

7~10
listdb.cgi와 동일하다.

$dbh->selectdb($in{'database'});
테이블의 목록을 얻기위해 데이터베이스를 선택하는 문장이다. 데이터베이스의 이름은 listdb.cgi가 전달한다.

@arr = $dbh->listtables;
선택한 데이터베이스로부터 테이블의 목록을 가져와 @arr이라는 배열에 저장한다.

print "<input type=hidden name=database value="$in{database}">";
listfd.cgi는 테이블의 스키마를 출력하는 CGI이다. 테이블 스키미를 출력하기위해서는 데이터베이스의 이름과 테이블의 이름이 필요하다. listtb.cgi는 테이블의 이름만 listfd.cgi에 건네줄 수 있으므로 이전에 listdb.cgi를 이용해서 선택한 데이터베이스의 이름은 <INPUT> 태그의 HIDDEN 형식을 이용해서 listfd.cgi에 전달해야 한다. 웹은 상태정보를 유지할 수 없기 때문에 이와같이 <INPUT> 태그의 HIDDEN 형식을 이용해서 이전 상태정보를 다음 CGI에 전달하게된다.

16~30
@arr에 저장된 테이블의 목록을 HTML로 변환하는 부분이다. <SELECT> 태그에서 지정한 이름과 사용자가 선택한 값, 26 행의 <INPUT>의 이름과 값이 다음과 같은 형식으로 listfd.cgi에 전달된다.
database=commlab&table=book
테이블 스키마 출력(listfd.cgi)

다음은 listtb.cgi로부터 넘겨받은 데이터베이스의 이름과 테이블 이름으로 테이블 스키마를 출력하는 CGI이다. 소스

 1 : #!/usr/local/bin/perl -w
 2 : 
 3 : require './cgi-lib.pl';
 4 : 
 5 : &ReadParse;
 6 : 
 7 : use Msql;
 8 :
 9 : $dbh = Msql->connect; 
10 : defined($dbh) || CgiDie('데이타베이스에 접속할 수 없습니다');
11 : 
12 : $dbh->selectdb($in{'database'});
13 : 
14 : $sth = $dbh->listfields($in{'table'});  
15 :
16 : unless(defined($sth)) {
17 : 	$msg = $dbh->errmsg;
18 : 	CgiDie("$msg"); 
19 : }
20 :
21 : @fields = $sth->name;
22 : @types = $sth->type;
23 : @isnull = $sth->isnotnull; 
24 : @length = $sth->length;
25 : 
26 : print &PrintHeader;
27 : print &HtmlTop("$in{'table'}의 스키마입니다.");
28 :
29 : print "<ul>\n";
30 : 
31 : for(0..$#fields) {
32 : 	print "<li> $fields[$_], ";
33 : 	do {
34 : 		print "정수형, " if $types[$i] == Msql::INT_TYPE;
35 : 		print "문자형, " if $types[$i] == Msql::CHAR_TYPE;
36 : 		print "실수형, " if $types[$i] == Msql::REAL_TYPE;
37 : 		print "텍스트형, " if $types[$i] == Msql::TEXT_TYPE;
38 : 		print "날자형, " if $types[$i] == Msql::DATE_TYPE;
39 : 		print "부호없는 정수형, " if $types[$i] == Msql::UINT_TYPE;
40 : 		print "화폐형, " if $types[$i] == Msql::MONEY_TYPE;
41 : 		print "시간형, " if $types[$i] == Msql::TIME_TYPE;
42 : 	};
43 :  
44 : 	do {
45 : 		print "필요필드, " if $isnull[$i] == 0;
46 : 		print "조건필드, " if $isnull[$i] != 0;
47 : 	};
48 :  
49 : 	print "$length[$i] 바이트 <br>\n";
50 : }   
51 : 
52 : print "</ul><p>\n";
53 : 
54 : print &HtmlBot;
실행결과
설명
1~12
listdb.cgi, listtb.cgi와 동일하다. msqlperl을 이용해서 dB 엔진에 접속하고 접속된 엔진으로부터 데이터베이스를 선택하는 부분이다.

$sth = $dbh->listfields($in{'table'});
데이터베이스로부터 지정된 테이블의 스키마를 가져온다. 데이터베이스의 이름과 테이블의 이름은 listtb.cgi로부터 전달된다.

16~19
listfields 메소드가 제대로 수행되었는지는 검사하는 문장이다. listfields의 수행이 성공적이라면 $sth는 스테이트먼트 헨들을 갖게되며, 그렇지 못한 경우에는 정의되지 않는다. 따라서 $sth가 정의되었는지(초기화되었는지)를 검사해서 정의되지 않은 경우, 오류메시지를 CgiDie를 통해 출력하는 문장이다. $dbh->errmsg;는 이전 질의가 실패한 경우 오류메시지를 리턴한다. 이 메시지는 msql 모니터 프로그램을 사용할 때 출력되는 메시지와 정확히 동일하므로 SQL 문의 오류를 검사하는데 아주 중요한 메소드이다.
16 : unless(defined($sth)) {
17 : 	$msg = $dbh->errmsg;
18 : 	CgiDie("$msg"); 
19 : }

21~24
스테이트먼트 핸들($sth)을 이용해서 필요한 메타데이타(필드명, 필드타입, Not null 여부, 길이)를 가져와서 배열로 저장한다.

34~41
필드타입을 판정하기위해 Msql의 내부 상수를 사용했다. 각각의 내부 상수는 다음과 같은 값을 갖는다.
Msql::INT_TYPE		  1		# 정수형
Msql::CHAR_TYPE		  2		# 문자형
Msql::REAL_TYPE		  3		# 실수형
Msql::IDENT_TYPE	  4		#Ident 형
Msql::NULL_TYPE		  5		# Null 형
Msql::TEXT_TYPE		  6		# 텍스트형
Msql::DATE_TYPE		  7		# 날자형
Msql::UINT_TYPE		  8		#정수형(부호없는)
Msql::MONEY_TYPE	  9		# 화폐형
Msql::TIME_TYPE		 10		# 시간형
Msql::IDX_TYPE		253		#인덱스
Msql::SYSVAR_TYPE	254		# 시스템 변수

26~54
가져온 스키마를 HTML로 출력하는 문장이다. 일반적인 구성은 앞부분과 동일하며, 블록화를 위해 do{..};문을 사용했다.


다음글: 제 10강 - msqlperl - msql (4788)1996-05-10
이전글: 제 8강 - msqlperl의 사용법 (4867)1996-05-08

세상사는 이야기

  • 윈도 10, 한영 전환도 >
  • 바보도 할 수 있는 War >
  • 북마크에도 확장 아이 >
  • 크롬은 가라, 비발디가 >
  • 감히 아이폰 관리의 최 >
  • 디지털 노마드의 편집 >
  • [블로그 복귀 알림] 새 >
  • 오타도 즐거운 안드로 >
  • 최고의 OCR 어플, Text >
  • 누구나 할 수 있는 순 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2014 QAOS.com All rights reserved.