¿äÁò »çÀÌÆ®¿¡ ÀÖ¾î¼ 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
|