5.2.2 DBM ForAll 라이브러리 만들기

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

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

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

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

▷ EHDbmForAll.cs

using System.Data.SqlClient;
using System.Data;
using WSE_Core;
using System.Collections.Generic; 
namespace DBM_ForAll
{
    /// <summary>
    /// DBMForAll 라이브러리의 모든 기능을 수행하는 정적 클래스
    /// </summary>
    public static class EHDbmForAll
    {
        static string constr =
            @"Data Source=[DBMS 인스턴스 명];Initial Catalog=[DB 명];Persist Security Info=True;User ID=[계정];Password=[비밀번호];Pooling=False;"; 
        /// <summary>
        /// Seed 사이트를 추가하는 메서드
        /// </summary>
        /// <param name="url">Seed 사이트 주소</param>
        public static void AddSeedSite(string url)
        {
            AddCandidate(url, 0);
        } 
        /// <summary>
        /// 수집 대상 사이트를 추가하는 메서드
        /// </summary>
        /// <param name="url">사이트 주소</param>
        /// <param name="depth">상대적 깊이</param>
        public static void AddCandidate(string url, int depth)
        {
            SqlCommand scom = MakeSPCommand("AddCandidate",
                                                                   CommandType.StoredProcedure);
            SqlParameter sp_url = new SqlParameter("@Url", url);
            SqlParameter sp_depth = new SqlParameter("@Depth", depth);
            scom.Parameters.Add(sp_url);
            scom.Parameters.Add(sp_depth); 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close();
        }
        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>
        /// <returns>수집 대상 사이트</returns>
        public static Candidate GetFrontCandidate()
        {
            SqlCommand scom = MakeSPCommand("GetFrontCandidate",
                                                                  CommandType.StoredProcedure); 
            SqlParameter sp_url = new SqlParameter("@Url", SqlDbType.VarChar, 200);
            sp_url.Direction = ParameterDirection.Output;
            SqlParameter sp_depth = new SqlParameter("@Depth", SqlDbType.Int);
            sp_depth.Direction = ParameterDirection.Output;
            SqlParameter sp_getted = new SqlParameter("@Getted", SqlDbType.Int);
            sp_getted.Direction = ParameterDirection.Output; 

            scom.Parameters.Add(sp_url);
            scom.Parameters.Add(sp_depth);
            scom.Parameters.Add(sp_getted); 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close(); 

            if ((int)sp_getted.Value == 1)
            {
                string url = sp_url.Value as string;
                int depth = (int)sp_depth.Value;
                return new Candidate(url, depth);
            }
            return null;
        } 
        /// <summary>
        /// 수집 대상 사이트 목록 가져오기
        /// </summary>
        /// <returns>수집 대상 사이트 목록</returns>
        public static List<Candidate> GetCandidates()
        {
            List<Candidate> list = new List<Candidate>();

            SqlCommand scom = MakeSPCommand(
                         "SELECT Url, Depth From CandidateTable",CommandType.Text);
            scom.Connection.Open();

            SqlDataReader sdr = scom.ExecuteReader();
            Candidate candidate = null;
 
            while (sdr.Read())
            {
                candidate = new Candidate();
                candidate.Url = sdr["Url"] as string;
                candidate.Depth = (int)sdr["Depth"];
                list.Add(candidate);
            }
            sdr.Close();

            scom.Connection.Close();
            return list;
        }
 



        /// <summary>
        /// 수집한 페이지 정보 보관하기
        /// </summary>
        /// <param name="purl">수집한 페이지 정보 개체</param>
        public static void StorePostedUrl(PostedUrl purl)
        {
            SqlCommand scom = MakeSPCommand("AddPostedUrl",
                                                                  CommandType.StoredProcedure);
 
            SqlParameter sp_url = new SqlParameter("@Url", purl.Url);
            SqlParameter sp_ourl = new SqlParameter("@OriginUrl", purl.OriginUrl);
            SqlParameter sp_depth = new SqlParameter("@Depth", purl.Depth);
            SqlParameter sp_ptime=new SqlParameter("@PostedTime",purl.PostedTime);
            SqlParameter sp_content = new SqlParameter("@PostedContent",
                                                                         purl.Content);
            SqlParameter sp_title = new SqlParameter("@Title", purl.Title);
 
            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();
 
        }
 

        /// <summary>
        /// 형태소 정보 추가하기
        /// </summary>
        /// <param name="purl">페이지 주소</param>
        /// <param name="morpheme">형태소 정보 개체</param>
        /// <returns>추가 여부</returns>
        public static bool AddMorphemeInfo(string purl, Morpheme morpheme)
        {
            bool re = AddMorphemeInfo(morpheme.Name);
            AddInvertedItem(morpheme.Name, purl, morpheme.Count);
            return re; 
        }
 
        private static void AddInvertedItem(string mname, string purl, int count)
        {
            SqlCommand scom = MakeSPCommand("AddInvertedItem",
                                                                  CommandType.StoredProcedure);
 
            SqlParameter sp_mor = new SqlParameter("@Morpheme", mname);
            SqlParameter sp_url = new SqlParameter("@Url", purl);
            SqlParameter sp_rcnt = new SqlParameter("@Refcnt", count);
 
            scom.Parameters.Add(sp_mor);
            scom.Parameters.Add(sp_url);
            scom.Parameters.Add(sp_rcnt);
 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close(); 
        }
 
        private static bool AddMorphemeInfo(string mname)
        {
            SqlCommand scom = MakeSPCommand("AddMorphemeInfo",
                                                                  CommandType.StoredProcedure); 
            SqlParameter sp_mor = new SqlParameter("@Morpheme", mname);
            SqlParameter sp_existed = new SqlParameter("@Existed", SqlDbType.Int);
            sp_existed.Direction = ParameterDirection.Output; 
            scom.Parameters.Add(sp_mor);
            scom.Parameters.Add(sp_existed); 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close(); 
            return (int)sp_existed.Value == 0;
        } 
        /// <summary>
        /// 형태소 목록 가져오기
        /// </summary>
        /// <returns>형태소 목록</returns>
        public static List<string> GetMorphemes()
        {
            List<string> list = new List<string>(); 

            SqlCommand scom = MakeSPCommand(
                   "SELECT Morpheme FROM IndexInvFileTable",CommandType.Text); 
            scom.Connection.Open(); 
            SqlDataReader sdr = scom.ExecuteReader();
            while (sdr.Read())
            {
                list.Add(sdr["Morpheme"] as string);
            }
            sdr.Close(); 
            scom.Connection.Close();
            return list;
        } 
        /// <summary>
        /// 수집한 페이지의 전체 형태소 개수 정보 추가하기
        /// </summary>
        /// <param name="url">페이지 주소</param>
        /// <param name="tcnt">전체 형태소 개수</param>
        public static void AddMCPostedInfo(string url, int tcnt)
        {
            SqlCommand scom = MakeSPCommand("AddMCPostedUrlInfo",
                                                                 CommandType.StoredProcedure);
 
            SqlParameter sp_url = new SqlParameter("@Url", url);
            SqlParameter sp_tcnt = new SqlParameter("@TotalCount", tcnt);
 
            scom.Parameters.Add(sp_url);
            scom.Parameters.Add(sp_tcnt);
 
            scom.Connection.Open();
            scom.ExecuteNonQuery();
            scom.Connection.Close();
        }
    }
}