GDBMÀ» ÀÌ¿ëÇÑ °£´ÜÇÑ DBÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>gdbm



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

¿äÁò »çÀÌÆ®¿¡ À־ mysql, oracle, postgresql µî RDBMS °¡ ¾²ÀÌÁö ¾Ê´Â °÷ÀÌ °ÅÀÇ ¾øÀ»Á¤µµ·Î ¸¹Àº Àα⸦ ²ø°í ÀÖ´Ù.
±× ¹Ý¸é NIS, BIND, sendmal, LDAP µî ¸¹Àº ÇÁ·Î±×·¥µéÀÌ °¢°¢ÀÇ ÀڷḦ °ü¸®Çϱâ À§Çؼ­ ±»ÀÌ RDBMS ¸¦ ¾²Áö ¾Ê°í ndbm, dbm, gdbm À» »ç¿ëÇϰí ÀÖ´Ù. ¿Ö ¸·°­ÇÑ RDBMS¸¦ ¾²Áö ¾Ê°í ÀÌ·¯ÇÑ °£´ÜÇÑ dbm À» ¾²´Â°É±î ?
±× ÀÌÀ¯´Â °£´ÜÇÑ ÀÏÀ» Çϱâ À§Çؼ­ RDBMS ´Â ³Ê¹« Å©°í ³Ê¹« °ÅÃßÀå ½º·´´Ù´Â °ÍÀÌ´Ù. ¼Ò±Ô¸ð(1000 ¿¡¼­ 10000 °Ç) Á¤µµÀÇ ÀüÈ­¹øÈ£ºÎ¸¦ °ü¸®ÇѴٰųª, sendmail ¿¡¼­ ¼ö¹é°Ç ¹Ì¸¸ÀÇ hosts(relay Çã¿ëµî) db¸¦ °ü¸®Çϴµ¥¿¡´Â ½ÇÁö·Î RDBMSÀÇ ±â´ÉÀÇ 10%µµ ÇÊ¿äÇÏÁö ¾Ê´Ù. ÀÌ·¯ÇÑ °£´ÜÇÑ DB¸¦ À¯ÁöÇÏ·Á°í, ¼­¹ö¿¡ RDBMS ¸¦ ¼³Ä¡Çϰí, ¿î¿ëÇϰí, ÇÁ·Î±×·¡¹ÖÀ» Çϰí, º¹ÀâÇÑ SQLÀ» »ç¿ëÇÏ´Â°Ç ³Ê¹« ¼Ò¸ðÀûÀÎ ÀÏÀÌ´Ù. ±×·¡¼­ ÀÌ·¯ÇÑ °£´ÜÇÑ ¼Ò±Ô¸ðÀÇ µ¥ÀÌŸ¸¦ °ü¸®Çϱâ À§Çؼ­ dbm ÀÌ Á¸ÀçÇÑ´Ù.

dbm Àº °ü°èÇü µ¥ÀÌŸ ±¸Á¶ ¸ðµ¨À» °¡ÁöÁö ¾Ê°í, HASH µ¥ÀÌŸ ±¸Á¶ ¸ðµ¨À» °¡Áø´Ù. HASH ´Â Key(Ű), Value(°ª) ÀÇ ÇѽÖÀ¸·Î ÀÌ·ç¾îÁö´Â µ¥ÀÌŸÀÇ ÁýÇÕÀ¸·Î½á ۸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌŸ¸¦ ÀúÀåÇϰí, °Ë»öÇϰí, »èÁ¦ÇÏ´Â ÀÛ¾÷À» ÇÑ´Ù.
¾îÂî º¸¸é C ¿¡¼­ÀÇ pointer °³³ä°ú ºñ½ÁÇÏ´Ù°í ÇÒ¼ö Àִµ¥, Value ¸¦ Key °¡ °¡¸£Å²´Ù°í º¸¸é ¹«³­ÇÒµí ÇÏ´Ù.
RDBMS ¿Í´Â ´Þ¸® ÇϳªÇϳªÀÇ µ¥ÀÌŸ°¡ ´Ù¸¥ µ¥ÀÌŸ¿Í´Â º°°³·Î Á¸ÀçÇϹǷΠRDBMS ó·³ µ¥ÀÌŸ°£ÀÇ °ü°è¿¡ ÀÇÇÑ ÁúÀÇ ¾ð¾î°¡ ÇÊ¿ä¾øÀÌ °£´ÜÇÏ°Ô Key¸¸À» È£ÃâÇϸé, ±× Ű¿¡ ¿¬°áµÈ °ªÀ» °¡Á®¿Ã¼ö ÀְԵȴÙ. ±â´ÉÀÇ ÇѰ谡 ¸íÈ®ÇϹǷÎ, ¹è¿ö¼­ ±¸ÇöÇϱⰡ ¸Å¿ì ½¬¿ì¸ç, ÀÛ°í ¶ÇÇÑ ºü¸£´Ù¶ó´Â ÀåÁ¡À» °¡Áø´Ù.

GDBM Àº GNU database mansger ·Î½á ÀüÅëÀûÀ¸·Î Unix ÂÊ¿¡¼­ ¾²ÀÌ´ø dbm ÀÇ È®ÀåÇüÀÌ´Ù.
¾Æ·¡ÀÇ ¿¹Á¦´Â °£´ÜÇÑ ÁÖ¼Ò·ÏÀÌ´Ù. ºñ·Ï °£´ÜÇÏÁö¸¸ ¼¼·ÃµÈ ÄÚµå´Â ¾Æ´ÏÁö¸¸ µ¥ÀÌŸÀÇ ÀÔ·Â, °Ë»ö, »èÁ¦ µî dbm À¸·Î½á °¡Á®¾ßÇÒ ±âº»ÀûÀÎ ±â´ÉÀ» »ìÆìº¸´Âµ¥ ¾î·Á¿òÀº ¾øÀ»°ÍÀ¸·Î »ý°¢µÈ´Ù.

¿¹Á¦ : address.c
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <gdbm/gdbm.h>

const int FALSE = 0;
const int TRUE  = 1;


int main(int argc, char **argv)
{
    datum key_data;
    datum value_data;
    datum return_data;

    char cmd_char;
    int done = FALSE;

    GDBM_FILE dbf;


    int block_size = 0;

    int temp;

    char key_line[80];
    char value_line[255];

    key_data.dptr = NULL;
    value_data.dptr = value_line;

    if (access("/tmp/my_dic", F_OK) != 0)
    {
        printf( "»çÀü DB ÆÄÀÏÀÌ Á¸Àç ÇÏÁö ¾Ê½À´Ï´Ù"
                "¿µ¾î »çÀü  DB ÆÄÀÏÀ» »õ·Î ¸¸µé°Ú½À´Ï±î (y/n)? ");
        cmd_char = getchar();

        while(1)
        {
            if (cmd_char != '')
            {
                char temp;
                do
                    temp=getchar();
                while (temp != '' && temp != EOF);
            }

            if (cmd_char == EOF) cmd_char = 'n';
            switch(cmd_char)
            {
                case 'y':
                    dbf = gdbm_open ("/tmp/my_dic", block_size, GDBM_WRCREAT|GDBM_FAST, 00664, NULL);
                    if (dbf == NULL)
                    {
                        perror("db file open error : ");
                        exit(0); 
                    }
                    break;
                case 'n':
                    return 1;
                    break;
            }

            if (cmd_char == 'y')
                break;
        }

    }
    else
    {
        dbf = gdbm_open ("/tmp/my_dic", block_size, GDBM_READER|GDBM_WRITER, 00664, NULL);
        if (dbf == NULL)
        {
            perror("db file open error : ");
            exit(0);
        }
    }


    printf("ÁÖ¼Ò °ü¸® ÇÁ·Î±×·¥ÀÔ´Ï´Ù. "
           "»ç¿ë¹ýÀÌ ±Ã±ÝÇϽøé ? ¸¦ ÀÔ·ÂÇϼ¼¿ä");
    // »ç¿ëÀÚÀÇ Å°º¸µå ÀԷ¹®ÀÚ¿­À» ¹Þ¾Æ¼­ ÇÊ¿äÇÑ 
    // ÇൿÀ» ÃëÇÑ´Ù.
    while(!done)
    {
        printf("com -> ");
        cmd_char = getchar();

        if (cmd_char != '')
        {
            char temp;
            do
                temp = getchar();
            while (temp != '' && temp != EOF);
        }
        if (cmd_char == EOF) cmd_char = 'q';

        switch (cmd_char)
        {
            case 'q':
                done = TRUE;
                break;
            case '?':
                printf("i -- insert data"
                       "f -- fetch data"
                       "c -- data num"
                       "d -- data delete"
                       "q -- quit");
                break;

            case '':
                printf("");
                break;
            case 'i':
                if (key_data.dptr != NULL) free(key_data.dptr);
                printf("Key -> ");
                fgets (key_line, 80, stdin);
                key_line[strlen(key_line) - 1] = '0';

                key_data.dptr = key_line;
                key_data.dsize = strlen(key_line) + 1;

                printf("Value -> ");
                fgets(value_line, 255, stdin); 

                value_data.dsize = strlen(value_line) + 1;
                if (gdbm_store (dbf, key_data, value_data, GDBM_REPLACE) != 0)
                    printf("Item no inserted ");
                printf("");
                key_data.dptr = NULL;
                break;

            case 'f':
                if (key_data.dptr != NULL) free(key_data.dptr);
                printf("Key -> ");
                fgets (key_line, 80, stdin);
                key_line[strlen(key_line) -1] = 0;
                key_data.dptr = key_line;
                key_data.dsize = strlen(key_line) + 1;

                return_data = gdbm_fetch(dbf, key_data);
                if (return_data.dptr != NULL)
                {
                    printf("data -> %s", return_data.dptr);
                    free(return_data.dptr);
                }

                else
                    printf("No Such item found. ");
                key_data.dptr = NULL;
                break;
            case 'c':
                temp = 0;

                if (key_data.dptr != NULL) free (key_data.dptr);
                return_data =  gdbm_firstkey(dbf);
                while(return_data.dptr != NULL)
                {
                    temp ++;
                    key_data = return_data;
                    return_data = gdbm_nextkey(dbf, key_data);
                    free(key_data.dptr);
                }
                printf("%d °³ÀÇ ÀÚ·á°¡ ÀÖ½À´Ï´Ù", temp);
                key_data.dptr = NULL;
                break;

            case 'a':
                key_data = gdbm_firstkey(dbf);
                if (key_data.dptr == NULL)
                {
                    printf("No one tiem found");
                    break;
                }
                else
                {
                    printf("%s => ", key_data.dptr);
                    return_data = gdbm_fetch(dbf, key_data);
                    printf("%s", return_data.dptr);
                    free(return_data.dptr);
                }
                while(1)
                {
                    return_data = gdbm_nextkey(dbf, key_data);
                    if (return_data.dptr != NULL)
                    {
                        free(key_data.dptr);
                        key_data = return_data;
                        printf("%s => ", key_data.dptr);
                        return_data = gdbm_fetch(dbf, key_data);
                        printf("%s", return_data.dptr);
                        free(return_data.dptr);
                    }
                    else
                    {
                        printf("No such item found.");
                        break;
                    }
                }
                key_data.dptr = NULL;
                break;

            case 'd':
                if (key_data.dptr != NULL) free (key_data.dptr);

                printf("Key -> ");
                fgets (key_line, 80, stdin);
                key_line[strlen(key_line) -1] = 0;
                key_data.dptr = key_line;
                key_data.dsize = strlen(key_line) + 1;
                if(gdbm_delete (dbf, key_data) != 0)
                    printf("Item not found or deleted");
                key_data.dptr = NULL;
                break;
        }
    }

    printf("bye bye");
    return 0;
}

datum ÀÇ dptr ¸â¹ö´Â malloc ¸¦ ÀÌ¿ëÇØ¼­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇϰí, ÀÚµ¿À¸·Î ÇØÁ¦½ÃÄÑÁÖÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ¹Ýµå½Ã ÇÊ¿ä¾ø´Ù°í »ý°¢µÇ´Â °÷¿¡¼­ free ¸¦ ÇØÁà¾ß ¸Þ¸ð¸® ´©¼ö ¹× ¿À·ù¸¦ ¹æÁöÇÒ¼ö ÀÖ´Ù.
À§ ÄÚµå´Â ¸Å¿ì ¸íÈ®ÇØ º¸À̹ǷΠº°µµ·Î ¼³¸íÀ»ÇÏÁø ¾ÊÀ» »ý°¢ÀÌ´Ù. ¾Æ¸®¼ÛÇÏ´õ¶óµµ Çѹø Á¤µµ ÄÄÆÄÀÏ ÇØ¼­ »ç¿ëÇØº¸¸é¼­ Äڵ带 º¸¸é ½±°Ô ÀÌÇØ°¡ µÉ°ÍÀÌ´Ù.
gdbm ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº man ÆäÀÌÁö¸¦ Âü°íÇ϶ó
ÄÄÆÄÀÏ ¹æ¹ýÀº ¾Æ·¡¿Í °°´Ù.
[yundream@localhost test]# gcc -o address address.c -lgdbm
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.