출처 : http://network.hanbitbook.co.kr/view.php?bi_id=918
저자: 임영규 / GNMOE Linux Institute / imlinux@hanmir.com
1. 소개
리눅스 시스템을 위한 데이터베이스로 공개된 것은 여러 개가 있다. 이들 중 프로그램 크기가 크지 않으면서도 속도가 빠른 데이터베이스를 소개하고자 한다. GNU dbm 이 바로 그것이다. 이것은 보통 gdbm 이라 불리운다.
2. 프로그렘 설치와 소개
gdbm을 설치하기 위해서는 gnu.org/software 사이트를 방문하여 소스 또는 rpm(레드햇 계열 리눅스, test RH7.2 ) 파일을 다운 받아야 한다.
레드햇의 경우 일반적으로 배포 CD에 포함되어 있으니 참고하기 바란다. 그림 [1]은 rpm 패키지를 확인 한 것이다.
그림 [1] RPM 설치 확인
다음으로 gdbm을 이용하기 위한 방법을 설명한다. 그림 [2]는 head 파일과 library에 대한 경로를 보여 준다.
그림 [2] head / library
간단한 소스 프로그램을 작성하고 컴파일 하기 위해서는 -lgdbm 옵션을 부여하면 된다.
여기에 간단한 소스 프로그램을 첨부한다. (출처 : 임베디드 리눅스 프로그래밍 (출)PC-BOOK, 이연조 지음) 물론 간단한 테스터를 위해 몇 부분만 간단히 편집한 것이다. 임베디드 시스템 각 플렛폼에 맞도록 cross-compile 하는 것은 사용자의 몫으로 남겨 둔다.
/*-------------------------Head소스-----------------------------------------*/
//gdbmtestheadfile
//useembeddedsystemsmallDB
//auth:LimY.K
//Date:04.3.25
//summary:fromPCBOOK,임베디드리눅스프로그래밍참조
#ifndef DB_H
#define DB_H
#include
#include
//definemainentities
typedef struct
{
char no[6];
char name[10];
}PERSON;
//definegdbm,key,data
GDBM_FILE gdbm;
datum key;
datum data;
//opengdbm
int open_db(char*db)
{
gdbm=gdbm_open(db,2048,GDBM_WRCREAT,00664,NULL);
if(gdbm==NULL)
return-1;
return0;
}
//getamaximumattributefromdb
int get_max_id(void)
{
int id=0;
datum a_key;
a_key=gdbm_firstkey(gdbm);
while(a_key.dptr!=NULL)
{
id=*(a_key.dptr);
a_key=gdbm_nextkey(gdbm,a_key);
}
returnid;
}
//vieaallattributes
void list_db(void)
{
int id=0;
datum db_ret;
datum a_key;
//movetofirstofrecord
a_key=gdbm_firstkey(gdbm);
while(a_key.dptr!=NULL)
{
//getarecordfromdb
db_ret=gdbm_fetch(gdbm,a_key);
printf("id=%s\n",((PERSON*)(db_ret.dptr))->no);
printf("name=%s\n",((PERSON*)(db_ret.dptr))->name);
//releasememoryfornextrecord
free(db_ret.dptr);
//movetonextrecord
db_ret=gdbm_nextkey(gdbm,a_key);
//releasememoryfornextkey
free(a_key.dptr);
//setanextpoint
a_key=db_ret;
}//endwhile
}
//closegdbm
void close_db(GDBM_FILEdb)
{
gdbm_close(db);
}
//insertattributetodb
int insert_db(GDBM_FILEdb,datumkey,datumcontent,intflag)
{
if(gdbm_store(db,key,content,flag)!=0)
return-1;
else
return0;
}
#endif
/*-------------------------메인소스-----------------------------------------*/
//gdbmtestmainprogram
//useembeddedsystemsmallDB
//auth:Lim.Y.K
//date:04.3.25
//summary:fromPCBOOK,임베디드리눅스프로그래밍참조
#include "db.h"
int main()
{
PERSON std;
int max_id;
if(open_db("testdb.gdbm")==-1)
exit(-1);
printf("dbO.K\n");
//getawritepoint
max_id=get_max_id();
key.dptr=(char*)&max_id;
key.dsize=sizeof(int);
strcpy(std.no,"1236");
strcpy(std.name,"MR.kim");
//setaattributepointer
data.dptr=(char*)&std;
data.dsize=sizeof(PERSON);
//testinsert
if(insert_db(gdbm,key,data,GDBM_INSERT)==0)
printf("insert\n");
else
printf("fail\n");
//testview
list_db();
//closegdbm
close_db(gdbm);
return0;
}
3. 후기
이미 임베디드 시스템에 gdbm을 적용하는 사용자는 크게 새로울 것이 없겠지만, 이제 리눅스 기반으로 임베디드 시스템 데이터베이스를 구현하고자 하는 이들에게 간략하나마 유용한 정보가 되었으면 한다. 실제 gdbm에 대한 성능 테스트는 수행해 보지 못했지만 데이터베이스의 경량성과 속도면에서는 아주 유용하리라 본다. 기타 데이터베이스의 경우 임베디드 시스템의 제한된 메모리에서 운영하기란 다소 무리라고 생각된다. 따라서 gdbm은 이러한 문제를 능히 잘 극복 해 주리라 생각한다. 이후 좋은 결과를 얻게 되어 본 한빛 네트워크에서 그 결과를 확인할 수 있었으면 한다.
'DATABASE' 카테고리의 다른 글
[mysql] 모니터링과 서버 튜닝 (0) | 2011.10.16 |
---|---|
[mysql] 응용프로그램에서의 최적화 (0) | 2011.10.16 |
[mysql] 기본적인 모니터링 방법과 Connection과 Memory 튜닝 방법 (0) | 2011.10.16 |
[ORACLE] SQLloader 문서 (0) | 2011.10.16 |
[ORACLE] PRIMARY KEY 나 Unique가 없이 중복된 데이터가 있을때 삭제하는 방법 (0) | 2011.10.16 |