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로 되어있다는 것에 주의하기바란다.
사용자가 데이터베이스를 선택하면
앞서 보았듯 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가 전달한다.
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에 전달된다.
listdb.cgi, listtb.cgi와 동일하다. msqlperl을 이용해서 dB 엔진에 접속하고 접속된 엔진으로부터 데이터베이스를 선택하는 부분이다.
$sth = $dbh->listfields($in{'table'});
데이터베이스로부터 지정된 테이블의 스키마를 가져온다. 데이터베이스의 이름과 테이블의 이름은 listtb.cgi로부터 전달된다.
16~19
listfields 메소드가 제대로 수행되었는지는 검사하는 문장이다. listfields의 수행이 성공적이라면 $sth는 스테이트먼트 헨들을 갖게되며, 그렇지 못한 경우에는 정의되지 않는다.
따라서 $sth가 정의되었는지(초기화되었는지)를 검사해서 정의되지 않은 경우, 오류메시지를 CgiDie를 통해 출력하는 문장이다.
$dbh->errmsg;는 이전 질의가 실패한 경우 오류메시지를 리턴한다. 이 메시지는 msql 모니터 프로그램을 사용할 때 출력되는 메시지와 정확히 동일하므로 SQL 문의 오류를 검사하는데 아주 중요한 메소드이다.