DB 연결 방법론

mSQL를 이용한 WWW에서의 데이터베이스 접속 기술

이강찬

대전 광역시 유성구 궁동 220

충남대학교 컴퓨터공학과 데이타베이스 연구실

E-mail : dolphin@comeng.chungnam.ac.kr, dolphin@www-kr.org

URL : http://www.comeng.chungnam.ac.kr/~dolphin/

Abstract:

WWW의 초창기부터 WWW에 데이터베이스를 연동하는 일들이 진행되어 왔다. 이는 대용량 데이터를 저장, 관리 할 수 있는 데이터베이스와 멀티미디어 정보 서비스를 할 수 있는 WWW과 통합함으로써 데이터베이스와 WWW의 단점을 극복하고 장점을 극대화 시킬 수 있기 때문이다. 본 문서에서는 현재 가장 손쉽게 구할 수 있는 mSQL을 이용하여 데이타베이스와 웹을 연동시키는 방법의 여러가지 종류를 살펴본다.

Keywords:

웹(WWW), 데이터베이스 시스템(database system), mSQL(mini SQL), CGI, 스크립트(script), Java, JDBC

1. 웹에서의 DBMS 접속 기술 변화

웹의 시작과 더불어 데이타베이스에 웹을 접목시키는 시도는 지금까지 발전되어가고 있다. 웹의 초창기에는 CGI방법을 통하여 데이타베이스 게이트웨이를 만들었으며, 그 이후에 나름대로의 스크립트 방식을 이용하기도 하였고 자바언어가 개발되고 난 후에는 자바 클래스 라이브러리(Java Class Library)방식, 최근에는 JDBC 방법이 사용되고 있기도 하다.

지금까지의 웹을 위한 데이타베이스 통로(database gateway)의 분류체계[1]는 웹에서 데이 터베이스를 이용하기 위한 서버 또는 브라우저를 확장하는 대분류를 전제로 하여 데이타베이스 통로를 분류한 것이다. 이는 웹에서 기본적으로 데이타베이스를 접목시키기 위하여 브라우저와 서버를 확장시키는 방법을 나누어 놓고, 그 방법중에서 다양한 데이타베이스 게이트웨이를 분류시켜 놓은 것이다.

본 문서에서는 이런 체계적인 방법으로 웹에서의 DBMS 접속 기술 변화를 살펴 보는 방법이 아닌 시대별로, 즉 웹의 시작과 함께 데이타베이스의 접목 방법에 대한 발전 과정별로, 웹에서 어떻게 데이타베이스를 사용해 왔나 살펴 보고자 한다. 즉, 성능은 고려 대상에서 제외하고 일반 프로그래머들이 개발을 위한 데이타베이스 사용에 있어 어떤 방법으로 그 게이트웨이를 구현해 왔나 살펴보는 것이다.

데이타베이스 게이트웨이 프로그램이라는 것이 DBMS 의존적이기 때문에 각각의 상용 DBMS마다 사용하는 방법이 서로 같을 수 없다. 즉 일반적인 의미에서의 데이타베이스 게이트웨이는 없다는 것이다. 현재 오라클, 인포믹스, UniSQL, O2 등등의 데이타베이스 제공 회사들은 각각의 데이타베이스를 웹에 어떻게 접목시키는것이 좋은가 DBMS 별로 다른 솔루션을 제공하고 있는 것이다.

본 문서에서는 위와 같은 가정을 가지고 웹과 데이타베이스 게이트웨이를 초창기의 CGI, 다이나믹하게 사용할 수 있는 스크립트 방식, 자바를 이용한 방식, JDBC를 이용한 방식으로 나누어 살펴보도록 한다.

CGI

1990년대 초에 웹이 처음 나왔을 당시 가장 간단하게 데이타베이스와 연동하는 방법은 누구나 쉽게 사용할 수 있는 방법인 CGI(Common Gate Interface)를 이용한 방법이다. 즉 데이타베이스에서 사용할 값들(테이블 명, WHERE 절에서 사용할 여러가지 조건문, 어트리뷰트 명 등)을 GET 메소드 또는 POST 메소드를 이용하여 CGI에서 데이타 전달 방법으로 사용한다. 결국 웹은 데이타베이스 응용 프로그램으로서의 인터페이스 역할만 하게 되고 다른 응용 프로그램들과 마찬가지로 파라미터 전달이 주된 역할이 된다.

CGI를 이용한 방법은 데이타베이스 프로그램에서 사용할 변수를 넘기는 단순한 방법이다. 이 방법을 사용하면 C 또는 기타 다른 언어로 웹에서 데이타베이스에 대한 연결 방법을 제공하지만, 프로그래머의 입장에서 보면 매번 소스 프로그램을 컴파일 해야 할 뿐만 아니라 성능 면에서도 데이타베이스에 매번 연결을 해야 하기 때문에 좋지 못한 단점을 가지고 있으나 초창기에서부터 많이 사용하고 있기 때문에 아직도 많은 응용을 CGI를 이용하고 하고 있다.

스크립트 언어

CGI 방법은 보편적인 방법이긴 하나 응용 프로그래머의 입장에서 보면 매우 불편하게 되어 있다. 더구나 CGI의 방법을 사용한 프로그램에서 프로그램 디버깅이 용이하지 않을 뿐만 아니라 데이타베이스 언어(SQL)외에 호스트 프로그램인 C나 C++ 등의 다른 high-level 언어를 알아야만 작성이 가능하기 때문에 전문 프로그래머가 아닌 일반 사용자들이 작성하기에 매우 힘들다.

이때 등장한 것이 스크립트를 이용한 방법이다. 스크립트를 이용한 방법은 또 다시 "서버내 스트립트"와 "클라이언트내       스트립트"로 나누어 볼 수 있다. 쉽게 생각하여 자바 스트립트와 비쥬얼 베이직 스크립트와 같은 경우는 클라이언트내 스크립트로 볼 수 있으며 이와 같은 기능을 제공하긴 하나 브라우저 내에 탑재하지 않고 웹서버에 스크립트 해석기를 두는 방법이 서버내 스크립트 방식이다. 즉, 서버내 스크립트와 클라이언트내 스크립트의 차이는 스크립트를 실행하는 부분이 서버에 있는지, 클라이언트에 있는지의 차이이다.

클라이언트내 스트립트는 브라우저에 의존적이고, 스크립트가 비 보호적이다. 반면에 서버내 스크립트는 브라우저에 독립적이고, 스크립트를 브라우저에서 볼 수 없다. 또한 클라이언트내 스트립트는 스크립트를 브라우저로 전송하여 브라우저가 스크립트를 실행하기 때문에 서버에 부담이 없지만, 서버내 스크립트는 모든 스크립트를 서버에서 변환하여 전송하기 때문에 서버에 많은 부담이 된다. 어찌 보면 당연할 결과이겠지만, mSQL의 경우에는 스크립트의 구현 방식이 전부 서버내 스크립트를 이용하였다. 따라서 3.2절에 설명할 스크립트 방식은 서버내 스크립트를 이용한 것으로 설명하도록 하겠다.

그러나 비록 스크립트(서버내)를 이용한 방법이라 할지라도 내부적으로는 모두 CGI와 또는 이와 비슷한 방법으로 동작하게 된다. 여기서 스크립트 프로그램은 HTML 화일을 읽어 파싱 후, 스크립트 부분을 파라미터로 받아 수행한다. 결국 HTML 화일을 읽고, 파싱하고, 스크립트를 추출하고, 그 스크립트를 실행하는 모든 것이 CGI로 구현이 된다. 그러나 CGI와 차이점을 구분하면 CGI가 반드시 컴파일 방식인데 비해 스크립트는 인터프리트 방식이다. 따라서 CGI는 소스 프로그램을 수정하고, 그 수정을 프로그램에 반영하려면 매번 컴파일을 해 줘야 하나, 스크립트는 HTML 상에 스크립트 부분을 수정하면 컴파일 필요없이 실행이 된다.

스크립트를 이용한 방법의 단점으로는 스크립트의 사용을 원하는 사람은 또다른 언어인 스크립트 언어를 배워야 한다는 것이다.. 현재 이 스크립트에 대한 표준도 전무하고 스크립트 별로 전부 사용 방법이 다르기 때문에 많은 문제점으로 지적되고 있다.

자바 클래스 라이브러리

웹에서 새로운 파라다임이 등장한 것이 바로 자바이다. 자바의 소개 이후에 데이타베이스 분야도 마찬가지로 자바를 데이타베이스 게이트웨이에 자연스럽게 도입하였다. 심지어 어떤 DBMS 벤더는 C++로 API를 개발하려다 자바가 소개되자 자바로 바꾸는 경우도 있었다. mSQL도 호주의 Queensland 대학의 Darryl Collins가 mSQL에서 제공하고 있는 C API를 자바에서도 사용할 수 있도록 클래스 라이브러리를 제공하였다.

자바 클래스 라이브러리는 기존의 CGI 방식과 별반 다를게 없으나 사용자의 입장에서 볼 때 자바를 이용하여 프로그래밍 할때 데이타베이스를 쉽게 사용할 수 있다는 장점이 있어 언급하기로 하였다.

JDBC

Sun Microsystems에서는 자바의 개발 이후에 데이타베이스에 ODBC와 같은 개념을 가진 JDBC를 발표 하였다. 이에 많은 DBMS 벤더는 JDBC를 제공하겠다고 발표를 하였으며, 그 이후 현재까지 많은 제품들이 JDBC 스펙을 지키는 드라이버를 제공하고 있다. mSQL은 JDBC 발표 이후에 비교적 많은 사람들의 노력으로 공개 JDBC 드라이버를 만들었고, 이는 기존에 많은 DBMS 벤더에게 JDBC 드라이버의 개발하는데 공헌 하기도 하였다.

2. mSQL이란 무엇인가?

mSQL(mini SQL)은 호주의 Bond 대학의 David J. Hughes가 개발한 데이타베이스 언어인 SQL을 부분적으로 지원하는 관계형 데이타베이스 관리 시스템이다. mSQL의 기존 상용에서 제공하고 있는 복잡하고, 또는 잘 쓰이지 않는 기능을 제공하기 보다는 일반 사용자에게 꼭 필요한 기능들을 쉽게 사용할 수 있도록 디자인 원칙을 정하고 개발되었다. 이 밖에도 네트 워크 관리를 위한 데이타베이스 설계, 클라이언트/서버 연산을 제공하는 데이타베이스, 다중 사용자들을 위한 DBMS의 구현이 개발 목표였다.

mSQL의 언어적인 측면으로 보면 ANSI SQL을 지원하고 있으나, 모두 지원하고 있지는 않다. 따라서 현재 사용하고 있는 SQL2의 모든 기능들은 사용할 수 없다. 예를 들어 뷰(view), 부속 질의어(sub query), 집단함수(aggregate function)등은 지원되고 있지 않다.

또한 mSQL이 지원하고 있는 언어는 C, C++ , ESL, Tcl/Tk, Perl5, Phthon, C C++ under Microsoft Windows(using WinSOCK) 등이 있으며, 지원 언어는 많은 사람들의 도움으로 지속적으로 증가되고 있다.

mSQL의 또하나의 특징은 TCP/IP 네트워크 위에 클라이언트/서버의 환경을 제공하는데 있다. 따라서 mSQL의 거의 모든 함수들이 자신의 로컬 호스트가 아닌 리모트 호스트의 mSQL 데이타에 접근할 수 있다.

2.1 mSQL 인스톨

□ mSQL 프로그램을 다운로드

ftp://ftp.bond.edu.au/pub/Minerva/msql/msql2/ 에서 최종적인 버전을 선택하여 다운로드

□ 소스 코드의 압축을 푼다.

% gzip -d msql-2.0-B6.tar.gz

% tar xvf msql-2.0-B6.tar

□ 현재 디렉토리에서 "make target" 실행하여 targets/ 디렉토리에 OS 이름으로 디렉토리를

만들고 필요한 화일을 복사하거나 심볼릭 링크를 설정한다.

□ target 디렉토리의 해당 OS 디렉토리로 이동하여 "setup" 실행한다.

□ setup이 끝난 후에 필요한 경우 site.mm 화일에 있는 옵션을 수정한다.

□ "make all"을 통하여 site.mm에서 수정된 내용을 반영하여 Make 화일 재생성한다.

% make all

............

lite -L../lib -lnsl

<-- [lite] done

Make of mSQL-2 complete.

You should now install mSQL-2 using make install

186.520u 108.070s 5:56.07 82.7% 0+647k 151+922io 116pf+0w

□ "make install" 명령으로 필요한 화일을 인스톨 디렉토리에 복사한다. 디폴트 인스톨

디렉토리는 "/usr/local/Hughes" 이며, 이를 수정할때에는 site.mm에서 수정하고 "make

all"부터 다시 수행하면 된다.

2.1 mSQL 프로그램

msqld

msqld는 mSQL 데이타베이스 서버로서 클라이언트로부터 SQL을 전달받아 수행하는 데이타베이스 데몬 서버

msqladmin

데이타베이스의 생성이나 삭제, 또는 데몬의 셧 다운(shutdown), 재가동(reload), 데몬의 버전, 데몬의 상태를 알 수 있는 프로그램으로써 주로 데이타베이스 관리자(DBA; Database Adminstrator)가 사용한다.

msql

mSQL을 온라인 터미널을 통해 대화식 질의어로 사용할 수 있는 프로그램으로 사용자는 데이타베이스 SQL 질의를 만들어서 interactive하게 질의할 수 있다.

[flower:/lab2/db/dolphin/Hughes/bin 56 ] msql

Usage : msql [-f conf_file] [-h host] database

msqldump

mSQL은 여타 상용 데이타베이스 만큼의 회복(recovery) 기능이 제공되고 있지 않다. 따라서 mSQL에서 회복에 관련된 기능을 제공하는 것은 현재 데이타베이스를 그대로 아스키 형태로 덤프 받아 화일로 저장하는 방법이다. msqldump를 실행하면 스키마 생성문과 각각의 레코드의 삽입 SQL이 그 결과로서 제공되기 때문에 이후 데이타베이스의 내용을 회복할 필요가 있을 때 손쉽게 사용할 수 있다.

relshow

mSQL에서 제공하는 스키마 뷰어로서 옵션에 따라 현재 mSQL이 로컬로 관리하고 있는 데이타베이스, 데이타베이스 내의 테이블, 테이블을 구성하고 있는 어트리뷰트의 구성을 살펴볼 수 있다.

[flower:/lab2/db/dolphin/Hughes/bin 27 ] relshow

+-----------------+

|    Databases    |

+-----------------+

| mon             |

+-----------------+

[flower:/lab2/db/dolphin/Hughes/bin 28 ] relshow mon

Database = mon

+---------------------+

|       Table         |

+---------------------+

| URL                 |

| BAD                 |

+---------------------+

[flower:/lab2/db/dolphin/Hughes/bin 29 ] relshow mon URL

Database = mon

Table    = URL

+-----------------+----------+--------+----------+--------------+

|     Field       |   Type   | Length | Not Null | Unique Index |

+-----------------+----------+--------+----------+--------------+

| num             | int      | 4      | Y        | N/A          |

| addr            | char     | 100    | Y        | N/A          |

| idx1            | index    | N/A    | N/A      | Y            |

| idx2            | index    | N/A    | N/A      | Y            |

+-----------------+----------+--------+----------+--------------+

msqlimport

다른 화일로부터 데이타베이스에 로드 하는 프로그램

usage: msqlimport [-v] [-h host] [-f conf] [-s C] [-e C] [-c cols] db table

Imports an ASCII export file.

-v              Run in verbose mode

-h              mSQL Server Host

-s Char         Use the character Char as the separation character

Default is a comma.

-e Char         Use the specifed Char as the escape character

Default is \

-c col,col...   Specify a list of columns for the imported data

msqlexport

데이타베이스 내용을 다른 화일로 복사하는 프로그램

usage:  msqlexport [-h host] [-v] [-s Char] [-q Char] [-e Char] database

table

Produce an ASCII export of the table.

-v              Verbose

-s Char         Use the character Char as the separation character

Default is a comma.

-q Char         Quote each value with the specified character

-e Char         Use the specifed Char as the escape character

Default is \

2.2 mSQL 데이타베이스 언어

SQL(Structured Query Language)은 데이타베이스 언어로서 1974년에 IBM 연구소에서 개발한 SEQUEL(Structured English QUery Language)로부터 시작했다. 이 SQL은 미국 표준 연구소 (ANSI)와 국제표준기구(ISO)에서 관계 데이타베이스의 표준 언어로 채택함으로써, 전 세계의 데이타베이스를 일관된 방법으로 접근할 수 있도록 한 것이다. SQL은 구조화 질의어지만, 단순한 데이타 질의어 이상의 역할을 한다. 즉 데이타 정의(DDL), 조작(DML), 그리고 제어(DCL)을 모두 제공하고 있다.

mSQL의 데이타베이스 언어는 ANSI의 스펙의 일부를 따르고 있다. 현재 ANSI SQL중에서 부족한 많은 부분들이 third party contribution으로 지속적으로 채워지고 있으며, 버전업이 지속되는 가운데 많은 기능들이 보강되었다.

mSQL의 데이타베이스 언어는 다음과 같다.

CREATE TABLE table_name (

col_name col_type [ not null | primary key ]

[, col_name col_type [ not null | primary key ] ]**

)

CREATE [ UNIQUE ] INDEX index_name ON table_name (

field_name

[ , field_name ] **

)

CREATE SEQUENCE ON table_name [ STEP step_val ] [ VALUE initial_val ]

DROP TABLE table_name

DROP INDEX index_name FROM table_name

DROP SEQUENCE FROM table_name

INSERT INTO table_name [ ( column [ , column ]** ) ]

VALUES (value [, value]** )

DELETE FROM table_name

WHERE column OPERATOR value

[ AND | OR column OPERATOR value ]**

OPERATOR can be <, >, =, <=, >=, <>, or LIKE, RLIKE or

CLIKE

SELECT [table.]column [ , [table.]column ]**

FROM table [ = alias] [ , table [ = alias] ]**

[ WHERE [table.] column OPERATOR VALUE

[ AND | OR [table.]column OPERATOR VALUE]** ]

[ ORDER BY [table.]column [DESC] [, [table.]column [DESC]]

OPERATOR can be <, >, =, <=, >=, <>, or LIKE, RLIKE or

CLIKE

VALUE : 문자값 또는 column 이름

UPDATE table_name SET column=value [ , column=value ]**

WHERE column OPERATOR value

[ AND | OR column OPERATOR value ]**

OPERATOR can be <, >, =, <=, >=, <>, or LIKE, RLIKE

or CLIKE

2.3 mSQL C API

2.3.1 질의 관련 함수

반환값	함수명	함수설명
int	msqlConnect(char *host);	mSQL 연결 함수, host에는 IP 어드레스나 호스트 명이 들어갈 수 있고 만약 host가 NULL이면 로컬 호스트이다.
int	msqlSelectDB(int sock, char *dbname);	데이타베이스 선택하는 함수로서 sock은 msqlConnect 함수의 결과를 사용하고, dbname은 선택하고자 하는 데이타베이스명이다.
int	msqlQuery(int sock, char *query);	mSQL 서버에 질의 전달 및 실행
m_result *	msqlStoreResult();	msqlQuery()의 결과 저장
void	msqlFreeResult(m_result *result);	더이상 결과를 사용할 필요가 없을때 결과를 해제 시킴
m_row	msqlFetchRow(m_result *result);	실행 결과 셋중 하나의 레코드 추출
void	msqlDataSeek(m_result *result, int pos);	pos값에 따라 결과 레코드를 지정. pos가 0이면 첫번째 레코드가 된다.
int	msqlNumRows(m_result *result);	결과 셋중 레코드 수를 반환
m_field *	msqlFetchField(m_result *result);	결과 셋중 원하는 필드만 반환
void	msqlFieldSeek(m_result *result, int pos);	pos값에 따른 필드별 반환. pos가 0이면 첫번째 필드
int	msqlNumFields(m_result *result);	결과 셋중 필드의 수 반환
void	msqlClose(int sock);	데이타베이스 해제

2.3.2 스키마 관련 함수

반환값	함수명	함수설명
m_result *	msqlListDBs(int sock);	데이타베이스 리스트를 보여줌
m_result *	msqlListTables(int sock);	테이블 리스트를 보여줌
m_result *	msqlListFields(int sock, char *tableName);	필드 리스트를 보여줌
m_result *	msqlListIndex(int sock, char *tableName, char *index);	인덱스 리스트를 보여줌

2.4 mSQL 환경 화일

mSQL 환경 화일은 버전 2.0부터 제공되는 것으로써 1.x에서는 프로그램 인스톨 후 고정된 포트번호를 사용하고 서버를 운영할 사람의 ID도 인스톨시 지정해야만 했으나 2.x 부터는 환경 화일의 파라미터를 조정함으로써 동적으로 환경을 지정할 수 있게 되었다.

mSQL의 환경 화일의 파라미터는 다음과 같다.

파라미터	기본값	정 의
Inst_Dir	/usr/local/Hughes	인스톨후, mSQL 화일(실행 화일, 라이브러리, 헤더화일) 들이 있는 위치
mSQL_User	msql	msql서버(msqld)를 수행할 사용자의 ID
Admin_User	root	msql의 privileged연산인 shutdown, 데이타베이스의 생성(create)을 수행할 사용자의 ID
Pid_File	%I/msql2.pid	msql의 서버 프로세서 번호가 저장될 화일
TCP_Port	1114	msql의 클라이언트와 서버간에 사용할 TCP 포트 번호
UNIX_Port	%I/msql2.sock	같은 머신상에서 사용할 소켓 번호

위와 같은 환경 화일 파라미터는 다음과 같이 사용된다.

#

# msql.conf  -  Configuration file for Mini SQL Version 2

#

#--------------------------------------------------------------

#

# This file is an example configuration and may require

# modification to suit your needs or your site.  The values

# given are the default values and will be used by the

# software if either this file is missing or a specific value

# is not specified.

#

#--------------------------------------------------------------

[general]

Inst_Dir = /usr/local/Hughes

mSQL_User = msql

Admin_User = root

Pid_File = %I/msql2.pid

TCP_Port = 1114

UNIX_Port = %I/msql2.sock

2.5 Third Party mSQL Applications

mSQL의 또 하나의 특징은 모든 소스가 공개되어 있다는 것이다. DBMS가 워낙 고가이기 때문에 일반 사용자들이나 학생의 경우 다른 응용 프로그램들과 같이 쉽게 시험해 볼 수 없었으나 mSQL이 제공된 후에는 데이타베이스를 쉽게 사용해 볼 수 있게 되었다. 현재 사용 목적이 아닌 의도로 사용하고자 할때 무료로 제공되고 있는 데이타베이스 관리 시스템은 mSQL외에도 Postgres, mysql, Solid 등과 같은 프로그램도 있다.

인터넷 사용자에게 프로그램의 소스가 제공된다는 것은 남다른 의미가 있다. 우리의 주위에서 리눅스의 경우를 살펴보더라도 현재는 많은 사람들의 도움으로 리눅스는 가장 많이 사용하고 있는 OS로 자리잡아가고 있다. mSQL도 어떻게 보면 데이타베이스 분야에 있어 마치 리눅스와 같은 역할을 하고 있다. 비록 현재는 mSQL이 많은 기능이 부족하나 소스 프로그램이 공개되어 많은 사람들이 필요한 부분을 추가시켜가고 있고 메일링 리트스를 통하여 활발히 논의되고 있다.

mSQL의 Third Party contribution은 #APP을 참조하기 바란다.

3. mSQL을 이용한 데이타베이스 프로그램 작성 예

3.1 CGI

CGI를 이용한 mSQL의 사용방법은 일반 CGI 프로그래밍과 같다. 2.3절에서 설명한 mSQL에서 제공하는 함수를 이용하여 프로그램을 한다면, 이는 웹에서 CGI 프로그래밍 하는 것과 똑같은 방식(GET, POST 메소드 사용)으로 파라미터를 전달하고 CGI 프로그램은 전달받은 파라미터를 가지고 mSQL에서 사용할 변수(데이타베이스명, 테이블명, 어트리뷰트명, 조던문 등)들을 추출하고 그 변수를 이용하여 mSQL에서 제공하는 함수를 사용하는 것이다. 단, 지금까지 설명은 웹을 인터페이스로 가정했을 경우이다. 웹을 인터페이스로 하지 않고 mSQL을 사용한다면 이는 더욱 일반적인 C 프로그래밍과 똑같이 된다.

다음은 mSQL을 이용하여 웹에서 데이타를 입력하는 프로그램의 예이다.

1  #include    "test.h"

2

3  void key_test();

4  void insert_item();

5  void retrieve_item();

6

7  void main(argc, argv)

8  int argc;

9  char **argv;

10  {

11      entry        entries[MAX_ENTRIES];

12      register int    x, m = 0;

13      char *        cl;

14

15      printf ("Content-type: text/html%c%c", 10, 10);

16

17      if (strcmp (getenv ("REQUEST_METHOD"), "GET")) {

18          puts ("This script should be referenced with a METHOD                      of GET.");

19          exit (1);

20      }

21

22      cl =  getenv ("QUERY_STRING");

23      if (cl == NULL) {

24          puts ("No query infomation to decode.");

25          exit (1);

26      }

27

28      for (x = 0; cl[0] != '\0'; x++) {

29          m = x;

30          getword(entries[x].val,cl,'

31          plustospace(entries[x].val);

32          unescape_url(entries[x].val);

33          getword(entries[x].name,entries[x].val,'=');

34      }

35

36      key_test(entries);

37

38      printf ("\n");

39      printf("ID : %s%c", entries[0].val,10);

40      printf("이름 : %s%c", entries[1].val,10);

41

42      insert_item(entries);

43  }

44

45  void key_test(entries)

46  entry *entries;

47  {

48      if (!strcmp (entries[ID].val, "")) {

49          puts ("ID를 입력하지 않았습니다.");

50          puts ("ID는 키로 입력되기 때문에 반드시 입력해야 됩니다.");

51          exit (1);

52      }

53  }

54

55  void insert_item(entries)

56  entry *entries;

57  {

58      int        sock;

59      char        query[QUERY_SIZE];

60

61      if ((sock = msqlConnect (NULL)) == -1) {

62          printf ("\nMsql connect error..\n");

63          puts (msqlErrMsg);

64          return;

65      }

66      if ((msqlSelectDB (sock, DBNAME)) == -1) {

67          printf ("\n%s select error..\n", DBNAME);

68          puts (msqlErrMsg);

69          return;

70      }

71      sprintf (query, "insert into test(id, name) \

72          values('%s', '%s')",

73          entries[ID].val, entries[NAME].val);

74

75      if (msqlQuery (sock, query) == -1) {

76          printf ("\nMsql Query error..\n");

77          if (!strcmp (msqlErrMsg, "Non unique key value in                               field \'id\'")

78              printf ("이미 ID %s 가 등록되어 있어서 등록이 되지                                       않습니다.");

79          else

80              puts (msqlErrMsg);

81          return;

82      }

83      printf ("%c",10);

84      puts ("등록이 완료되었습니다.");

85      msqlClose (sock);

86  }

위의 프로그램에서 insert_item 함수를 제외하고는 모두 CGI 프로그래밍 패턴과 동일하다. GET 메소드를 확인하고 QUERY_STRING 으로부터 값들을 전달받아 entries의 배열에 이름과 값들의 쌍으로 차곡차곡 분리한다. 그리고 insert_item 함수에서는 데이타베이스 서버와 연결하고 필요한 데이타베이스를 오픈한 다음, 전달받은(QUERY_STRING -> entries) 값을 이용하여 데이타베이스 언어로 만든 다음, 데이타베이스 서버에 SQL을 전달하여 실행하게 하는 것이다.

위의 예에서는 insert_item에서 만든 데이타베이스 언어가 입력이기 때문에 데이타 입력을 수행하는 것이고 입력이 아닌 검색, 갱신, 삭제의 경우도 아래의 예와 같이 데이타베이스 언어로 만드는 부분을 변경하면 된다.

입력

sprintf (query, "insert into test(id, name) values('%s', '%s')", entries[ID].val, entries[NAME].val);

검색

sprintf (query, "select * from test where %s like '%%%s%%'", entries[0].val, entries[1].val)

갱신

sprintf (query, "update test set name='%s' where id='%s'", entries[NAME].val, entries[ID].val);

삭제

sprintf (query, "delete from test where id = '%s'", id);

위 프로그램에 대한 전체 소스는 http://joinus.comeng.chungnam.ac.kr/~dolphin/mSQL/에서 찾아 볼 수 있으며 소스 프로그램 뿐만 아니라 데이타 입력, 수정/삭제, 검색에 대한 데모도 해 볼 수 있다.

3.2 스크립트 언어

mSQL에서 제공하는 스크립트 언어는 매우 다양하다. 이중에서 mSQL이 제공하고 있는 W3-mSQL라는 언어와 mSQL 뿐만 아니라 다른 DBMS도 지원하고 있는 PHP/FI를 살펴 보도록 한다. 물론 현재 mSQL이 공식적으로 발표하는 스크립트 언어는 Lite라는 언어이다. 그러나 Lite는 마치 Perl과 같이 사용되는 스크립트 언어이고 홈페이지 안에서 스크립트 언어 방식을 이용하는 스크립트는 W3-mSQL이기 때문에 Lite는 제외하고 W3-mSQL을 소개한다.

3.2.1 W3-mSQL

W3-mSQL은 HTML 내에서 embed SQL을 지원하는 방법으로 웹과 mSQL과 연동시켜 주는 프로그램이다. 사용자는 HTML 내에서 간단한 방법으로 mSQL 명령을 실행시킬 수 있으며 w3-msql 프로그램은 HTML 내의 mSQL 명령을 해석하여 실행하는 역할을 한다.

현재 W3-mSQL에서 지원하고 있는 명령은 다음과 같다.

<! msql command args >

<! msql connect [host] >

<! msql close >

<! msql database DBName >

<! msql query "query text" QueryHandle >

<! msql free QueryHandle>

<! msql print "format" >

<! msql print_rows QueryHandle "format" >

<! msql if ( condition ) >

<! msql else >

<! msql fi >

<! msql fetch QueryHandle>

<! msql seek QueryHandle Position>

위와 같은 명령으로 이루어진 페이지를 /cgi-bin/w3-msql 프로그램이 수행하게 되는데 "/cgi-bin/w3-msql/Path/To/Your/Pages.html"과 같이 자신의 홈페이지 위치로 URL이 결정된다. 즉 w3-msql 프로그램은 /Path/To/Your/Pages.html을 읽어 수행하게 되는 것이고 Pages.html의 내부에는 위의 명령과 HTML의 태그로 이루어진 HTML 파일인 것이다. W3-mSQL의 자세한 내용은 http://Hughes.com.au/library/msql2/manual/의 W3-mSQL 부분을 보면 쉽게 알 수 있고, Lite에 관련된 매뉴얼도 함께 찾을 수 있다.

3.2.2 PHP/FI

PHP/FI는 Personal Home Page/Form Interpreter를 약자로서 처음에는 홈페이지를 억세스 했을때 아래 그림과 같이 사용자에 대한 정보와, 페이지별로 접속 수의 계산등 홈페이지 관리용으로 만들어 졌다.

-----------------------------------------------------------------------

162290 total hits since Wednesday March 6. 213 hits today.

Last access on Saturday May 3 at 10:48:54 from brw1109001.gte.net

Page was last updated on Sunday April 13, 1997 at 1:01:07

-----------------------------------------------------------------------

이런 홈페이지 관리를 위해서는 데이타베이스를 이용하는 것이 편리한 방법이고, 따라서 모든것을 CGI로 하기가 너무나 복잡하고 힘들기 때문에 몇개의 CGI를 두고 파라미터를 통해 모든 계산을 그 CGI에서 하도록 하기 위하여 만들었다. 이렇게 만들다 보니 스크립트 형태가 되었고, 지속적으로 필요한 부분을 추가한 결과 현재는 웹에서의 모든 작업을 위한 스크립트 언어로 발전하였다.

현재 PHP/FI에서 제공하는 기능은 스크립트 언어로써 CGI, FastCGI, 아파치 모듈, 억세스 로그, 억세스 컨트롤, 화일 업로드, 이미지 생성 등이며, 지원하는 데이타베이스로서는

mSQL

Postgres : http://epoch.cs.berkeley.edu:8000/postgres95/

mysql : http://www.tcx.se/

Solid : http://www.solidtech.com/

Sybase : http://www.sybase.com/

Oracle : http://www.oracle.com/

DBM : Unix의 (g)dbm

등이 있다. mSQL에서도 Lite와 같은 스크립트 언어가 제공되고 있고, 이 외에도 mSQL을 위한 스크립트 언어가 많음에도 불구하고 PHP/FI를 소개하는 이유는 PHP/FI는 Lite의 이전에 mSQL에 대한 여러가지 API를 제공하고 있고, 또 mSQL외에도 위와 같은 다양한 DBMS에 대한 API를 제공하고 있기 때문이다.

PHP/FI의 사용 방법과 각각의 데이타베이스에 대한 함수는 http://www.vex.net/php/doc.phtml 에서 찾아볼 수 있는데, 그 중 mSQL의 함수는 다음과 같다.

msql() : $result = msql($database,$query)

msql_Close() : msql_close()

msql_Connect() : msql_connect($hostname)

msql_CreateDB() : msql_CreateDB($database)

msql_dbName() : msql_dbName($result,$i)

msql_DropDB() : msql_DropDB($database)

msql_FieldFlags() : msql_FieldFlags($result,$i)

msql_FieldLen() : msql_FieldLen($result,$i)

msql_FieldName() : msql_FieldName($result,$i)

msql_FieldType() : msql_FieldType($result,$i)

msql_FreeResult() : msql_FreeResult($result)

msql_ListDBs() : $result = msql_ListDBs()

msql_Listfields() : $result = msql_Listfields($database,$tablename)

msql_ListTables() : $result = msql_ListTables($database)

msql_NumFields() : msql_NumFields($result)

msql_NumRows() : msql_NumRows($result)

msql_RegCase() : msql_RegCase(string)

msql_Result() : msql_Result($result,$i,field)

msql_TableName() : msql_TableName($result,$i)

위와 같은 함수를 이용하여 사용자는 HTML 상에서 자신이 원하는 부분을 기술할 수 있다.

<?

$name = "bob";

$result = msql($database,"select * from table where firstname='$name'");

$num = msql_numrows($result);

echo "$num records found!";

$i=0;

while($i<$$num);

echo msql_result($result,$i,"fullname");

echo "

echo msql_result($result,$i,"address");

echo "

$i++;

endwhile;

>

즉, PHP/FI는 "<?" 와 ">"의 사이에 스크립트로 기술하고 PHP/FI 프로그램이 "<?" 와 ">" 사이의 스크립트를 실행하여 원하는 형태의 텍스트로 변환한다. PHP/FI의 예제는 http://www.vex.net/php/examples.phtml에서 찾아 볼 수 있다.

마지막으로 PHP/FI에서 살펴볼 것은, PHP/FI와 아파치 서버, mSQL을 이용하여 웹과 데이타베이스를 tightly-couple 되게 연동시키고 그 인터페이스로 PHP/FI를 사용하는 방법이 있다. 이는 현재 웹의 Basic Authentication을 mSQL의 데이타베이스에 저장하게 하고 아파치 서버가 Basic Authenticaion을 위한 체크시에 디렉토리 내의 화일을 검사하지 않고 mSQL 데이타베이스를 참조하도록 하게 하는 방법이다. 이렇게 함으로써 HTTP를 통하여 유저 검사를 일반 화일이 아닌 mSQL 데이타베이스를 통하여 하게 하는 것이다. 이렇게 하기 위해서는 httpd를 수정해야 한다. 아파치의 경우에는 src/ 디렉토리에서 Configuration 화일을

# Module msql_auth_module    mod_auth_msql.o

에서

Module msql_auth_module    mod_auth_msql.o

으로 수정한 다음, make 하여 httpd를 수정한다. (Apache의 다운로드, 컴파일등은 http://www.apache.org/docs/을 참고하기 바란다)

httpd를 새로이 만들었으면 ID와 패스워드가 들어갈 데이타베이스를 생성한다. 아래의 예는 데이타베이스명이 www이고 테이블명이 user_records, user_records의 테이블은 ID가 들어갈 User_id와 패스워드가 들어갈 Cpasswd, 그리고 그룹이름이 들어갈 Xgroup으로 구성되어 있다. 필요에 의하여 테이블에 어트리뷰트를 추가할 수 있다.

% msqladmin create www

% msql www

-> create table user_records (

->   User_id  char(32) primary key,

->   Cpasswd  char(32),

->   Xgroup   char(32)

->   ) \g

query OK

-> \q

%

httpd를 수정하고 ID와 패스워드가 들어갈 데이타베이스를 생성한 다음, 기존에 만들어 놓은 access control file을 수정한다. 이는 conf/access.conf일 수 있고, 또 해당 디렉토리의 .htaccess 화일일 수 있다. 기본적으로 "AuthType"과 "AuthName"은 똑같이 사용하고 "AuthUserFile"에 ID와 패스워드가 있는 화일의 위치를 적었었는데 이제는 AuthUserFile 필드 대신에 다음과 같은 필드들이 사용된다.

Auth_MSQLhost < FQHN | IP Address | localhost >

Auth_MSQLdatabase < mSQL database name >

Auth_MSQLpwd_table < mSQL table name >

Auth_MSQLuid_field < mSQL field name >

Auth_MSQLpwd_field < mSQL field name >

Auth_MSQLgrp_field < mSQL field name >

Auth_MSQL_nopasswd < on | off >

Auth_MSQL_Authorative < on | off >

Auth_MSQL_EncryptedPasswords < on | off >

Auth_MSQLhost	mSQL 데이타베이스가 있는 호스트

Auth_MSQLdatabase	mSQL 데이타베이스 이름

Auth_MSQLpwd_table	테이블 이름

Auth_MSQLuid_field	ID로 사용할 필드 명

Auth_MSQLpwd_field	패스워드로 사용할 필드 명

Auth_MSQLgrp_field	그룹으로 사용할 필드 명

Auth_MSQL_nopasswd	on의 경우 패스워드가 없는 것을 허용, off의 경우 허용하지

않는다. 디폴트는 off.

Auth_MSQL_Authorative	on의 경우 패스워드가 맞지 않을경우 억세스 거부 메시지가

나가지만, off의 경우 패스워드가 맞지 않을경우 다른

억세스(htpasswd 화일 또는 (g)dbm modules)을 검사한다.

디폴트는 on

Auth_MSQL_EncryptedPasswords on의 경우 암호화 하여 데이타베이스에 저장하고 off의

경우 텍스트 데이타를 데이타베이스에 저장. 디폴트는 on

새로이 구성한 access control 화일은 다음과 같다.

Auth_MSQLhost www.comeng.chungnam.ac.kr

Auth_MSQLdatabase www

Auth_MSQLpwd_table user_records

Auth_MSQLuid_field User_id

Auth_MSQLpwd_field Cpasswd

Auth_MSQL_nopasswd off

Auth_MSQL_Authorative on

Auth_MSQL_EncryptedPasswords on

AuthName example mSQL realm

AuthType basic

위와 같이 모든 환경을 바꾼 후에, 데이타베이스에 ID, 패스워드, 그룹명을 로딩한 후

<?

if(!$PHP_AUTH_USER) {

Header("WWW-authenticate: basic realm=\"My Realm\"");

Header("HTTP/1.0 401 Unauthorized");

exit;

} else {

echo "Hello $PHP_AUTH_USER.<P>";

echo "You entered $PHP_AUTH_PW as your password.<P>";

}

>

위와 같은 스크립트를 사용하면 원하는 페이지마다 데이타베이스로부터 ID와 패스워드를 검사할 수 있다.

3.3 자바를 이용한 mSQL 사용 방법

MsqlJava Class Library는 어플리케이션과 애플릿이 mSQL 데이타베이스를 접근할 수 있도록 만들어진 자바 클래스 라이브러리이다. 이 MsqlJava Class Library는 2.3절에서 언급한 함수를 자바로 구현한 것으로써 JDBC를 이용한 프로그램보다 수행 속도가 빠르나 mSQL DBMS에 의존적인 것이 단점으로 지적할 수 있다. 현재 MsqlJava Class Library의 버전은 1.2.1로써 mSQL 2.0을 지원하고 있으며, MsqlJava 1.1.3은 mSQL 버전 1.0.x까지만 지원한다.

MsqlJava Class Library에 대한 자세한 정보는 다음에서 찾을 수 있다.

다운로드

ftp://dada.minmet.uq.oz.au/pub/

튜토리얼 자료

http://mama.minmet.uq.oz.au/msqljava/tutorial.html

FAQ

http://mama.minmet.uq.oz.au/msqljava/faq.html

발표 자료

http://mama.minmet.uq.oz.au/msqljava/inside/index.htm

MsqlJava Class Library를 이용한 프로그램도 CGI와 거의 유사한 방식이다. 아래의 예는 people이란 DB의 내용을 Update하는 간단한 예제 프로그램으로써 MsqlJava Class Library를 이용한 mSQL 데이타베이스 게이트웨이이다.

// MsqlJava Example Program.

// Written by KangChan Lee.

// Email: dolphin@comeng.chungnam.ac.kr

import java.lang.*;

import msql.*;

class update_test

{

public static void main(String args[])

{

String query_str = "UPDATE people SET BelongTo='충남대학교'

where name='이강찬'";

Msql mSQL = new Msql();

mSQL.Connect("joinus.comeng.chungnam.ac.kr", "dolphin", false)

mSQL.SelectDB("people");

MsqlResult msqlresult = mSQL.Query(query_str);

mSQL.Close();

}

}

위 프로그램을 간단히 정리해보면 Msql Class의 객체를 생성한 후에, 주어진 호스트(joinus) 에 Connection을 이루고, 데이타베이스(people)를 선택한 다음, 질의(update 문)를 보내고, 연결을 해제 하는 순서로 구성되어 있다.

이 밖의 연산도 위와 유사한 방식으로 구성되어 있다.

3.4 JDBC

JDBC(Java DataBase Connectivity)란 ODBC와 같은 개념으로 다양한 관계형 데이터베이스들을 위한 일관된 인터페이스를 제공한다. 따라서 JDBC로 구현된 프로그램이라면 같은 스펙의 JDBC를 제공하는 데이타베이스를 접근할 수 있는, 즉 하나의 프로그램으로 여러 데이타베이스에 대한 접근을 가능하게 할 수 있는 것이다. 본 워크샵의 JDBC는 본 워크샵의 A24세션인 "JDBC"에서 보다 자세히 다루므로 본 강의에서는 mSQL에서 JDBC 드라이버의 제공에 대한 내용만 언급하도록 하겠다.

mSQL의 JDBC 드라이버는 현재 버전이 1.0 알파 2로써 JDK 1.1이상, mSQL 1.0.16이상을 제공한다. mSQL의 JDBC 드라이버에 대한 자세한 정보는 다음에서 찾을 수 있다.

다운로드

ftp://ftp.imaginary.com/pub/Java/database/mSQL-JDBC.tar.gz

문서들

http://www.imaginary.com/Java/docs/Package-COM.imaginary.sql.msql.html

mSQL-JDBC mailing list 가입

majordomo@imaginary.com에 본문에 "subscribe msql-jdbc"이라고 기입후, 메일을 보내면 된다.

아래의 프로그램은 joinus라는 호스트에 있는 Testdb 데이타베이스에 접속하여 people 테이블의 이름과 나이를 검색하여 출력해주는 간단한 예제 프로그램이다.

// JDBC Example Program.

// Written by KangChan Lee.

// Email: dolphin@comeng.chungnam.ac.kr

import java.net.URL;

import java.sql.*;       // JDBC API.

import imaginary.sql.*;

class Select

{

public static void main(String argv[])

{

try

{

new imaginary.sql.iMsqlDriver();

String url = "jdbc:msql://joinus.comeng.chungnam.ac.kr:4333/Testdb";

Connection con = DriverManager.getConnection(url, "dolphin", "");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * from people ORDER BY age");

System.out.println("Got results:");

while( rs.next() )

{

String name = rs.getString(1);

int age     = rs.getInt(2);

System.out.println(" name= " + name);

System.out.println(" age= " + age);

System.out.print("\n");

}

stmt.close();

con.close();

}

catch( Exception e )

{

System.out.println(e.toString());

e.printStackTrace();

}

}

}

위 프로그램의 수행과정을 간단히 정리해 보면 다음과 같다.

□ mSQL-JDBC Driver를 생성

□ 접근 URL을 추가로 생성

□ "dolphin" 이란 ID로 Authentification을 얻고난 후 Connection 얻음

□ Statement를 생성하여 Query를 보냄

□ 주어진 Query에 대한 ResultSet을 얻음

□ Fetch 과정을 통하여 결과를 검색

4. 결론

웹의 사용에 있어 대규모의 데이타를 관리하는데 데이타베이스의 사용은 필수적이다. 그러나 데이타베이스의 사용이 일반 사용자에게 쉽지 않을 뿐만 아니라, 그 가격이 매우 비싸 쉽게 접할 수 없다. mSQL은 데이타베이스에 필요한 기본 기능을 가진 작은 데이타베이스 관리 시스템으로써, 개인 사용자에게는 무료로 제공된다. 이 mSQL은 소스가 공개 되어 있기 때문에 많은 사람들의 도움으로 다양한 방법으로 웹과 데이타베이스를 연동시키는 방법들이 제안되고 있고 DBMS 중에서는 가장 활발하게 다양한 게이트웨이들이 개발되고 있다. 본 문서에서는 다양한 게이트웨이 중에서 CGI, 스크립트, 자바 클래스 라이브러리, JDBC 등의 실제 코드를 통하여 프로그램 개발자의 입장에서의 차이점들을 살펴 보았다. 이러한 방법들은 상용 DBMS 에서도 거의 유사한 방법으로 제공되고 있는 기능들이다. 또한 위 방법들의 사용 추세는 현재로서는 기술적으로는 JDBC의 방법이 지속적으로 발전할 것으로 보이며, CGI의 방법도 매우 익숙한 방법이기 때문에 계속 사용되어질 것으로 보인다.

마지막으로 위의 내용은 http://sharon.comeng.chungnam.ac.kr/~dolphin/ws5/B24/에서 지속적으로 갱신 될것이며 현재 본 문서에서 언급하지 못한 부분들도 확장할 것이다.

References

[1] 김평철, 웹을 위한 데이타베이스 통로의 분류체계 URL : http://sharon.comeng.chungnam.ac.kr/~dolphin/ws3/content/A5/

[2] mSQL 2.0 Online Manual, URL : http://Hughes.com.au/library/msql2/manual/ URL : http://sharon.comeng.chungnam.ac.kr/~dolphin/ws5/B24/mSQL/library/msql2/manual/

[3] PHP/FI(Personal Home Page/Form Interpreter), URL : http://www.vex.net/php/

[3] Apache User's Guide URL : http://www.apache.org/docs/

[5] MsqlJava Home Page, URL : http://mama.minmet.uq.oz.au/msqljava/

[6] Brian Jepson, Java Database Programming, URL : http://www.ids.net/~bjepson/javadb/toc.html

[7] mSQL JDBC Driver, URL : http://www.imaginary.com/~borg/Java/

부록 : mSQL Third Party Contribution Program List

ESL

ftp://bond.edu.au/pub/Minerva/esl/esl-0.3.tar.gz

w3-msql

ftp://bond.edu.au/pub/Minerva/msql/w3-msql/w3-msql-1.0.tar.gz

Apache

ftp://ftp.ceo.org/pub/ewse-mSQL-apache-demos/apache-msql-demo.1.0.1.tar.gz

http://www.apache.org/dist/contrib/modules/mod_auth_msql.c

Bind

ftp://ftp.vix.com/pub/bind/release/bind-4.9.3-REL.tar.gz

Command Line Tool

http://www.camelot.de/~kvm/progs/sql.tar.gz

Dbadmin

http://bauhaus.skiles.gatech.edu/~jharrell

ftp://bond.edu.au/pub/Minerva/msql/Contrib/dbadmin_v1.0.tar.gz

DBASE

ftp://gopher.library.tudelft.nl/pub/misc/dbf2msql-1.02b.tar.gz

DBI/DBD

http://www.hermetica.com

ftp://ftp.mcqueen.com/pub/dbperl

ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN

http://www.hermetica.com/technologia/DBI

Dbview

ftp://bond.edu.au/pub/Minerva/msql/Contrib/dbview-0.7.tar.gz

Digger

http://www.bunyip.com/products/digger

Emacs

ftp://bond.edu.au/pub/Minerva/msql/Contrib/sql-mode.tar.gz

Flat File Importer

ftp://bond.edu.au/pub/Minerva/msql/Contrib/msql-import-0.0.9.tar.gz

Home Page Construction Kit - PHP

http://www.vex.net/php

HTML Interface to mSQL

ftp://bond.edu.au/pub/Minerva/msql/Contrib/msqlc2.zip

ftp://ftp.blm.gov/pub/gis/msqlc2.zip

http://www.blm.gov/gis/msql/vertical/test2.html

ICI

ftp://ftp.ntua.gr/pub/lang/ici/iciMsql.tar.gz

Java

ftp://bond.edu.au/pub/Minerva/msql/Contrib/MsqlJava-1.1.0.tar.Z

ftp://bond.edu.au/pub/Minerva/msql/Contrib/MsqlJava-1.1.0.zip

http://www.minmet.uq.oz.au/msqljava

MS Windows

ftp://bond.edu.au/pub/Minerva/msql/Contrib/winapi.zip

ftp://bond.edu.au/pub/Minerva/msql/Contrib/winmsql7.zip

Object Oriented HTML API

ftp://ftp.blm.gov/pub/gis/msql_api.tar.gz

http://www.blm.gov/gis/msql/dbs6.html

OCX

ftp://vgl.ucdavis.edu/pub/mSQL/ocxmsql-0.90.zip

ftp://Bond.edu.au/pub/Minerva/msql/Contrib/msqlocx.zip

ODBC

ftp://ftp.comed.com/pub/msql/odbc

http://alfred.niehs.nih.gov

ftp://bond.edu.au/pub/Minerva/msql/Contrib/ODBC

Onyx

ftp://ftp.uni-bremen.de/pub/unix/database/Onyx/Onyx.2.45.src.tar.gz

OS/2

ftp://bond.edu.au/pub/Minerva/msql/Contrib/msql113a-os2.lsm

ftp://bond.edu.au/pub/Minerva/msql/Contrib/msql113a-os2.zip

Perl

ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-category/07_Database_Interfaces/Msql/

ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN

Python

ftp://bond.edu.au/pub/Minerva/msql/Contrib/PymSQL.tar.gz

REXX

ftp://bond.edu.au/pub/Minerva/msql/Contrib ftp://ftp.qut.edu.au/src/REXXSQL ftp://ftp.xylogics.com/pu  b/misc/REXXSQL

Simple SQL

http://www.saturn.net/~bjepson/simple.html

SQLBase

ftp://bond.edu.au/pub/Minerva/msql/Contrib/mSQLBase-1.00.tgz

Tcl

ftp://bond.edu.au/pub/Minerva/msql/Contrib/msqltcl-1.50.tar.gz

ftp://bond.edu.au/pub/Minerva/msql/Contrib/tcl_msql.tar.gz

Time and date utilities

ftp://bond.edu.au/pub/Minerva/msql/Contrib/time_library.tar.gz

tkmSQL

ftp://ftp.wpi.edu/perl5

http://w4.lns.cornell.edu/~pvhp/ptk/ptkFAQ.html

Unique sequence number generator

ftp://bond.edu.au/pub/Minerva/msql/Contrib/sgs-1.0.0.tar.gz

Visual Basic

ftp://bond.edu.au/pub/Minerva/msql/Contrib/msqlcvb.zip

WDB

http://arch-http.hq.eso.org/wdb/html/wdb.html

Websql

http://www.ua.com/websql

XfSQL

ftp://bond.edu.au/pub/Minerva/msql/Contrib/xfsql.tar.gz  ftp://laue.phys.uwm.edu/pub/xforms/test  ftp://ftp.cs.ruu.nl/pub/XFORMS/test

Z Classes for C++

ftp://bond.edu.au/pub/Minerva/msql/Contrib/zmsql-2.1.tar

이 밖의 여러 사람의 공헌으로 만들어진 코드나 응용 프로그램은 ftp://ftp.bond.edu.au/pub/Minerva/msql/faq.html#other-apps에서 찾아볼 수있다.