5.4.2 DBM ForSearch 라이브러리 만들기

이제 예광탄에서 만든 EHDbmForSearch 클래스로 DBM ForSearch 라이브러리를 만듭시다. 만드는 방법은 클라스 라이브러리 템플릿으로 프로젝트 추가합니다. 그리고 제공하는 cs 파일의 이름을 EHDbmForSearch로 변경한 후에 앞에서 작성한 EHDbmForSearch 소스를 복사해서 붙여 넣습니다.

EHDbmForSearch에서는 WSE Core 라이브러리를 사용하므로 참조 추가하는 것을 잊지 마세요. 그리고 프로젝트 속성의 빌드 탭에서 XML 문서 파일 체크 박스를 체크하여 세 줄 주석 작성하는 것도 잊지 마시기 바랍니다.

DBM ForSearch 라이브러리는 예광탄으로 정상적으로 수행하는 것을 확인한 것으로 만드는 것이라 별다른 추가 작업이 필요한 것은 아닙니다. 다시 한 번 라이브러리가 정상적인지 확인하기 위해 DBM ForSearch 예광탄 프로그램의 EHDbmForSearch.cs 파일 내용은 모두 주석 처리한 후에 DBM ForSearch 라이브러리를 추가한 후에 다시 한 번 테스트를 하는 것도 좋은 방법입니다.

다음은 EHDbmForSearch.cs 파일의 내용입니다.

▷ EHDbmForSearch.cs

using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data;
using WSE_Core;
using System;
 
namespace DBMForSearchLib
{
    /// <summary>
    /// 검색 과정에서 DBMS를 사용하는 부분을 수행하는 정적 클래스
    /// /// </summary>
    public static class EHDbmForSearch
    {
        static string constr =
            @"Data Source=[DBMS 인스턴스 명];Initial Catalog=[DB 명];Persist Security Info=True;User ID=[계정];Password=[비밀번호];Pooling=False;"; 

        /// <summary>
        /// 형태소 이름으로 역파일 테이블의 요소를 구하는 메서드
        /// </summary>
        /// <param name="mname">형태소 이름</param>
        /// <returns>역파일 테이블의 요소</returns>
        public static List<InvertedElem> GetInvertedFile(string mname)
        {
            List<InvertedElem> list = new List<InvertedElem>();
            int mindex = GetMIndex(mname);
            if (mindex == -1)
            {
                return list;
            }
            string query = string.Format("SELECT * FROM MTB_{0}", mindex);
            SqlCommand scom = MakeSPCommand(query, CommandType.Text);
 
            scom.Connection.Open(); 
            SqlDataReader sdr = scom.ExecuteReader();
            InvertedElem elem = null;
            while (sdr.Read())
            {
                elem = new InvertedElem();
                elem.Url = sdr["Url"] as string;
                elem.RefCount = (int)sdr["Refcnt"];
                list.Add(elem);
            }
            sdr.Close(); 
            scom.Connection.Close();
            return list;
        }
 
        /// <summary>
        /// 형태소 이름이 역파일 테이블의 인덱스 값을 구하는 메서드
        /// </summary>
        /// <param name="mname">형태소 이름</param>
        /// <returns>역파일 테이블의 인덱스 값</returns>
        public static int GetMIndex(string mname)
        {
            SqlCommand scom = MakeSPCommand("GetMIndex",
                                                                CommandType.StoredProcedure);
            SqlParameter sp_morpheme = new SqlParameter("@Morpheme", mname);
            SqlParameter sp_mindex = new SqlParameter("@MIndex", SqlDbType.Int);
            sp_mindex.Direction = ParameterDirection.Output;

            scom.Parameters.Add(sp_morpheme);
            scom.Parameters.Add(sp_mindex);
 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close();
            return (int)sp_mindex.Value;
        }
 
        static SqlCommand MakeSPCommand(string cmdtext, CommandType cmdtype)
        {
            SqlConnection scon = new SqlConnection(constr);
            SqlCommand scom = new SqlCommand(cmdtext, scon);
            scom.CommandType = cmdtype;
            return scom;
        }
 

        /// <summary>
        /// 수집한 웹 페이지에 있는 전체 형태소 개수를 구하는 메서드
        /// </summary>
        /// <param name="url">웹 페이지 주소</param>
        /// <returns>전체 형태소 개수</returns>
        public static int GetTotalCountInUrl(string url)
        {
            SqlCommand scom = MakeSPCommand("GetMorphCountInUrl",
                                                                  CommandType.StoredProcedure);
            SqlParameter sp_url = new SqlParameter("@Url", url);
            SqlParameter sp_cnt = new SqlParameter("@Cnt", SqlDbType.Int);
            sp_cnt.Direction = ParameterDirection.Output;
 

            scom.Parameters.Add(sp_url);
            scom.Parameters.Add(sp_cnt);
 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close();
            return (int)sp_cnt.Value;
         }
 

        /// <summary>
        /// 수집한 웹 페이지 개수를 구하는 메서드
        /// </summary>
        /// <returns>수집한 웹 페이지 개수</returns>
        public static int GetPostedUrlCount()
        {
            SqlCommand scom = MakeSPCommand("GetPostedUrlCount",
                                                                  CommandType.StoredProcedure);
 
            SqlParameter sp_cnt = new SqlParameter("@Cnt", SqlDbType.Int);
            sp_cnt.Direction = ParameterDirection.Output;
            scom.Parameters.Add(sp_cnt);
 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close();
 
            return (int)sp_cnt.Value;
 
        }
 
        /// <summary>
        /// 웹 페이지 주소로 수집한 웹 페이지 정보를 구하는 메서드
        /// </summary>
        /// <param name="url">웹 페이지 주소</param>
        /// <returns>수집한 웹 페이지 정보 개체</returns>
        public static PostedUrl GetPostedUrl(string url)
        {
            SqlCommand scom = MakeSPCommand("GetPostedUrl",
                                                                  CommandType.StoredProcedure);
 
            SqlParameter sp_url = new SqlParameter("@Url", url);
            SqlParameter sp_ourl = new SqlParameter("@OriginUrl",
                                                                    SqlDbType.VarChar, 200);
            sp_ourl.Direction = ParameterDirection.Output;
 
            SqlParameter sp_depth = new SqlParameter("@Depth", SqlDbType.Int);
            sp_depth.Direction = ParameterDirection.Output;
 
            SqlParameter sp_ptime = new SqlParameter("@PostedTime",
                                                                      SqlDbType.DateTime);
            sp_ptime.Direction = ParameterDirection.Output;
 
            SqlParameter sp_content = new SqlParameter("@PostedContent",
                                                                        SqlDbType.VarChar, 8000);
            sp_content.Direction = ParameterDirection.Output;
 
            SqlParameter sp_title = new SqlParameter("@Title", SqlDbType.VarChar,200);
            sp_title.Direction = ParameterDirection.Output;

            scom.Parameters.Add(sp_url);
            scom.Parameters.Add(sp_ourl);
            scom.Parameters.Add(sp_depth);
            scom.Parameters.Add(sp_ptime);
            scom.Parameters.Add(sp_content);
            scom.Parameters.Add(sp_title);
 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close();
 
            string ourl = sp_ourl.Value as string;
            if (ourl == null)
            {
                return new PostedUrl();
            }
 
            int depth = (int)sp_depth.Value;
            DateTime ptime = (DateTime)sp_ptime.Value;
            string content = sp_content.Value as string;
            string title = sp_title.Value as string;
            return new PostedUrl(url, ourl, title, content, depth, ptime); 
        }
    }  
}