´ÙÀ½ ±×¸²Àº QBIC Á¶È¸¸¦ ºôµåÇÏ°í ½ÇÇàÇÏ´Â C·Î ÄÚµùµÈ ÇÁ·Î±×·¥ÀÇ ÀϺκÐÀ» º¸¿©ÁÝ´Ï´Ù. ±×¸²¿¡ ÀÖ´Â ÄÚµå´Â Æò±Õ »ö»ó¿¡ ÀÇÇÑ À̹ÌÁö Á¶È¸ÀÔ´Ï´Ù. À̰ÍÀº »ö»óÀ̳ª À̹ÌÁö ÆÄÀÏ À̸§À» ÀÔ·ÂÇϵµ·Ï ÇÁ·ÒÇÁÆ®ÇÕ´Ï´Ù. »ç¿ëÀÚ´Â ¶ÇÇÑ ÈÄ¼Ó Á¶È¸¿ë ¿¹½Ã À̹ÌÁö·Î Á¶È¸¿¡¼ ¸®ÅÏÇÏ´Â À̹ÌÁö¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ±×·± ´ÙÀ½ ÇÁ·Î±×·¥Àº À̹ÌÁö Ä÷³À» Á¶È¸Çϱâ À§ÇØ Æò±Õ »ö»óÀ¸·Î¼ À̸§ ÁöÁ¤µÈ »ö»óÀ̳ª À̹ÌÁö »ö»óÀ» »ç¿ëÇÕ´Ï´Ù.
SAMPLES ¼ºêµð·ºÅ丮¿¡ ÀÖ´Â QBICDEMO.C ÆÄÀÏ¿¡¼ ¿ÏÀüÇÑ ÇÁ·Î±×·¥À» ãÀ» ¼ö ÀÖ½À´Ï´Ù. ¿ÏÀüÇÑ ÇÁ·Î±×·¥Àº Æò±Õ »ö»ó»Ó ¾Æ´Ï¶ó È÷½ºÅä±×·¥À̳ª À§Ä¡ »ö»óÀ¸·Î À̹ÌÁö¸¦ Á¶È¸ÇÏ´Â µ¥ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù. ¿ÏÀüÇÑ ÇÁ·Î±×·¥À» ¼öÇàÇÏ·Á¸é, ENABLE, POPULATE ¹× QBCATDMO »ùÇà ÇÁ·Î±×·¥À» ¼öÇàÇØ¾ß ÇÕ´Ï´Ù(SAMPLES ¼ºêµð·ºÅ丮¿¡µµ ÀÖÀ½). »ùÇà ÇÁ·Î±×·¥¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â ºÎ·Ï B, »ùÇà ÇÁ·Î±×·¥ ¹× ¹Ìµð¾î ÆÄÀÏÀ» ÂüÁ¶ÇϽʽÿÀ.
»ùÇà ÇÁ·Î±×·¥¿¡¼ ´ÙÀ½ »çÇ׿¡ À¯ÀÇÇϽʽÿÀ.
(1)dmbqbapi Çì´õ ÆÄÀÏ Æ÷ÇÔ.
(2)µ¥ÀÌÅͺ£À̽º Á¤º¸¿ë »ç¿ëÀÚ¸¦ ÇÁ·ÒÇÁÆ®.
(3)µ¥ÀÌÅͺ£À̽º¿¡ ¿¬°á.
(4)Á¶È¸ ¿ÀºêÁ§Æ® ÀÛ¼º.
(5)Á¶È¸ ¿ÀºêÁ§Æ®¿¡ Ư¼ºÀ» Ãß°¡.
(6)ÀÔ·Â À¯Çü¿¡ ´ëÇØ »ç¿ëÀÚ¸¦ ÇÁ·ÒÇÁÆ®(»ö»ó À̸§, À̹ÌÁö ÆÄÀÏ ¶Ç´Â ÀÌ¹Ì °Ë»öµÈ À̹ÌÁö).
(7)Ư¼º¿ë µ¥ÀÌÅÍ ¼Ò½º ÁöÁ¤. µ¥ÀÌÅÍ ¼Ò½º´Â Æò±Õ »ö»ó¿¡ ´ëÇÑ ¸í½ÃÀûÀÎ ½ºÆåÀÔ´Ï´Ù.
(8)Á¶È¸ ¹ßÇà. Image Extender´Â À̹ÌÁöÀÇ Àüü Ä÷³À» Ž»öÇÕ´Ï´Ù. À̰ÍÀº ¸®ÅÏµÈ À̹ÌÁöÀÇ ÃÖ´ë ¼ö·Î 10À» ÁöÁ¤Çϱ⵵ ÇÕ´Ï´Ù.
(9)¸®ÅÏµÈ À̹ÌÁö ¼³Á¤¿¡ ´ÙÀ½ À̹ÌÁö¸¦ Ç¥½Ã. À̹ÌÁö Ç¥½Ã¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸´Â Àüü Å©±â À̹ÌÁö ¶Ç´Â ºñµð¿À ÇÁ·¹ÀÓ Ç¥½Ã¸¦ ÂüÁ¶ÇϽʽÿÀ.
(10)Á¶È¸ ¿ÀºêÁ§Æ® »èÁ¦.
SAMPLES ¼ºêµð·ºÅ丮´Â QBIC Á¶È¸¸¦ ºôµåÇÏ°í »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¿¹ÁõÇÏ´Â ¶Ç ´Ù¸¥ ÇÁ·Î±×·¥À» Æ÷ÇÔÇÕ´Ï´Ù. ÇÁ·Î±×·¥ QbicQry.java´Â QBIC Á¶È¸¿¡ ´ëÇÑ °Ë»ö ±âÁØÀ» ±×·¡ÇÈÀ¸·Î ÁöÁ¤ÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù. ¿¹¸¦ µé¾î, ÇÁ·Î±×·¥Àº Æò±Õ »ö»óÀ» ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï »ö»ó ¼±Åñ⸦ Á¦°øÇÕ´Ï´Ù. ÇÁ·Î±×·¥Àº ¼±ÅûçÇ×À» Á¶È¸ ¹®ÀÚ¿·Î º¯È¯½Ãŵ´Ï´Ù.
±×¸² 21. QBIC Á¶È¸ »ùÇà ÇÁ·Î±×·¥
#include <sql.h> #include <sqlcli.h> #include <sqlcli1.h> #include <dmbqbqpi.h> (1) #include <stdio.h> #include <string.h> #include <malloc.h> #include <color.h> #include <ctype.h> #define MaxQueryReturns 10 #define MaxDatabaseNameLength SQL_SH_IDENT #define MaxUserIdLength SQL_SH_IDENT #define MaxPasswordLength SQL_SH_IDENT #define MaxTableNameLength SQL_LG_IDENT #define MaxColumnNameLength SQL_LG_IDENT static char databaseName[MaxDatabaseNameLength+1]; static char userid[MaxUserIdLength+1]; static char password[MaxPasswordLength+1]; static char tableName[MaxTableNameLength+1]; static char columnName[MaxColumnNameLength+1]; static char line[4000]; static QbResult results[MaxQueryReturns]; static long currentImage = -1; static long imageCount = 0; static char* tableAndColumn; static QbQueryHandle averageHandle = 0; static QbQueryHandle histogramHandle = 0; static QbQueryHandle drawHandle = 0; static QbQueryHandle lastHandle = 0; static SQLHENV henv; static SQLHDBC hdbc; static SQLHSTMT hstmt; static SQLRETURN rc; static char* listQueries = "SELECT NAME,DESCRIPTION FROM MMDBSYS.QBICQUERIES ORDER BY NAME"; static char* menu[] = { /* 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */ "", "+-----------------------------------------------------------------------------+", "| AVERAGE COLOR colorname |", "| AVERAGE FILE filename format |", "| AVERAGE LAST |", "| Press Enter to display the next image in the series |", "+-----------------------------------------------------------------------------+", "", 0 }; static char* help[] = { "", "AVERAGE Execute an average color query", " COLOR Specifies the color to query for", " FILE Specifies the file to compute the average color from", " LAST Specifies the last displayed image be used to compute the color", " NEXT Displays the next image from the current query or nothing if", " all of the image have been displayed." "", ">>pause<<", 0 }; /******************************************************************************/ /* doNext() */ /******************************************************************************/ static void doNext(void) { int ret; if (currentImage < imageCount) currentImage++; if (currentImage < imageCount) ret = DBiBrowse("/usr/local/bin/xv %s", MMDB_PLAY_HANDLE, results[currentImage].imageHandle, MMDB_PLAY_NO_WAIT); (9) } /******************************************************************************/ /* doAverage() */ /******************************************************************************/ static void doAverage(void) { QbQueryHandle qohandle = 0; QbImageSource is; char* type; char* arg1; char* arg2; type = nextWord(0); if (abbrev(type, "color", 1)) { is.type = qbiSource_AverageColor; arg1 = nextWord(0); if (arg1 == 0) { printf("AVERAGE COLOR command requires a colorname argument.\n"); return; } if (getColor(arg1, &is.averageColor) == 0) { printf("The colorname entered was not recognized.\n"); return; } } else if (abbrev(type, "file", 1)) { is.type = qbiSource_ClientFile; arg1 = nextWord(0); if (arg1 == 0) { printf("AVERAGE FILE command requires a filename argument.\n"); return; } arg2 = nextWord(0); if (arg2 == 0) { printf("AVERAGE FILE command requires a file format argument.\n"); return; } strcpy(is.clientFile.fileName, arg1); strcpy(is.clientFile.format, arg2); } else if (abbrev(type, "last", 1)) { is.type = qbiSource_ImageHandle; if (0 <= currentImage &&; currentImage < imageCount) strcpy(is.imageHandle, results[currentImage]imageHandle); else { printf("No last image for AVERAGE LAST command\n"); return; } } else { printf("AVERAGE command only supports COLOR, FILE, and LAST types.\n"); return; } _QbQuerySetFeatureData(averageHandle, "QbColorFeatureClass", &is); (7) _QbQuerySearch(averageHandle, tableAndColumn, "IMAGE", MaxQueryReturns, 0, 0, &imageCount, results); (8) lastHandle = averageHandle; currentImage = -1; } /******************************************************************************/ /* commandLoop() */ /******************************************************************************/ void commandLoop(void) { int done = 0; while (!done) { (6) displayText(menu); printf("%d", currentImage + 1); if (0 <= currentImage &&; currentImage < imageCount) printf(" %8.6f", results[currentImage].score); printf("> "); gets(line); done = processCommand(line); } } /******************************************************************************/ /* main() */ /******************************************************************************/ void main(void) { char* inst; int i; printf("\n\n"); printf("Please enter: database_name [user_id] [password] "\n"); (2) gets(line); if (copyWord(line, databaseName, sizeof(databaseName)) == 0) exit(0); copyWord(0, userid, sizeof(userid)); copyWord(0, password, sizeof(password)); printf("\n"); if (SQLAllocEnv(&henv) != SQL_SUCCESS) sqlError(SQL_NULL_HSTMT); if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS) sqlError(SQL_NULL_HSTMT); if (SQLConnect(hdbc, (3) (SQLCHAR*)databaseName, SQL_NTS, (SQLCHAR*)userid, SQL_NTS, (SQLCHAR*)password, SQL_NTS) != SQL_SUCCESS) sqlError(SQL_NULL_HSTMT); printf("Initializing . . .\n"); inst = getenv("DB2INSTANCE"); if (inst != 0 &&; strcmp(inst, "keeseyt") == 0) tableAndColumn = "KEESEY.TEST"; else tableAndColumn = "QBICDEMO.TEST"; _QbQueryCreate(&averageHandle); (4) _QbQueryAddFeature(averageHandle, "QbColorFeatureClass"); _QbQueryCreate(&histogramHandle); _QbQueryAddFeature(histogramHandle, "QbColorHistogramFeatureClass"); _QbQueryCreate(&drawHandle); _QbQueryAddFeature(drawHandle, "QbDrawFeatureClass"); (5) commandLoop(); _QbQueryDelete(drawHandle); _QbQueryDelete(histogramHandle); (10) _QbQueryDelete(averageHandle); if (SQLDisconnect(hdbc) != SQL_SUCCESS) sqlError(SQL_NULL_HSTMT); if (SQLFreeConnect(hdbc) != SQL_SUCCESS) sqlError(SQL_NULL_HSTMT); if (SQLFreeEnv(henv) != SQL_SUCCESS) sqlError(SQL_NULL_HSTMT); } |