001    package com.rain;
002    
003    import java.sql.*;
004    import java.lang.*;
005    
006    /**  
007     * MYSQL µ¥ÀÌŸ º£À̽º °ü¸®
008     * @version 1.0
009     * @author http://cafen.net (outmind@cafen.net)
010     */
011    public class rainMysql {
012    
013            private String drivers = "org.gjt.mm.mysql.Driver";
014    
015    /**  
016     * µ¥ÀÌŸ º£À̽º Á¤º¸
017     */
018            private rainProperties database_info = null ;
019    
020    /**  
021     * ÇöÀç Á¢±ÙµÈ Æ÷ÀÎÅÍ
022     */
023            private Connection current_connect = null ;
024    
025    /**  
026     * ¸¶Áö¸· ¿À·ù ¸Þ¼¼Áö
027     */
028            public String error_msg = "";
029    
030    /**  
031     * »ý¼ºÀÚ
032     * @param  db_id  µ¥ÀÌŸ º£À̽º ȯ°æ ÆÄÀÏ ¾ÆÀ̵ð (conf/db_¾ÆÀ̵ð.ini) ÆÄÀÏÀÌ ÀúÀåµÇ¾î ÀÖ¾î¾ßÇÔ)
033     */
034            public rainMysql(String db_id) {
035                    this.database_info = new rainProperties("db_" + db_id);
036            }
037    
038    /**  
039     * µ¥ÀÌŸ º£À̽º ¿¬°á
040     * @return  ¿¬°á ¼º°ø¿©ºÎ
041     */
042            public boolean connect() {
043                    if (this.current_connect == null) {
044                            try {
045                                    Class.forName(this.drivers).newInstance();
046                                    this.current_connect = DriverManager.getConnection(
047                                            "jdbc:mysql://"+this.database_info.get("host")+"/" +this.database_info.get("database") + "?autoReconnect=true&useUnicode=true&characterEncoding=euckr",
048                                            this.database_info.get("user"),
049                                            this.database_info.get("passwd")
050                                    ); 
051                                    return true;
052                            } catch (Exception e) { 
053                                    this.errorLog(e.getMessage()); 
054                                    return false;
055                            }
056                    } else
057                            return true;
058            }
059    
060    /**  
061     * µ¥ÀÌŸ º£À̽º Á¢¼ÓÇØÁ¦
062     */
063            public void close() { 
064                    try {   
065                            if (this.current_connect !=null) this.current_connect.close(); 
066                    } catch (Exception e) { this.errorLog(e.getMessage()); }
067            }
068    
069    /**  
070     * µ¥ÀÌŸ º£À̽º ¿À·ù ¸Þ¼¼Áö(conf/error_log.txt) ¿¡ ±â·ÏµÊ
071     */
072            public void errorLog(String error_msg) {
073                    rainUtil.errorLog(error_msg);
074                    this.error_msg += error_msg;
075            }
076    
077    /**  
078     * ÁÖ¾îÁø Äõ¸®ÀÇ °á°ú°ªÀ» °¡Á®¿È
079     * @param  qm  Äõ¸®
080     */
081            public ResultSet query(String qm) {
082                    return this.query(qm, false);
083            }
084    
085    /**  
086     * ÁÖ¾îÁø ¾÷µ¥ÀÌÆ® Äõ¸®¸¦ Àü¼ÛÇÔ (delete, update, ±âŸ µ¥ÀÌŸº£À̽ºÀÇ ³»¿ëÀÌ º¯°æµÇ´Â Äõ¸®¸¸ Àü¼Û)
087     * @param  qm  Äõ¸®
088     */
089            public void change(String qm) {
090                    this.queryUpdate(qm, true);     
091            }
092    
093    /**  
094     * ÁÖ¾îÁø Å×À̺íÀÇ ÁÖ¾îÁø Ä®·³¸íÀÇ ¸¶Áö¸· ÀԷ°ª¿¡ 1À» ´õÇØ¼­ ¹Ýȯ
095     * @param  table_name  Å×À̺í¸í
096     * @param  col_name Ä®·³¸í
097     * @return  ¸¶Áö¸· ÀԷ°¡´ÉÇÑ °íÀ¯¹øÈ£
098     */
099            public int getLastID(String table_name, String col_name) {
100                    String last_id = this.queryOne("select max("+col_name+") +1 as last_id from "+table_name+" ");
101                    if (last_id.equals("") || last_id.equals("0")) 
102                            return 1;
103                    else 
104                            return Integer.parseInt(last_id);
105            }
106    
107    /**  
108     * ÁÖ¾îÁø Äõ¸®¸¦ ¼­¹ö¿¡ Àü¼ÛÇØ¼­ °á°ú °ªÀ» ¹ÝȯÇÔ
109     * @param  qm  Äõ¸®
110     * @param  scroll_concur Æ÷ÀÎÅÍ À̵¿¼º¿©ºÎ
111     * @return  Äõ¸® °á°ú
112     */
113            public ResultSet query(String qm, boolean scroll_concur) { 
114                    PreparedStatement pstmt = null;
115                    ResultSet rs = null;
116                    if (this.connect()) {
117                            try {
118                                    if (scroll_concur) 
119                                            pstmt = current_connect.prepareStatement(qm,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
120                                    else  
121                                            pstmt = current_connect.prepareStatement(qm);
122                                    rs = pstmt.executeQuery();
123                            } catch (Exception e) { this.errorLog(e.getMessage() + " / QUERY : " + qm); }
124                    } 
125                    return rs;
126            }
127    
128    /**  
129     * ÁÖ¾îÁø Äõ¸®¸¦ ¼­¹ö¿¡ Àü¼ÛÇÔ
130     * @param  qm  Äõ¸®
131     * @param  auto_commit ÀÚµ¿ commit ¿©ºÎ
132     */
133            public void queryUpdate(String qm, boolean auto_commit) { 
134                    PreparedStatement pstmt = null;
135                    ResultSet rs = null;
136                    if (this.connect()) {
137                            try {
138                                    pstmt = current_connect.prepareStatement(qm);
139                                    pstmt.executeUpdate();
140                    //              if (auto_commit) current_connect.commit();
141                                    pstmt.close();
142                            } catch (Exception e) { this.errorLog(e.getMessage() + " / QUERY : " + qm); } 
143                    }
144            }
145    
146    /**  
147     * ±â Àü¼ÛµÈ Äõ¸®¸¦ commit ½ÃÅ´
148     */
149            public void commit() { 
150                    if (this.connect()) {
151                            try { 
152                                    current_connect.commit(); 
153                            } catch (Exception e) { this.errorLog(e.getMessage()); }
154                    }
155            }
156    
157    /**  
158     * ±â Àü¼ÛµÈ Äõ¸®¸¦ rollback ½ÃÅ´
159     */
160            public void rollback() { 
161                    if (connect()) {
162                            try {
163                                    current_connect.rollback();
164                            } catch (Exception e) { this.errorLog(e.getMessage()); }
165                    }
166            }
167    
168    /**  
169     * ÁÖ¾îÁø Äõ¸®ÀÇ Ã¹¹øÂ° ·Î¿ìÀÇ Ã¹¹øÂ° Çʵ带 ¹ÝȯÇÔ
170     * @param  qm  Äõ¸®
171     * @return  Çʵ尪
172     */
173            public String queryOne(String qm) {
174                    ResultSet rs = this.query(qm);
175                    String return_val = "";
176                    try {
177                            if(rs !=null && rs.next()) return_val = rs.getString(1);
178                            if (return_val == null) 
179                                    return_val = "";
180                    } catch (Exception e) { this.errorLog(e.getMessage() + " / QUERY : " + qm); }
181                    return return_val;
182            }
183    
184    /**  
185     * ÁÖ¾îÁø Äõ¸®·Î ÁöÁ¤ÇÑ °¹¼ö ¸¸Å­ °¡Á®¿È
186     * @param  qm  Äõ¸®
187     * @param  getrow  °¡Á®¿Ã °¹¼ö
188     * @return  ResultSet
189     */
190            public ResultSet queryFetchResultSet(String qm, int getrow) {
191                    ResultSet rs = this.query(qm);
192                    if (getrow == 1) {
193                            try {
194                                    if(rs != null && rs.next()) return rs;
195                                    else return rs;
196                            } catch (Exception e) { this.errorLog(e.getMessage() + " / QUERY : " + qm); }
197                    }
198                    return rs;
199            }
200            
201    /**  
202     * ÁÖ¾îÁø Äõ¸®·Î ÁöÁ¤ÇÑ °¹¼ö ¸¸Å­ °¡Á®¿È - rainData
203     * @param  qm  Äõ¸®
204     * @param  getrow  °¡Á®¿Ã °¹¼ö
205     * @return  rainData
206     */
207            public rainData queryFetch(String qm, int getrow) { 
208                    return (new rainData(
209                            this.queryFetchResultSet(qm,getrow)
210                    ));
211            }
212    
213    /**  
214     * ÁÖ¾îÁø Äõ¸®·Î ù¹øÂ° ·Î¿ì¸¸ °¡Á®¿È - rainData
215     * @param  qm  Äõ¸®
216     * @return  rainData
217     */
218            public rainData queryFetch(String qm) { 
219                    return queryFetch(qm, 1);
220            }
221    
222    /**  
223     * ÁÖ¾îÁø Äõ¸®¿¡¼­ ½ÃÀÛ ½ÃÁ¡ ¹× °¡Á®¿Ã °¹¼ö¸¦ ÁöÁ¤Çؼ­ °á°úÄ¡¸¦ °¡Á®¿È
224     * @param  qm  Äõ¸®
225     * @param  cline ½ÃÀÛÀ§Ä¡
226     * @param  row_count  °¡Á®¿Ã °¹¼ö
227     * @return  rainData
228     */
229            public rainData query2Array(String qm,  int cline , int row_count) {
230                    int from_pos = qm.indexOf(" from ");
231                    String first_qm = "";
232                    String end_qm = "";
233                    ResultSet rs = null;
234                    int total_rows = 0;
235                    int perpage = row_count ;
236                    if (from_pos > 0) {
237                            first_qm = qm.substring(0, from_pos);
238                            end_qm = qm.substring(from_pos + 6);
239                            String count_qm = "select count(*) as row_count from " + end_qm ;
240                            total_rows = Integer.parseInt(this.queryOne(count_qm));
241                            cline = (cline >= total_rows) ? (total_rows - 1): cline;
242                            int startnum = (int) Math.floor(cline/row_count) * row_count;
243                            int endnum = ((cline + row_count) > total_rows)?total_rows:(cline + row_count);
244                            int total_pages = (int) Math.ceil(total_rows/row_count);
245                            int current_page = (int) Math.ceil((cline+1)/row_count);
246                            int offsetnum = endnum - startnum;
247                            rs = this.query(qm + " limit " +startnum + ", " + offsetnum);
248                    }
249                    return new rainData(rs, total_rows, perpage , cline);
250            }
251    
252    }