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 }