Mini SQL API ¿Í À¥ ÀÎÅÍÆäÀ̽º

     

     

 

0.  ½ÃÀÛÇÏ´Â ¸».

    Á¡Á¡ ³¯¾¾°¡ ½Ò½ÒÇØ Áö´Â °ÍÀÌ ´À²¸Áø´Ù. ³ª¹« °¡Áö¿¡´Â ¹«¼ºÇÏ´ø ³ª¹µÀÙÀÌ ¶³¾îÁ®¼­ ¼­¼­È÷ °Ü¿ïÀ» ÁغñÇÏ´Â ¸ð½ÀµéÀÌ º¸ÀÌ´Â °Í °°´Ù. ¿©·¯ºÐµéµµ °Ü¿ï Áغñ°¡ µÇ¾î °¡´ÂÁö ¸ð¸£°Ú´Ù.

    Áö³­ ½Ã°£¿¡´Â °£´ÜÇÏ°Ô RDBMS¿Í E-R Diagram¿¡ ´ëÇÑ ³»¿ëµéÀ» ¿¹¸¦ µé¾î¼­ Å×À̺í°ú °°Àº °ÍµéÀ» ¸¸µé¾î º¸¾Ò°í, mSQL¿¡¼­ Áö¿øµÇ°í ÀÖ´Â SQL ¹®°ú µ¥ÀÌÅͺ£À̽º ½Ã½ºÅÛ À¯Æ¿¸®Æ¼µéÀ» ¾Ë¾Æ º¸¾Ò´Ù. ¾Æ¸¶µµ Áö³­¹ø ½Ã°£ÀÇ ¿¹µéÀÌ ÇöÁ¦ »õ·Î¿î µ¥ÀÌÅÍ º£À̽º¸¦ ÀÛ¼ºÇϴµ¥ ¸¹Àº µµ¿òÀÌ µÇ¸®¶ó°í »ý°¢µÈ´Ù.

    À̹ø ½Ã°£¿¡´Â ¿ì¸®µéÀÌ °¡Àå ¹Ù¶ó°í ½Ç¹«ÀûÀÎ °ÍµéÀ» ´Ù·ç¾î º¸±â·Î ÇÑ´Ù. API(Application Programming Interface)´Â ´ëºÎºÐÀÇ °è¹ß ÅøÀ̳ª ¾ð¾î¿¡¼­ Áö¿øÇÏ´Â ÇϳªÀÇ °è¹ßÀÚ¸¦ À§ÇÑ ¶óÀ̺귯¸®·Î, ´ëºÎºÐÀÇ °è¹ßÀÚµéÀº API¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ¸¸µé¾î ³»°í ÀÖ´Ù. ±×¹Û¿¡ mSQL¿¡¼­´Â Minerva ´ëÇп¡¼­ °è¹ßÇÑ ESLÀ̶ó´Â C¾ð¾î¿Í ºñ½ÁÇÑ ½ºÅ©¸³Æ® ¾ð¾î¸¦ °¡Áö°í, À¥°ú ¿¬µ¿À» ½±°Ô ÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇÏ°í ÀÖ´Ù. W3-mSQLÀº ¾ÆÁÖ Æí¸®ÇÑ WWW Interface ÆÐÅ°Áö·Î Ãʱ⿡´Â µû·Î À¥ »çÀÌÆ®¸¦ ã¾Æ¼­ ¹Þ¾Æ »ç¿ëÇØ¾ß ÇßÁö¸¸, 2.0.0¹öÀüºÎÅÍ´Â ÇÔ²² °è¹ßÀÌ µÇ°í ÀÖ´Â »óȲÀ¸·Î º¸´Ù ½¬¿î À¥ ÀÎÅÍÆäÀ̽º Á¢±ÙÀ» ÇÒ ¼ö ÀÖ´Ù.

    ¿ì¸®ÀÇ ÃÖ´ëÀÇ °­Àû(?)ÀÎ Windows °è¿­¿¡¼­ÀÇ À¥ ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ ºñ±³¸¦ ÇÏÁö ¾ÊÀ» ¼ö ¾øÀ» °ÍÀÌ´Ù. ¿©·¯ºÐµéÀÌ ÁÖ¸ñÇØ¾ß ÇÒ Á¡Àº Windows NT¿Í IIS ¼­¹ö¿¡¼­ Áö¿øÇÏ°í ÀÖ´Â ISAPI, VBScript¿Í °°ÀÌ ¾ÆÁÖ ½¬¿î ¹æ¹ýµéÀ» ¿©·¯ºÐµéÀº ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ±×·¯³ª ±×°Í º¸´Ùµµ ´õ ½±°í À¯Áö º¸¼ö°¡ ½±´Ù´Â Á¡ÀÌ´Ù. °ÅÀÇ Perl ½ºÅ©¸³Æ®¿Í °°Àº ¹®ÀåÀ» »ç¿ëÇϱ⸸ Çصµ À¥ÆäÀÌÁö¸¦ ½±°Ô Á¢±ÙÇÒ ¼ö ÀÕ´Ù. ÀÌÁ¦ ¿©·¯ºÐµéµµ ±¸¹Ì°¡ ´ç±æ ¶§µµ µÈ µí ½Í´Ù.

 

1.  mSQL API

    ¿©·¯ºÐµéÀº ¸î °¡ÁöÀÇ ±âº»ÀûÀÎ API¸¦ Á¢ÇÏ°Ô µÉ °ÍÀÌ´Ù. mSQL API´Â Ãʱ⿡ ¸Å¿ì ±âÃÊÀûÀÎ °ÍÀ¸·Î ½ÃÀÛÀ» ÇÏ°í ÀÖÀ¸³ª, ÃÖ±Ù 2.0.0¹öÀü¿¡¼­´Â ¸Å¿ì °­·ÂÇÏ°Ô Áö¿øÀÌ µÇ°í ÀÖ´Â °ÍÀ» ½±°Ô ¾Ë ¼ö ÀÖ´Ù. °¡Àå Áß¿äÇÑ ¼­¹ö Á¦¾î¿¡ °üÇÑ API°¡ Ãß°¡ µÈ °ÍÀÌ´Ù. ÇÏÁö¸¸, ÀÌ·¯ÇÑ °Í º¸´Ùµµ ´õ Áß¿äÇÑ °ÍÀÌ ¹Ù·Î ±âº»ÀûÀÎ µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÇÏ´Â °ÍÀÌ´Ù. µ¥ÀÌÅÍ º£À̽º¿ÍÀÇ Á¢¼Ó ±×¸®°í »óÈ£ Åë½Å¿¡ °üÇÑ °£´ÜÇÑ APIºÎÅÍ ½ÃÀÛÇØ º¸µµ·Ï ÇÏÀÚ.

    mSQL µ¥ÀÌÅͺ£À̽º ¹èÆ÷ÆÇ¿¡´Â µ¥ÀÌÅͺ£À̽º¿ÍÀÇ Åë½ÅÀ» À§ÇÑ API ¶óÀ̺귯¸®¶ó´Â °ÍÀ» ÇÔ²² ¹èÆ÷ÇÑ´Ù. ¿©·¯ºÐµéÀÌ mSQLµ¥ÀÌÅͺ£À̽º¸¦ ¼³Ä¡Çß´Ù¸é, Hughes µð·ºÅ丮¿¡ lib¿Í Include µð·ºÅ丮°¡ Á¸ÀçÇÒ °ÍÀÌ´Ù. ´ÙÀ½°ú °°Àº ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö¸¦ È®ÀÎÇØ º¸ÀÚ. Á¸ÀçÇÏÁö ¾Ê´Â´Ù¸é, ´Ù½Ã mSQLÀ» ¼³Ä¡ÇØ¾ß ÇÑ´Ù. ÇÊÀÚ´Â mSQL¶óÀ̺귯¸®¿Í Çì´õ ÆÄÀÏÀ» /usr/local/lib, /usr/local/include µîÀÇ µð·ºÅ丮¿¡ ÇÏÀÌÆÛ ¸µÅ©¸¦ ½ÃÄѼ­ »ç¿ëÇÏ°í ÀÖ´Ù.

    <±×¸²1>  ¶óÀ̺귯¸® ÆÄÀÏ.

    <±×¸²2>  Mini SQLµ¥ÀÌÅͺ£À̽º °ü·Ã Çì´õ ÆÄÀϵé.

    À§¿Í °°ÀÌ ¸ðµç ÆÄÀϵéÀÌ Àß ÀÖ´Ù¸é, ½ÃÀÛÇصµ ÁÁ´Ù. ´ÙÀ½Àº ¿ì¸®°¡ ¾Ë¾Æ¾ß ÇÒ ÇÔ¼öµéÀ» Hughes¿¡¼­ Á¤ÀÇ ÇسõÀº °ÍµéÀÌ´Ù. ¿©·¯ºÐµéÀº À̵é Áß¿¡¼­ ÀϺθ¸ ¸ÀÀ» º¸°Ô µÉ °Í °°´Ù.

      /*
      **      msql.h  -
      **
      **
      ** Copyright (c) 1993-95  David J. Hughes
      ** Copyright (c) 1995  Hughes Technologies Pty Ltd
      **
      ** Permission to use, copy, and distribute for non-commercial purposes,
      ** is hereby granted without fee, providing that the above copyright
      ** notice appear in all copies and that both the copyright notice and this
      ** permission notice appear in supporting documentation.
      **
      ** This software is provided "as is" without any expressed or implied warranty.
      **
      ** ID = "$Id:"
      **
      */

      // ´ÙÀ½ ºÎºÐÀº »õ·Î Ãß°¡µÈ ºÎºÐÀ¸·Î ÅÒÆÄÀÏÀÌ Àß ¾ÈµÉ °æ¿ì¿¡ ÇØÁÖ¸é µÈ´Ù.
      #include <time.h>
      // »ðÀÔ ³¡..

      #ifndef MSQL_H
      #define MSQL_H

      #if defined(__STDC__) || defined(__cplusplus)
      #  define __ANSI_PROTO(x)       x
      #else
      #  define __ANSI_PROTO(x)       ()
      #endif

      #ifdef __cplusplus
      extern "C" {
      #endif

      typedef char    ** m_row;

      typedef struct field_s {
              char    *name,
                      *table;
              int     type,
                      length,
                      flags;
      } m_field;

      typedef struct  m_seq_s {
              int     step,
                      value;
      } m_seq;

      typedef struct  m_data_s {
              int     width;
              m_row   data;
              struct  m_data_s *next;
      } m_data;

      typedef struct m_fdata_s {
              m_field field;
              struct m_fdata_s *next;
      } m_fdata;

      typedef struct result_s {
              m_data  *queryData,
                      *cursor;
              m_fdata *fieldData,
                      *fieldCursor;
              int     numRows,
                      numFields;
      } m_result;

      #define msqlNumRows(res) res->numRows
      #define msqlNumFields(res) res->numFields

      #define INT_TYPE        1
      #define CHAR_TYPE       2
      #define REAL_TYPE       3
      #define IDENT_TYPE      4
      #define NULL_TYPE       5
      #define TEXT_TYPE       6
      #define DATE_TYPE       7
      #define UINT_TYPE       8
      #define MONEY_TYPE      9
      #define TIME_TYPE       10
      #define LAST_REAL_TYPE  10
      #define IDX_TYPE        253
      #define SYSVAR_TYPE     254
      #define ANY_TYPE        255

      #define NOT_NULL_FLAG   1
      #define UNIQUE_FLAG     2

      #define IS_UNIQUE(n)    (n & UNIQUE_FLAG)
      #define IS_NOT_NULL(n)  (n & NOT_NULL_FLAG)

      static char msqlTypeNames[][12] =
              {"???", "int", "char","real","ident","null","text","date","uint",
              "money","time","???"};

      /*
      ** Pre-declarations for the API library functions
      ** º»°ÝÀûÀ¸·Î API ÇÔ¼ö°¡ Á¤ÀǵǴ ºÎºÐÀÔ´Ï´Ù.
      */
      #ifndef _MSQL_SERVER_SOURCE
              extern  char msqlErrMsg[];
              int     msqlConnect __ANSI_PROTO((char *));
              int     msqlSelectDB __ANSI_PROTO((int, char*));
              int     msqlQuery __ANSI_PROTO((int, char*));
              int     msqlCreateDB __ANSI_PROTO((int, char*));
              int     msqlDropDB __ANSI_PROTO((int, char*));
              int     msqlShutdown __ANSI_PROTO((int));
              int     msqlGetProtoInfo __ANSI_PROTO((void));
              int     msqlReloadAcls __ANSI_PROTO((int));
              int     msqlGetServerStats __ANSI_PROTO((int));
              char    *msqlGetServerInfo __ANSI_PROTO((void));
              char    *msqlGetHostInfo __ANSI_PROTO((void));
              char    *msqlUnixTimeToDat

      e __ANSI_PROTO((time_t));
              char    *msqlUnixTimeToTime __ANSI_PROTO((time_t));
              void    msqlClose __ANSI_PROTO((int));
              void    msqlDataSeek __ANSI_PROTO((m_result*, int));
              void    msqlFieldSeek __ANSI_PROTO((m_result*, int));
              void    msqlFreeResult __ANSI_PROTO((m_result*));
                 m_row   msqlFetchRow __ANSI_PROTO((m_result*));
              m_seq   *msqlGetSequenceInfo __ANSI_PROTO((int, char*));
              m_field *msqlFetchField __ANSI_PROTO((m_result *));
              m_result *msqlListDBs __ANSI_PROTO((int));
              m_result *msqlListTables __ANSI_PROTO((int));
              m_result *msqlListFields __ANSI_PROTO((int, char*));
              m_result *msqlListIndex __ANSI_PROTO((int, char*, char*));
              m_result *msqlStoreResult __ANSI_PROTO((void));
              time_t  msqlDateToUnixTime

      __ANSI_PROTO((char *));
              time_t  msqlTimeToUnixTime __ANSI_PROTO((char *));
      #endif

      int     msqlLoadConfigFile __ANSI_PROTO((char *));
      int     msqlGetIntConf __ANSI_PROTO((char *, char *));
      char    *msqlGetCharConf __ANSI_PROTO((char *, char*));

      #ifdef __cplusplus
              }
      #endif
      #endif /*MSQL_H*/

    <¸®½ºÆ®1> msql.h Çì´õ ÆÄÀÏ ¸®½ºÆ®.

    ¸ðµç ÇÔ¼öµéÀ» ¸ðµÎ ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä´Â ¾øÀ¸¸ç, µ¥ÀÌÅÍ º£À̽º¿Í Åë½ÅÀ» Çϴµ¥ À־ °ÅÀÇ ÇÊ¿äÇÏÁö ¾Ê´Â ÇÔ¼öµéÀÌ ÀÖ´Ù. ¿ì¸®´Â °¡Àå ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â ÇÔ¼öµéÀ» ¾Ë¾Æ º¼ °ÍÀÌ´Ù. ¶ÇÇÑ mSQL DBMS Ãʺ¸ÀÚµéÀÌ ½±°Ô ³õÄ¥ ¼ö ÀÖ´Â ¼û¾î ÀÖ´Â ÀÛÀº ¼Ò½ºµéÀ» ¼­¹ö¿¡¼­ ã¾Æ¼­ ÇÔ²² ºÐ¼®Çϵµ·Ï ÇÑ´Ù. ÇÊÀÚ°¡ ƯÁ¤ API¸¦ °øºÎÇÒ ¶§ ¸ÕÀú ÇÏ´Â °ÍÀº Çì´õ ÆÄÀÏÀ» ¸ÕÀú º¸´Â °ÍÀÌ´Ù. APIÇì´õ ÆÄÀÏÀ» ¸ÕÀú º¸´Â ÀÌÀ¯´Â ½±°Ô µ¥ÀÌÅÍ º£À̽º¿¡ ¾î¶² API°¡ ÀÖÀ¸¸ç, ¾î¶² ±â´ÉÀ» ÇÒ ¼ö ÀÖÀ» °ÍÀ̶ó°í ÇÏ´Â °ÍµéÀ» ÃßÃøÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

    ´ÙÀ½Àº mSQL API·Î µ¥ÀÌÅͺ£À̽º °ü·Ã ÇÁ·Î±×·¥À» ÀÛ¼ºÇÒ ¶§ ±âº»ÀûÀ¸·Î »ç¿ëµÇ´Â ÇÔ¼öµéÀ» ¼ø¼­´ë·Î ³ª¿­ÇÏ¿´´Ù. ´ëÃæÀÇ ÇÔ¼ö »ç¿ë ¼ø¼­´Â ´ÙÀ½°ú °°´Ù.

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      #include <unistd.h>
      #include "msql.h"

      int main(argc,argv)
      int     argc;
      char    *argv[];
      {
              // ¼ÒÄÏ ½Äº°ÀÚ¸¦ ¼±¾ð ÇÑ´Ù.
      int sock;

      // µ¥ÀÌÅÍ º£À̽º·ÎºÎÅÍ Äù¸®ÀÇ °á°ú¸¦ ÀúÀåÇÏ´Â °÷À» ¼±¾ðÇÑ´Ù.
      // Çì´õ ÆÄÀÏ¿¡ m_resultÇüÀ» ¼±¾ðÇØ ³õ¾ÒÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.
              m_result *rs;

              // Mini SQL°ú Á¢¼ÓÀ» ÇÏ´Â ºÎºÐ, ¿¡·¯°¡ ³ª¸é, ¿¡·¯ ¸Þ½ÃÁö Ãâ·Â.
              if ((sock = msqlConnect(NULL)) < 0)  {
                      printf("Couldn't connect to engine!\n%s\n\n", msqlErrMsg);
                      perror("");
                      exit(1);
              }

              // Mini SQL¿¡¼­ °ü¸®ÇÏ´Â µ¥ÀÌÅÍ º£À̽º¿¡¼­ ¼±ÅÃÇÏ¿© Á¢¼ÓÇÑ´Ù.
              if (msqlSelectDB(sock,"µ¥ÀÌÅͺ£À̽º¸í") < 0)    {
                      printf("µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù, %s\n",,msqlErrMsg);
              }

              // Äõ¸®¸¦ ½ÇÇàÇÑ´Ù.
              msqlQuery(sock,qbuf)

              // µ¥ÀÌÅ͸¦ m_resultÇü¿¡ ÀúÀåÇÑ´Ù.(¹è¿­¿¡ ÀúÀåÇÑ´Ù°í »ý°¢Çϸé ÆíÇÏ´Ù)
              rs=msqlstoreResult()

              // ÀúÀåµÈ µ¥ÀÌÅÍ µéÀ» Àû´çÇÑ Ã³¸®¸¦ ÇØÁ־ ÇÁ·Î±×·¥ÀÇ ¸ñÀûÀ» ´Þ¼ºÇÑ´Ù.

              // µ¥ÀÌÅ͵éÀ» ÀÚÀ¯·Ó°Ô ÇØÁ¦½ÃÄÑ ÁØ´Ù.
              MsqlFreeresult(rs);

              // µ¥ÀÌÅÍ º£À̽º¿Í Á¢¼ÓÀ» ÇØÁ¦ÇÑ´Ù.
              msqlClose(sock);
              exit(0);
      }

    <¸®½ºÆ®3> ±âº»ÀûÀÎ ÇÁ·Î±×·¡¹Ö °ñ°Ý.

    ´ÙÀ½Àº ÇÔ¼ö¿¡ ´ëÇÑ ¼¼ºÎÀûÀÎ ³»¿ëÀ» ´Ù·çµµ·Ï Çغ¸ÀÚ. ´ëÃæ ¾î¶»°Ô »ç¿ëµÇ´ÂÁö´Â ½±°Ô ¾Ë  ÀÖÀ¸¸®¶ó »ý°¢µÇÁö¸¸, °¢°¢ÀÇ ÇÔ¼öµéÀÇ ±â´Éµé°ú ¿É¼ÇµéÀ» »ó¼¼ÇÏ°Ô ¾Ë¾Æ º¸ÀÚ. ´ëºÎºÐÀÇ APIµéÀº msqlÀ̶ó´Â ´Ü¾î°¡ ÇÔ¼öÀÇ ¸Ç ¾Õ¿¡ ºÙ¾î¼­ ´Ù¸¥ ÇÔ¼öµé°úÀÇ ±¸ºÐÀ» ÇØÁØ´Ù. ¶ÇÇÑ ¸ðµç ÇÔ¼öµéÀ» »ç¿ëÇϴµ¥ À־ ¹ß»ýÇÏ´Â ¸ðµç ¿¡·¯µéÀº MsqlErrMsg[]¶ó´Â ¹è¿­¿¡ ÀúÀåÀÌ µÇ¹Ç·Î ¿¡·¯ Á¦¾î¸¦ ÇÏ·Á°í ÇÒ¶§¿¡ ¿¡·¯¸¦ Ç¥½ÃÇÏ°Ô À§ÇÏ¿© Postgres95¿¡¼­ »ç¿ëÇÏ´Â Ç÷¡±× üũ´Â ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ´ÜÁö ÇÔ¼öÀÇ ¸í·É ¼öÇàÀÇ ¼º°ø ¹× ½ÇÆÐÀÇ ¿©ºÎ¸¸ if¹®À¸·Î ÆÇ´ÜÇÏ¿© ±×¿¡ ´ëÀÀµÇ´Â ¸Þ½ÃÁö¸¦ Ãâ·ÂÇØÁֱ⸸ ÇÏ¸é µÈ´Ù. ´ëºÎºÐÀÇ ÇÔ¼öµéÀº ´ÙÀ½°ú °°Àº »óÅ °ªÀ» returnÇØÁØ´Ù.

            Flag °ª ---------  ¼º°ø   0
                        |
                        |
                        |
                        |
                       ---------  ½ÇÆÐ   -1

1-1. µ¥ÀÌÅͺ£À̽º Á¢¼Ó ¹× Äõ¸®¿Í °ü·ÃµÈ ÇÔ¼ö

    * int msqlConnect (char *host)
    ÀÌ ÇÔ¼ö´Â MSQL µ¥ÀÌÅÍ º£À̽º ¿£Áø°úÀÇ Á¢¼ÓÀ» Çü¼ºÇÏ´Â ¿ªÇÒÀ» Çϸç, ÇÁ·Î±×·¥ÀÇ Ãʱ⿡ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ±âº»°ªÀ¸·Î È£½ºÆ® ¸íÀÌ NULLÀÎ °æ¿ì¿¡´Â Localhost·Î °£ÁÖÇÏ¿© Á¢¼ÓÇÏ°Ô µÈ´Ù. ÀÌ ÇÔ¼ö´Â À§ÀÇ °£´ÜÇÑ ¿¹Á¦¿¡¼­ º¸¾ÒµíÀÌ sockÀ̶ó´Â º¯¼ö¿¡ socket descriptor¸¦ ³Ñ°ÜÁØ´Ù. µû¶ó¼­ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§¿¡´Â À§ÀÇ ¿¹Á¦¿Í °°ÀÌ »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ °ªÀº µ¥ÀÌÅͺ£À̽º¿Í ¿¬°áÇÏ¿© °è¼ÓÀûÀ¸·Î ÇÔ¼ö¿¡ ÀÌ °ªÀ» ³Ö¾î¾ß ÇÑ´Ù.

    * int msqlSelectDB(int sockdes, char *dbname)
    MsqlConnect°¡ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁ³´Ù¸é, ´ÙÀ½Àº ÇØ´ç ¼­¹ö¿¡¼­ °ü¸®¸¦ ÇÏ°í ÀÖ´Â µ¥ÀÌÅÍ º£À̽º Áß¿¡ Á¢±ÙÇÏ·Á´Â µ¥ÀÌÅͺ£À̽º¸¦ ¼±ÅÃÇϵµ·Ï ÇÏ´Â ÇÔ¼ö·Î Mini SQL 2.0 ¹öÀü ºÎÅÍ´Â ´ÙÁßÀ¸·Î ¿©·¯ °³ÀÇ µ¥ÀÌÅͺ£À̽º¸¦ Á¢±ÙÇϵµ·Ï ÇÑ´Ù. sockÀº µ¥ÀÌÅͺ£À̽º¿Í Á¢¼ÓÀ» Çϱâ À§ÇÏ¿© »ç¿ëÇß´ø msqlconnect()ÇÔ¼ö°¡ ¸®ÅÏÇÏ´Â sockdes°ªÀ» ³Ö¾î ÁÖ¸é µÈ´Ù. ±×¸®°í dbname¿¡¼­´Â ¹®ÀÚÇüÀ¸·Î µ¥ÀÌÅÍ º£À̽ºÀÇ À̸§À» ³Ö¾î ÁØ´Ù.

    * int msqlCreateDB (int sockdes, Char *dbname)
    µ¥ÀÌÅͺ£À̽º¸¦ »ý¼ºÇϴµ¥ ¸¶Ä¡ Áö³­ ´ÞÀÇ µ¥ÀÌÅͺ£À̽º À¯Æ¿¸®Æ¼¿¡¼­ msqladmin°ú°°Àº ¿ªÇÒÀ» ÇÏ´Â °ÍÀÌ´Ù. »ç¿ëÀÚµéÀÌ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °æ¿ì´Â °ÅÀÇ µå¹°¸ç, µ¥ÀÌÅͺ£À̽º À¯Æ¿¸®Æ¼¸¦ ¸¸µé·Á°í ÇÏÁö ¾Ê´Â ÇÑ »ç¿ëÇÏÁö ¾Ê´Â ÇÔ¼öÀÌ´Ù.

    * int msqlDropDB (Int sockdes, char *dbname)
    µ¥ÀÌÅͺ£À̽º¸¦ ¸ðµÎ Áö¿ì±â À§ÇÑ ÇÔ¼ö·Î msqladmin¿¡¼­ »ç¿ëµÇ´Â ÇÔ¼öÀÌ´Ù.

    * int msqlQuery (int sockdes, char *query)
    µ¥ÀÌÅͺ£À̽º¿¡ Á¢±ÙÇÏ¿© ¾ÆÁÖ ÀÚÁÖ »ç¿ëµÇ°í, Áß¿äÇÑ ÇÔ¼ö·Î ÇÁ·Î±×·¡¸Ó°¡ ¸¸µç Äõ¸®¸¦ Á÷Á¢ µ¥ÀÌÅÍ º£À̽º·Î Àü¼ÛÇÏ¿© ÁÖ´Â ÇÔ¼öÀÌ´Ù. ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¡¸Ó°¡ ¿øÇÏ´Â µ¥ÀÌÅ͵éÀ» ¿©·¯ °¡Áö Äõ¸®¹®¿¡ Á¶°Ç(where, order by)À» ÀÌ¿ëÇÏ¿© ¾ò¾î³¾ ¼ö ÀÖ´Ù. query¶ó´Â º¯¼ö´Â ÁÖ·Î mallocÀ̳ª ¹è¿­·Î ¼±¾ðµÇ¾î¼­ ±× ¹®ÀÚ¿­ ³»¿¡ SELECT, UPDATE, DELETE µîÀÇ Äõ¸®¹®µéÀÌ »ðÀÔÀÌ µÇ±â ¶§¹®¿¡ ÃæºÐÇÑ ¾çÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇØÁÖ´Â °ÍÀÌ ÁÁ°í, ±×·¸°Ô ÇÏÁö ¾Ê´Â´Ù¸é, Á÷Á¢ Äõ¸®¹®À» ÀÔ·ÂÇÒ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö°¡ ½ÇÇàÀÌ µÇ¸é, MsqlStroreResult() ÇÔ¼ö¸¦ ½ÇÇàÇÏ¿© ÇÁ·Î±×·¥¿¡ ¼±¾ðÇÑ m_resultÇü rs º¯¼ö¿¡ ÀúÀåÇϵµ·Ï ÇØ¾ß ½ÇÁ¦·Î ¿ì¸®°¡ ½±°Ô ¾µ¼ö ÀÖ´Â ¹è¿­ÀÇ ÇüÅ°¡ µÈ´Ù. m_resultÇüÀº ±¸Á¶°¡ ¾à°£ º¹ÀâÇϱâ´Â ÇÏÁö¸¸, µ¥ÀÌÅͺ£À̽º ±¸Á¶¸¦ ¾Ë·Á°í ÇÏÁö ¾Ê´Â ÇÑ ÀÌ ÀÚ·áÇü¿¡ ´ëÇÏ¿© ³Ê¹« ÀÚ¼¼ÇÏ°Ô ¾Ë·Á°í Çϰųª, ¾î·Æ°Ô »ý°¢ÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ÇÁ·Î±×·¡¸Ó°¡ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÏ¿©¼­´Â ¾ÆÁÖ ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖ´Ù.

    * m_result *msqlStoreResult ()
    ÀÌ ÇÔ¼ö´Â ¾Õ¿¡¼­µµ ¸»ÇßµíÀÌ msqlQuery()ÇÔ¼ö¿Í ÇÔ²² »ç¿ëµÇ¾îÁ®¼­ ±× Äõ¸®ÀÇ °á°ú °ªÀ» m_result ÇüÀÇ rs º¯¼ö¿¡ ÀúÀåÇϵµ·Ï ÇÏ´Â ÇÔ¼öÀÌ´Ù. À¯°¨½º·´°Ôµµ Áß¿äÇÑ ¿ªÇÒÀ» ÇÏÁö¸¸, Ưº°ÇÑ º¯¼ö¸¦ °¡ÁöÁö ¾Ê´Â ÇÔ¼öÀÌ´Ù.

    * Void msqlFreeResult(m_result  *rs)
    ´õ ÀÌ»ó Äõ¸®¸¦ ÇÑ m_result º¯¼öÇüÀ¸·Î ¼±¾ðÇÑ rs º¯¼ö °á°ú°ªÀÌ ÇÊ¿äÇÏÁö ¾Ê´Ù¸é, rs°ªÀ» Àμö·Î ³Ö¾î ÁÖ¸é °á°ú ÀÚÀ¯·Ó°Ô ¸¸µé¾î ÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù.

    * void msqlDataSeek(m_result *rs, int pos),
      void msqlFieldSeek(m_result *rs, int pos)

    m_result ±¸Á¶Ã¼¿¡´Â µ¥ÀÌÅÍÀÇ ´ÙÀ½ÀÇ row µ¥ÀÌÅÍ °ª¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö´Â clientÃøÀÇ Ä¿¼­¶ó´Â °ÍÀÌ Æ÷ÇÔÇÑ´Ù.  MsqlDataseek ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µ¥ÀÌÅÍÀÇ À§Ä¡ Á¤º¸¸¦ À̵¿ÇÒ ¼ö ÀÖ´Ù. posÀÇ Ã³À½ ½ÃÀÛ °ªÀº 0À¸·Î ½ÃÀÛÇÏ°í, Äù¸®·Î ¼±ÅõǾîÁø µ¥ÀÌÅÍÁß ¸Ç ³¡¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ¾ò±â¸¦ ¿øÇÒ ¶§¿¡´Â msqlNumrows() ÇÔ¼ö·Î ¼±ÅõǿÀÁø µ¥ÀÌÅÍÀÇ °³¼ö¸¦ ¾òÀº ÈÄ¿¡ -1°ªÀ» ÇØÁÖ¾î pos °ª¿¡ ³Ñ°Ü ÁÖ°í, msqlFetchrows() ³ª msqlFetchfield()ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¾òÀ» ¼ö ÀÖ´Ù.

     

    // Çà ´ÜÀ§ µ¥ÀÌÅ͸¦ ¾ò´Â´Ù.
    m_row mrow;
    // ¿­´ÜÀ§ÀÇ µ¥ÀÌÅ͸¦ ¾ò´Â´Ù.
    m_field mfield;
              for(int i; I<= msqlNumRows(rs); i++) {
                          mrow=msqlFetchRows(rs);

     

      °¢ÀÇ Çà¿¡ ´ëÇÏ¿© ¸Å¹ø Çѹø¾¿ Á¢±ÙÀ» ÇÑ´Ù.
      ¸¶Âù°¡Áö·Î m_fieldÇüµµ °°Àº ¹æ¹ýÀ» »ç¿ëÇÑ´Ù.

                      ¡å    ¡å    ¡å

      ¹ø    È£

      ÀÌ    ¸§

      ³ª   ÀÌ

      mrow[0]

      mrow[1]

      mrow[2]

      mrow[0]

      mrow[1]

      mrow[2]

      :

      :

      :

    }

     

    * m_row msqlFetchRow(m_result *rs) ,
      m_field *msqlFetchField(m_result *rs)

    µÎ ÇÔ¼ö´Â ½ÇÁ¦·Î µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â ÇÔ¼ö·Î m_rowÇüÀ¸·Î ÀúÀåÇÏ¿© ÇÁ·Î±×·¡¸Ó°¡ °Ë»öµÈ µ¥ÀÌÅÍÀÇ row¿­¿¡ ´ëÇÏ¿© ½±°Ô Á¢±ÙÀÌ °¡´ÉÇϵµ·Ï ÇÑ´Ù. °ÅÀÇ ¸ðµç ÇÔ¼öµéÀÌ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅ͸¦ ¹Þ¾Æ µéÀ̴µ¥ »ç¿ëµÈ´Ù. ¹°·Ð msqlFetchField() ÇÔ¼ö¸¦ »ç¿ëÇÏ·Á¸é, m_fieldÇüÀ¸·Î ¼±¾ðÇÑ º¯¼ö°¡ ÀÖ¾î¾ß ÇÑ´Ù.

    * int msqlNumRows(m_result *rs),
      int msqlNumFields(m_result *rs)

    msqlQuery()¸¦ ½ÇÇàÇÏ°í³ª¼­ result °ªÀ» rs¿¡ ÀúÀåÇÏ¿´´Ù¸é, ¿ì¸®´Â ¸î °³ÀÇ µ¥ÀÌÅ͵éÀÌ ÇöÁ¦ Äõ¸®·Î ¼±ÅõǾú´ÂÁö ¾Ë¾Æ¾ß ÇÒ¶§°¡ ¾ÆÁÖ ¸¹¾Æ ƯÈ÷ ºñºñ¿¡½º °Ô½ÃÆÇÀ̳ª, °Ë»öÀ» ¿øÇÒ ¶§¿¡´Â ¸î¹øÀÇ ·çÇÁ¸¦ µ¹·Á¾ß ÇÒÁö ¸ð¸¦¶§¿¡ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÈ´Ù. rows¿Í Field´Â ½±°Ô ¾Ë ¼ö ÀÖµíÀÌ row´Â rowÀÇ °³¼ö¸¦ fieldÇÔ¼ö´Â fieldÀÇ °³¼ö¸¦ Ãâ·ÂÇÏ¿© ÁØ´Ù.

    * void  msqlClose(int sock)
    mSQL µ¥ÀÌÅͺ£À̽º ¿£Áø°úÀÇ ¸ðµç Åë½ÅÀ» Á¾·áÇϱâ À§ÇÏ¿© ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ´ëºÎºÐÀÇ °æ¿ì¿¡´Â ÇÁ·Î±×·¥ÀÇ ¸Ç ¸¶Áö¸·¿¡¼­ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.

1-2. µ¥ÀÌÅÍ º£À̽º ½ºÅ°¸¶¿Í °ü·ÃµÈ ÇÔ¼ö

    ´ÙÀ½Àº µ¥ÀÌÅÍ º£À̽ºÀÇ ½ºÅ°¸¶¿Í °ü·ÃµÈ ÇÔ¼öµéÀ» ¼Ò°³ÇÒ °ÍÀÌ´Ù. ¿©·¯ºÐµéÀº  msqladminÀ̶ó´Â ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¿© µ¥ÀÌÅͺ£À̽ºÀÇ ½ºÅ°¸¶¸¦ ¼³°èÇÒ ¼ö ÀÖ´Ù.  ±×¸®°í Relshow, msqldump¶ó´Â ÇÁ·Î±×·¥À» ÀÌ¿ëÇÏ¿© µ¥ÀÌÅÍ º£À̽º ½ºÅ°¸¶À» º¼ °ÍÀÌ´Ù. ÀÌ·¸°ÔÇؼ­ µ¥ÀÌÅÍ º£À̽ºÀÇ ½ºÅ°¸¶¸¦ º¸´Â ¹æ¹ýµµ ÀÖ°ÚÁö¸¸, Á»´õ º»ÀÎÀÇ ÃëÇâ¿¡ ¸Â°Ô ÀÌ·¯ÇÑ ÇÁ·Î±×·¥µéÀ» °è¹ßÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ ÇÔ¼öµéÀ» ±×°ÍÀ» ¸¸µå´Âµ¥ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÉ °Í °°´Ù.

    * m_result *msqlListDBs(Int sock)
    mSQL µ¥ÀÌÅͺ£À̽º ¿£Áø¿¡¼­ °ü¸®ÇÏ°í ÀÖ´Â µ¥ÀÌÅÍ º£À̽ºÀÇ ¸ðµç List¸¦ º¸¿©ÁØ´Ù. ÀÌ¿¡ ´ëÇÑ µ¥ÀÌÅ͵éÀº m_result ÇüÀ¸·Î ÀúÀåÀÌ µÇ´Âµ¥,  ÀÌÀü¿¡ ¾Ë¾Æº¸¾Ò´ø msqlfetchrow()ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© µ¥ÀÌÅÍ º£À̽ºµéÀÇ À̸§µéÀ» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù.

    * m_result *msqlListTables(int sock)
    msqlListDBs() ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î µ¥ÀÌÅͺ£À̽º Å×À̺íÀ» m_resultÇüÀ¸·Î ÀúÀåÇÑ´Ù.

    * m_result *msqlListFields (int sock, char *tableNAME)
    ƯÁ¤ µ¥ÀÌÅͺ£À̽ºÀÇ Å×ÀÌºí¿¡¼­ÀÇ ¸ðµç Çʵ忡 ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇÑ´Ù.

    * m_result *msqlListIndex(int sock, char tableNAME, char *index)
    Å×À̺íÁß¿¡¼­ index Å×À̺íÀÇ ±¸Á¶¸¦ ¾Ë ¼ö ÀÖ°Ô ÇÑ´Ù.

    mSQL API¿¡ ´ëÇÏ¿© ÀÚ¼¼ÇÏ°Ô ¼³¸í¸¸À» ´õÇÑ´Ù´Â °ÍÀº ¿Ø(~)Áö ½Ç¹«ÀûÀÎ °Í °°Áö ¾Ê¾Æ ÇÊÀÚ¸¦ ½È¾îÇÑ´Ù. ½ÇÁ¦ÀûÀÎ ¿¹Á¦¸¦ ÁÖ·Î ´Ù·ç´Â °ÍÀÌ ÇÊÀÚÀÇ ½ºÅ¸ÀÏÀÌ´Ù. ´ÙÀ½Àº ½ÇÁ¦·Î ÄÄÆÄÀÏÀÌ °¡´ÉÇϵµ·Ï ¸¸µé¾îÁø °£´ÜÇÑ ÇÁ·Î±×·¥ ¿¹Á¦ÀÌ´Ù. ¾Æ·¡ÀÇ ÇÁ·Î±×·¥ ¿¹Á¦¸¦ º¸±â Àü¿¡ ÄÄÆÄÀÏÇÏ´Â ¹æ¹ýÀ» ¸ÕÀú ¾Ë¾Æ¾ß µÉ °Í °°´Ù.

1-3. ÄÄÆÄÀÏÇÏ´Â ¹æ¹ý

    ÄÄÆÄÀÏÇÏ´Â ¹æ¹ý ¿©·¯ºÐÀÌ Gcc¿Í °°Àº ¼º´É ÁÁ°í, Æí¸®Çϸç, ¶Ù¾î³­ ÄÄÆÄÀÏ·¯°¡ ÀÖ´Ù¸é ¸ðµÎ °¡´ÉÇÏ´Ù.

    ÄÄÆÄÀÏÇÏ´Â ¹æ¹ýÀº ¿©·¯ °¡Áö°¡ µÉ ¼ö ÀÖ´Ù. ÀÚ½ÅÀÇ ½Ã½ºÅÛ¿¡ ¸Â°Ô ´ÙÀ½À» °íÄ¡¸é ´ëºÎºÐ ¼º°øÀûÀ¸·Î ÄÄÆÄÀÏÀ» ÇÒ ¼ö ÀÖÀ¸¸®¶ó »ý°¢ÇÑ´Ù.

     

    cc -c -I/usr/local/Hughes/include msqlapp.c
    cc -c msqlapp msqlapp.c -L/usr/local/Hughes/lib -lmsql
    cc -c msqlapp msqlapp.c -L/usr/local/Hughes/lib -I/usr/local/Hughes/include -lmsql -lnsl -lsocket

      

      /*
        mSQL 2.0 release C API demonstration1
        Programmed by Kyung-Ho, Kim
      */

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      #include "msql.h"

      void printErrMsg(void);

      void main(void)
      {
        char key, *hostname;
        int sockdes, i, usn;
        m_result *rs;
        m_row mrow;

        printf("mSQL 2.0 Á¢¼Ó ÇÁ·Î±×·¥¡¬n");
        printf("Á¢¼ÓÇÒ mSQL 2.0 ¼­¹ö¸¦ ÀÔ·ÂÇϼ¼¿ä¡¬n");
        hostname=malloc(30 * sizeof(char));
        gets(hostname);

        printf("Áö±Ý <%s>¿¡ Á¢¼ÓÀ» ½ÃµµÇÕ´Ï´Ù.¡¬n", hostname);
        sockdes=msqlConnect(hostname);
        printf("¼ÒÄÏ ¹øÈ£ : %d  ¹øÀ¸·Î ¿¬°á¿¡ ¼º°øÇßÀ¾´Ï´Ù.¡¬n", sockdes);

        msqlClose(sockdes);
        printf("Á¢¼ÓÀ» Á¾·áÇßÀ¾´Ï´Ù. ¿©±â°¡ ÇÁ·Î±×·¥ÀÇ ³¡ÀÔ´Ï´Ù¡¬n");

        free(hostname);
      }

      void printErrMsg(void)
      {
        puts("mSQL 2.0 rel : ¿¡·¯°¡ ¹ß»ýÇßÀ¾´Ï´Ù.¡¬n");
        puts(msqlErrMsg);
      }

    <¿¹Á¦1> msqlapp.c ÇÁ·Î±×·¥ ¿¹Á¦

    ½±°Ô º¸¾Æ¼­´Â µ¥ÀÌÅÍ º£À̽º¿¡ Á¢±ÙÇÏ¿© ¾Æ¹« Àϵµ ÇÏÁö ¾Ê°í Á¢¼ÓÀ» Á¾·áÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½Àº ¿©·¯ºÐµéÀÇ µ¥ÀÌÅÍ º£À̽º ¼Ò½º µð·ºÅ丮¸¦ µÚÁú Â÷·ÊÀÌ´Ù. ´ÙÀ½°ú °°Àº °æ·Î¿¡ ¼­¹ö¿Í °ü·ÃÀÌ µÇ¾î ÀÖ´Â ¼Ò½º¿Í °ü·ÃÀÌ ¾ø´Â ¸î °³ÀÇ ¼Ò½º¸¦ º¼ ¼ö ÀÖ´Ù. Insert_test.c ÆÄÀÏ°ú select_test.c ÆÄÀÏÀ» ½±°Ô ãÀ» ¼ö ÀÖÀ¸¸ç, sample.msql ÆÄÀϵµ ÇÔ²² ãÀ» ¼ö ÀÖ´Ù. ÀÌ ÆÄÀϵéÀº ¿©·¯ºÐµéÀ» À§ÇÑ ÆÄÀÏÀÌ´Ù. µÎ°³ÀÇ ÆÄÀÏ ´ëÇÏ¿© ¿©·¯ºÐµéÀÌ Á÷Á¢ ¼Ò½º¸¦ ºÐ¼®ÇØ º¸´Â °Íµµ ¸¹Àº µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

    <±×¸² 3> mSQL ¼­¹ö µð·ºÅ丮

    ¿©·¯ºÐµéÀº sample.msqlÀ» ¸ÕÀú µ¥ÀÌÅͺ£À̽º·Î ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í 2°³ÀÇ Å×½ºÆ® ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÏ¿© ½ÇÇàÇØ º¸±â ¹Ù¶õ´Ù. ±×¸®°í relshow.c, msqladmin.c, msqldump.c msqlimport.c msqlexport.c µîµîÀÇ ÆÄÀϵµ ÇÔ²² º¸À̴µ¥ ÀÌ·¯ÇÑ ÆÄÀϵéÀ» ºÐ¼®ÇÏ´Â °ÍÀÌ °¡Àå ÁÁÀº ¹æ¹ýÀÌ´Ù.

 

2.  mSQL Tool Version 0.7

    ÀÌÁ¦´Â °£´ÜÇÑ ¿¹Á¦¸¦ ´Ù·ç¾î º¸¾ÒÀ¸´Ï ¸öÀ» Ç® ½Ã°£ÀÌ µÈ °Í °°´Ù. ±Ý³â ¿©¸§¿¡ ¸¸µé¾ú´ø ÇÁ·Î±×·¥À» Çѹø ¼Ò°³ÇØ º¼±îÇÑ´Ù. ±×·¡ÇÈ ÇÔ¼öµµ »ç¿ëµÇÁö ¾Ê¾ÒÀ¸¸ç, ¿©·¯ºÐµéÀÌ ½±°Ô °íÃļ­ ´Ù½Ã »õ·Ó°Ô ¸¸µé±âµµ ½¬¿ï °ÍÀ¸·Î º¸ÀÌ°í, ÀüüÀûÀÎ mSQL API µ¿ÀÛÀ» ¾Ë ¼ö ÀÖÀ¸¸®¶ó »ý°¢µÈ´Ù. Àß ¸¸µé¾î Á³´Ù°í ÀÌ ÇÁ·Î±×·¥À» ¼Ò°³ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» ¾Ë¾Æ ÁÖ¾úÀ¸¸é ÇÑ´Ù.  ÇÊÀÚ´Â ¿©·¯ °³ÀÇ µ¥ÀÌÅÍ º£À̽º¸¦ »ç¿ëÇÏ°í Àִµ¥ ¶§¶§·Î µ¥ÀÌÅÍ º£À̽º ½ºÅ°¸¶¸¦ º¸°í ½Í°Å³ª µ¥ÀÌÅ͵éÀÌ Àß µé¾î °¬´ÂÁö¸¦ ¾Ë¾Æ º¸°í ½ÍÀ» ¶§°¡ ÀÖ´Ù. À̶§ ºÒÆíÇÑ °ÍÀ» ´Ù¸¥ »ç¶÷ÀÌ ¸¸µç ÅøÀ» ÀÌ¿ëÇÏÁö ¾Ê°í, Á÷Á¢ ¸¸µé¾ú´Ù´Â °Í »ÓÀÌ´Ù.

    ´ÙÀ½Àº ÇÁ·Î±×·¥À» ½ÃÇàÇϸé, µ¥ÀÌÅÍ º£À̽ºÀÇ Á¢¼ÓÀ» ¿øÇϴ ȣ½ºÆ®ÀÇ À̸§À» ³Ö±â¸¦ ¿øÇÑ´Ù.

    <±×¸² 3> msqltool 0.7 ½ÇÇà

    ¿©±â¿¡ mSQL µ¥ÀÌÅÍ º£À̽º ¿£ÁøÀÌ µ¿ÀÛÇÏ´Â ¿öÅ©½ºÅ×À̼ÇÀ̳ª ¸®´ª½º ¼­¹öÀÇ IP³ª Domain name À» ÀÔ·ÂÇÏ¸é ¹Ù·Î Á¢¼ÓÀ» ÇÑ´Ù. ¸¸¾à ¾Æ¹« ÀԷµµ ÇÏÁö ¾Ê°í Enter¸¦ Çϸé, localhost·Î Á¢¼ÓÇϵµ·Ï Çß´Ù.  ÀÌ ÇÁ·Î±×·¥ÀÇ ÁÖ¿ä ºÎºÐÀ» »ìÆ캸¸é ´ÙÀ½°ú °°´Ù.

1. µ¥ÀÌÅÍ º£À̽º ¼­¹ö¿¡ Á¢¼ÓÇϱâ

    //
    // msqlConnect() ÇÔ¼ö¸¦ »ç¿ëÇؼ­ mSQL 2.0°úÀÇ Á¢¼Ó ¿©ºÎ È®ÀÎ
    //
    printf("Áö±Ý <%s>¿¡ Á¢¼ÓÀ» ½ÃµµÇÕ´Ï´Ù.¡¬n", hostname);
    if((sockdes=msqlConnect(hostname)) < 0){
        printErrMsg();
        printf("¿¬°á¿¡ ½ÇÆÐÇßÀ¾´Ï´Ù. %s ¼­¹ö¿¡ mSQL 2.0 DBMS°¡ µ¿ÀÛÇÏ´ÂÁö È®ÀÎÇϼ¼¿ä.¡¬n",             hostname);
        msqlClose(sockdes);
        exit(1);
      }

2. Á¢¼ÓÇÑ È£½ºÆ®ÀÇ ¸ðµç µ¥ÀÌÅÍ º£À̽ºµéÀ» ¾Ë¾Æ³»±â

    do{
        //
        // Á¢¼ÓµÈ µ¥ÀÌŸº£À̽º½Ã½ºÅÛÀÇ ¸ðµç µ¥ÀÌŸ º£À̽º¸¦ ¾Ë¾Æ³½´Ù
        //
        printf("¡¬nÁö±Ý %s ¿¡¼­ °ü¸®ÇÏ°í ÀÖ´Â µ¥ÀÌÅÍ º£À̽ºÀÔ´Ï´Ù. ¡¬n", hostname);
        if(!(rs=msqlListDBs(sockdes))){
          printErrMsg();
          printf("°ü¸®ÇÏ°í ÀÖ´Â µ¥ÀÌŸ º£À̽º°¡ ¾ø´Â °Í °°À¾´Ï´Ù.¡¬n¡¬n");
          exit(1);
        }
        else{
          totaldb=msqlNumRows(rs);
          printf("ÇöÁ¦ ÃÑ %d °³ÀÇ µ¥ÀÌŸ º£À̽º¸¦ °ü¸®ÇÏ°í ÀÖÀ¾´Ï´Ù. ¡¬n", totaldb);
          // °¢ µ¥ÀÌŸ º£À̽ºÀÇ À̸§À» ¾ò´Â´Ù.
          for(counter=0; counter<totaldb; counter++){
            mrow=msqlFetchRow(rs);
            dblist[counter]=*mrow;
          }

3. µ¥ÀÌÅÍ º£À̽ºÀÇ Å×ÀÌºí ½ºÅ°¸¶ Ãâ·Â

    if(utb!=0){
                 //
                 // Å×ÀÌºí³»¿¡ Çʵå Á¤º¸¸¦ ¾Ë¾Æ³½´Ù.
                 //
                 printf("ÀÔ·ÂÇϽŠ¼ýÀÚ´Â %d ¹øÀÔ´Ï´Ù. ¡¬n", utb);
                 strcpy(tbname, tblist[utb-1]);
                 printf("Áö±Ý %s Å×À̺íÀ» Á¢±Ù Áß ÀÔ´Ï´Ù.¡¬n¡¬n", tbname);
                 if(!(rs=msqlListFields(sockdes, tbname))){
                   printErrMsg();
                   exit(1);
                 }
                 else{
                   counter=0;
                   printf("¡¬n");

    printf("-----------------------------------------------¡¬n");
                   printf("  ÇöÁ¦ Á¢±Ù ÁßÀÎ µ¥ÀÌŸ º£À̽º : %s¡¬n", dbname);
                   printf("  ÇöÁ¦ Á¢±Ù ÁßÀÎ Å×ÀÌºí        : %s¡¬n", tbname);

    printf("-----------------------------------------------¡¬n");
                   printf("  ¹ø È£   ÇʵåÀ̸§   ÇʵåÇü   Çʵå±æÀÌ   ÇʼöÅ°   Unique À妽º ¡¬n");

    printf("------------------------------------------------¡¬n");
                   while((mfield=msqlFetchField(rs))){
                   printf(" %3d   %-13.13s %-7.7s   %6d    %s¡¬n", counter+1, mfield->name,¡¬  fieldtype(mfield->type), mfield->length, keytype(mfield->type, mfield->flags));
                     counter++;
                   }
    printf("------------------------------------------------¡¬n");
                   }
                   printf("¿£ÅÍÅ°¸¦ ÀÔ·ÂÇÏ½Ã¸é µ¥ÀÌŸ º£À̽º ¸Þ´º·Î µ¹¾Æ °©´Ï´Ù...¡¬n¡¬n");
                        }
                else
                        break;
                   }while(tolower(getc(stdin))!= 0x1C);
    }

    °¢ ºÎºÐº°·Î Ưº°È÷ ¼³¸íÇÒ °ÍÀº ¾øÀ» °Í °°´Ù. µ¶ÀÚ ¿©·¯ºÐµéÀÌ APIÀÇ ¼³¸íÀ» º¸¸é¼­ µ¿ÀÛÀÌ ¾î¶»°Ô µÇ´ÂÁö ½±°Ô ¾Ë ¼ö ÀÖ´Ù.

    <±×¸² 4> msqltool¿¡¼­ µ¥ÀÌÅÍ º£À̽ºÀÇ Å×ÀÌºí ½ºÅ°¸¶

 

4. Full Source Code List

    /*
      mSQL 2.0 release Database Schema Browser.
      Msqltools  version 0.7
      Programmed by Kyung-Ho, Kim

      GNU General Public License.
      Copyrighted by GPL.
      This Program is FREE
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <ctype.h>
    #include "msql.h"
    #define  DEBUG     printf("¿©±â±îÁö´Â ¿¡·¯°¡ ³ªÁö ¾Ê¾ÒÀ¾´Ï´Ù¡¬n");

    extern int errno;
    void printErrMsg(void);
    char *fieldtype(int type);
    char *keytype(int type, int flag);

    //
    // ¿¡·¯°¡ ¹ß»ýÇÏ¸é ¿¡·¯¸¦ Ãâ·ÂÇÑ´Ù.
    //
    void printErrMsg(void)
    {
      char *buffer;
      buffer = (char *)malloc( 30 * sizeof(char));
      puts("--------------------------------------------------------¡¬n");
      puts("mSQL 2.0 rel : ¿¡·¯°¡ ¹ß»ýÇßÀ¾´Ï´Ù.¡¬n");
      puts(msqlErrMsg);
      sprintf(buffer, "¿¡·¯ ¹ß»ý");
      perror(buffer);
      puts("--------------------------------------------------------\n");
      free(buffer);
    }

    char *fieldtype(int type)
    {
      char *buffer;

      buffer=(char *)malloc(10*sizeof(char));

      switch(type){
      case INT_TYPE:
        strcpy(buffer, "Á¤¼öÇü");
        break;
      case UINT_TYPE:
        strcpy(buffer, "¹èÁ¤¼öÇü");
        break;
      case DATE_TYPE:
        strcpy(buffer, "³¯  Â¥");
        break;
      case TIME_TYPE:
        strcpy(buffer, "½Ã  °£");
        break;
      case MONEY_TYPE:
        strcpy(buffer, "  µ·  ");
        break;
      case CHAR_TYPE:
        strcpy(buffer,"¹®  ÀÚ");
        break;
      case TEXT_TYPE:
        strcpy(buffer, "ÅؽºÆ®");
        break;
      case REAL_TYPE:
        strcpy(buffer, "½Ç  ¼ö");
        break;
      case IDX_TYPE:
        strcpy(buffer,"À妽º");
        break;
      default:
        strcpy(buffer, "¾ø  À½");
        break;
      }
      return b

    uffer;
      free(buffer);
    }

    char *keytype(int type, int flag)
    {
      char *buffer;

      buffer=(char *)malloc(17*sizeof(char));

      if(type !=IDX_TYPE)
        sprintf(buffer, "%s", IS_NOT_NULL(flag)? " Y           N/A" : " N           N/A");
      else
        sprintf(buffer, "%s", IS_UNIQUE(flag)?   "N/A           Y " : "N/A           N ");

      return buffer;
    }


    void main(void)
    {

      char *hostname, dbname[20], tbname[20];
      int sockdes, counter, udb=1, utb, totaldb, totaltb, totalfd;

      m_result *rs;
      m_row mrow;
      m_field *mfield;
      char **mmrow, **dblist, **tblist;


      //
      // ÇÁ·Î±×·¥ ½ÃÀÛ-Á¢¼ÓÇÒ ¼­¹öÀÇ ÁÖ¼Ò¸¦ ÀÔ·Â ¹Þ´Â´Ù.
      //
      printf("------------------------------------------------------¡¬n");
      printf("         mSQL 2.0 ºê¶ó¿ìÀú v.0.7 -- Á¦ÀÛÀÚ: ±è.°æÈ£(zesus:Hitel)¡¬n");
      printf("------------------------------------------------------¡¬n");
      printf("Á¢¼ÓÇÒ mSQL 2.0 ¼­¹ö¸¦ ÀÔ·ÂÇϼ¼¿ä¡¬n");
      hostname=malloc(30 * sizeof(char));
      printf("¿ø°Ý È£½ºÆ® (Enter=localhost): ");
      gets(hostname);
      //scanf("%s",hostname);
      //getchar();
      if(strcmp(hostname,"¡¬n")<0)
        strcpy(hostname,"localhost");

      //
      // msqlConnect() ÇÔ¼ö¸¦ »ç¿ëÇؼ­ mSQL 2.0°úÀÇ Á¢¼Ó ¿©ºÎ È®ÀÎ
      //
      printf("Áö±Ý <%s>¿¡ Á¢¼ÓÀ» ½ÃµµÇÕ´Ï´Ù.¡¬n", hostname);
      if((sockdes=msqlConnect(hostname)) < 0){
        printErrMsg();
        printf("¿¬°á¿¡ ½ÇÆÐÇßÀ¾´Ï´Ù. %s ¼­¹ö¿¡ mSQL 2.0 DBMS°¡ µ¿ÀÛÇÏ´ÂÁö È®ÀÎÇϼ¼¿ä.¡¬n", hostname);
        msqlClose(sockdes);
        exit(1);
      }
      else{
        printf("¼ÒÄÏ ¹øÈ£ : %d  ¹øÀ¸·Î ¿¬°á¿¡ ¼º°øÇßÀ¾´Ï´Ù.¡¬n", sockdes);
        printf("%s : mSQL 2.0 ¼­¹ö¿¡ ¼º°øÀûÀ¸·Î Á¢¼ÓÀ» ÇßÀ¾´Ï´Ù.¡¬n", hostname);
        printf("----------------------------------------------------¡¬n¡¬n");
      }

      do{
        //
        // Á¢¼ÓµÈ µ¥ÀÌŸº£À̽º½Ã½ºÅÛÀÇ ¸ðµç µ¥ÀÌŸ º£À̽º¸¦ ¾Ë¾Æ³½´Ù
        //
        printf("¡¬nÁö±Ý %s ¿¡¼­ °ü¸®ÇÏ°í ÀÖ´Â µ¥ÀÌÅÍ º£À̽º ÀÔ´Ï´Ù.¡¬n", hostname);
        if(!(rs=msqlListDBs(sockdes))){
          printErrMsg();
          printf("°ü¸®ÇÏ°í ÀÖ´Â µ¥ÀÌŸ º£À̽º°¡ ¾ø´Â °Í °°À¾´Ï´Ù.¡¬n¡¬n");
          exit(1);
        }
        else{
          totaldb=msqlNumRows(rs);
          printf("ÇöÁ¦ ÃÑ %d °³ÀÇ µ¥ÀÌŸ º£À̽º¸¦ °ü¸®ÇÏ°í ÀÖÀ¾´Ï´Ù. ¡¬n", totaldb);
          // °¢ µ¥ÀÌŸ º£À̽ºÀÇ À̸§À» ¾ò´Â´Ù.
          for(counter=0; counter<totaldb; counter++){
            mrow=msqlFetchRow(rs);
            dblist[counter]=*mrow;
          }

          // °¢ µ¥ÀÌŸ º£À̽ºÀÇ À̸§À» Ãâ·ÂÇÑ´Ù.
          printf("----------------------------------------------------¡¬n");
          printf("   ¹ø  È£          µ¥ÀÌŸ º£À̽º¡¬n");
          printf("----------------------------------------------------¡¬n");
          for(counter=0; counter<totaldb; counter++)
            printf("   %3d.            %-16.16s¡¬n", counter+1, dblist[counter]);

          // °ü¸®ÇÏ°í ÀÖ´Â µ¥ÀÌŸ º£À̽º¸¦ »ç¿ëÀÚÀÇ ¼±ÅÃÀ» ÀÔ·Â ¹ÞÀ½.
          printf("------------------------------------------------------¡¬n");
          printf("µ¥ÀÌŸ º£À̽º¸¦ ¼±ÅÃÇϼ¼¿ä[¹øÈ£,0(Á¾·á)] : ");
          scanf("%d",&udb);
          getc(stdin);
        }
        if(udb!=0){
        //
        // »ç¿ëÀÚÀÇ ¿ä±¸¿¡ µû¶ó ¼±ÅÃµÈ µ¥ÀÌŸ º£À̽º¿¡ Á¢±ÙÇÑ´Ù.
        //
        printf("ÀÔ·ÂÇϽŠ¼ýÀÚ´Â %d ¹øÀÔ´Ï´Ù. ¡¬n¡¬n", udb);
        strcpy(dbname, dblist[udb-1]);
        printf("%s µ¥ÀÌŸ º£À̽º¸¦ Á¢±ÙÇÕ´Ï´Ù.¡¬n", dbname);
        if(msqlSelectDB(sockdes, dbname)==-1)
          printErrMsg();
        else
          printf("%s µ¥ÀÌŸ º£À̽º¿¡ ¼º°øÀûÀ¸·Î Á¢±ÙÇß½À´Ï´Ù.¡¬n¡¬n", dbname);

        do{
             //
             // µ¥ÀÌŸ º£À̽º³»ÀÇ Å×À̺í Á¤º¸¸¦ º¸¿© ÁØ´Ù.
             //
             if(!(rs=msqlListTables(sockdes))){
               printErrMsg();
               exit(1);
             }
             else{
               totaltb=msqlNumRows(rs);
               for(counter=0; counter < totaltb; counter++){
               mrow=msqlFetchRow(rs);
               tblist[counter]=*mrow;
             }
             printf("¡¬n");
             printf("----------------------------------------------------¡¬n");
             printf("  ÇöÁ¦ Á¢±Ù ÁßÀÎ µ¥ÀÌŸ º£À̽º : %s¡¬n", dbname);
             printf("  Á¸ÀçÇÏ´Â Å×À̺íÀÇ ¼ö         : %d¡¬n", totaltb);
             printf("----------------------------------------------------¡¬n");
             printf("  ¹ø È£               Å×À̺í À̸§¡¬n");
           

      printf("--------------------------------------------------------¡¬n");
             for(counter=0; counter<totaltb; counter++)
               printf("  %3d                 %s¡¬n", counter+1, tblist[counter]);

             printf("-----------------------------------------------------¡¬n");
             printf("Á¢±ÙÇÒ Å×À̺íÀ» ÀÔ·ÂÇϼ¼¿ä[¹øÈ£,0(Àü¸Þ´º))] : ");
             scanf("%d", &utb);
             getchar();
           }
           

           if(utb!=0){
                 //
                 // Å×ÀÌºí³»¿¡ Çʵå Á¤º¸¸¦ ¾Ë¾Æ³½´Ù.
                 //
                 printf("ÀÔ·ÂÇϽŠ¼ýÀÚ´Â %d ¹øÀÔ´Ï´Ù. ¡¬n", utb);
                 strcpy(tbname, tblist[utb-1]);
                 printf("Áö±Ý %s Å×À̺íÀ» Á¢±Ù Áß ÀÔ´Ï´Ù.¡¬n¡¬n", tbname);
                 if(!(rs=msqlListFields(sockdes, tbname))){
                   printErrMsg();
                   exit(1);
                 }
                 else{
                   counter=0;
                   printf("¡¬n");
                   printf("-------------------------------------------------¡¬n");
                   printf("  ÇöÁ¦ Á¢±Ù ÁßÀÎ µ¥ÀÌŸ º£À̽º : %s¡¬n", dbname);
                   printf("  ÇöÁ¦ Á¢±Ù ÁßÀÎ Å×ÀÌºí        : %s¡¬n", tbname);
                   printf("-------------------------------------------------¡¬n");
       

                printf("  ¹ø È£   Çʵå À̸§     ÇʵåÇü     Çʵå±æÀÌ     ÇʼöÅ°    Unique À妽º ¡¬n");
                   printf("-------------------------------------------------¡¬n");
                   while((mfield=msqlFetchField(rs))){
                     printf(" %3d  %-13.13s %-7.7s   %6d   %s¡¬n", counter+1, mfield->name, ¡¬
                            fieldtype(mfield->type), mfield->length, keytype(mfield->type, mfield->flags));
                     counter++;
                   }
                   printf("-------------------------------------------------¡¬n");
                 }
                 printf("¿£ÅÍÅ°¸¦ ÀÔ·ÂÇÏ½Ã¸é µ¥ÀÌŸ º£À̽º ¸Þ´º·Î µ¹¾Æ °©´Ï´Ù...¡¬n¡¬n");
               }
               else
                 break;
            }while(tolower(getc(stdin))!= 0x1C);
        }
      }while(udb!=0);
      

      //
      // mSQL 2.0 µ¥ÀÌŸ º£À̽º ½Ã½ºÅÛ°úÀÇ Á¢¼ÓÀ» Á¾·áÇÑ´Ù.
      //
      msqlClose(sockdes);
      printf("%s : mSQL 2.0 ¼­¹ö¿¡¼­ Á¢¼ÓÀ» Á¾·á ÇßÀ¾´Ï´Ù.¡¬n", hostname);
      free(hostname);

      printf("¡¬n¡¬n");
      printf("-------------------------------------------------------¡¬n"); 
      printf("       mSQL 2.0 ºê¶ó¿ìÀú v0.7 À» »ç¿ëÇØ Áּż­ ´ë´ÜÈ÷ °¨»çÇÕ´Ï´Ù.¡¬n");
      printf("-------------------------------------------------------¡¬n"); 
      printf("¡¬n¡¬n¡¬n");
    }

 

3.  ¸¶Ä¡¸ç..

    ÀÌ ¹øÈ£¿¡¼­´Â mSQLÀÇ API¿¡ ´ëÇÏ¿© ¾Ë¾Æ º¸¾Ò´Ù. ¸¹Àº sampleÆÄÀϵéÀ» ½Ç¾î ½ÇÁ¦ÀûÀ¸·Î ÀÌÇظ¦ ³ôÀÌ·Á°í ÇßÀ¸³ª ºÎÁ·ÇÑ ¸éÀÌ ¸¹¾Ò´ø °ÍÀ¸·Î »ý°¢ÀÌ µç´Ù. ´ÙÀ½ È£¿¡¼­´Â Web°ú ¿¬µ¿ÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸À̱â·Î ÇÑ´Ù.




¡ã top

homeÀ¸·Î...