메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

임베디드 시스템을 위한 GNU dbm의 소개

한빛미디어

|

2004-03-29

|

by HANBIT

15,658

저자: 임영규 / 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 소스 -----------------------------------------*/
// gdbm test head file
// use embedded system small DB
// auth : LimY.K
// Date : 04. 3. 25
// summary : from PCBOOK, 임베디드 리눅스 프로그래밍 참조
#ifndef DB_H
#define DB_H

#include    // gdbm function define head file
#include

// define main entities
typedef struct
{
char no[6];
char name[10];
}PERSON;

// define gdbm , key, data
GDBM_FILE gdbm;
datum key;
datum data;

// open gdbm
int open_db(char *db)
{
     gdbm = gdbm_open(db, 2048, GDBM_WRCREAT,00664, NULL);
     if (gdbm == NULL)
  return -1;

    return 0;
}


// get a maximum attribute from db
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);
     }

     return id;
}


// vie a all attributes
void list_db(void )
{
int id = 0;
datum db_ret;
datum a_key;

     // move to first of record
     a_key = gdbm_firstkey(gdbm);
     while(a_key.dptr != NULL)
     {
      // get a record from db
db_ret = gdbm_fetch(gdbm, a_key);
// print
        printf("id = %s\n", ((PERSON*)(db_ret.dptr))->no);
        printf("name = %s\n", ((PERSON*)(db_ret.dptr))->name);

// release memory for next record
  free(db_ret.dptr);

// move to next record
        db_ret = gdbm_nextkey(gdbm, a_key);

// release memory for next key
free(a_key.dptr);

// set a next point
a_key = db_ret;
     } // end while
}


// close gdbm
void close_db(GDBM_FILE db)
{
    gdbm_close(db);
}



// insert attribute to db
int insert_db(GDBM_FILE db, datum key, datum content, int flag)
{
    if (gdbm_store(db, key, content, flag) != 0)
return -1;
    else
return 0;
}

#endif

/*------------------------- 메인 소스 -----------------------------------------*/
// gdbm test main program
// use embedded system small DB
// auth : Lim.Y.K
// date : 04.3.25 
// summary : from PCBOOK, 임베디드 리눅스 프로그래밍 참조

#include "db.h"

int main()
{
PERSON std;
int max_id;

    if (open_db("testdb.gdbm") == -1)
exit (-1);

    printf("db O.K\n");
    // get a write point
    max_id = get_max_id();
    key.dptr = (char *)&max_id;
    key.dsize = sizeof(int);

    strcpy(std.no, "1236");
    strcpy(std.name, "MR. kim");

    // set a attribute pointer
    data.dptr = (char*)&std;
    data.dsize = sizeof(PERSON);

    // test insert
    if (insert_db(gdbm, key, data, GDBM_INSERT) == 0)
       printf("insert\n");
    else
       printf("fail\n");

    // test view
    list_db();

    // close gdbm
    close_db(gdbm);

    return 0;
}

3. 후기

이미 임베디드 시스템에 gdbm을 적용하는 사용자는 크게 새로울 것이 없겠지만, 이제 리눅스 기반으로 임베디드 시스템 데이터베이스를 구현하고자 하는 이들에게 간략하나마 유용한 정보가 되었으면 한다. 실제 gdbm에 대한 성능 테스트는 수행해 보지 못했지만 데이터베이스의 경량성과 속도면에서는 아주 유용하리라 본다. 기타 데이터베이스의 경우 임베디드 시스템의 제한된 메모리에서 운영하기란 다소 무리라고 생각된다. 따라서 gdbm은 이러한 문제를 능히 잘 극복 해 주리라 생각한다. 이후 좋은 결과를 얻게 되어 본 한빛 네트워크에서 그 결과를 확인할 수 있었으면 한다.
TAG :
댓글 입력
자료실

최근 본 상품0