1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski package convwatch;
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski import java.sql.Connection;
27*b1cdbd2cSJim Jagielski import java.sql.DriverManager;
28*b1cdbd2cSJim Jagielski import java.sql.Statement;
29*b1cdbd2cSJim Jagielski import java.sql.ResultSet;
30*b1cdbd2cSJim Jagielski import java.sql.SQLException;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski import java.lang.Thread;
33*b1cdbd2cSJim Jagielski import java.util.StringTokenizer;
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski class ShareConnection
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski     private Connection m_aConnection = null;
ShareConnection()38*b1cdbd2cSJim Jagielski     public ShareConnection()
39*b1cdbd2cSJim Jagielski         {}
40*b1cdbd2cSJim Jagielski 
getConnection()41*b1cdbd2cSJim Jagielski     public Connection getConnection()
42*b1cdbd2cSJim Jagielski         {
43*b1cdbd2cSJim Jagielski             if (m_aConnection == null)
44*b1cdbd2cSJim Jagielski             {
45*b1cdbd2cSJim Jagielski                 try
46*b1cdbd2cSJim Jagielski                 {
47*b1cdbd2cSJim Jagielski                     m_aConnection = DBHelper.getMySQLConnection();
48*b1cdbd2cSJim Jagielski                 }
49*b1cdbd2cSJim Jagielski                 catch(java.sql.SQLException e)
50*b1cdbd2cSJim Jagielski                 {
51*b1cdbd2cSJim Jagielski                     GlobalLogWriter.get().println("DB: ERROR: can't connect to DB.");
52*b1cdbd2cSJim Jagielski                     m_aConnection = null;
53*b1cdbd2cSJim Jagielski                 }
54*b1cdbd2cSJim Jagielski             }
55*b1cdbd2cSJim Jagielski             return m_aConnection;
56*b1cdbd2cSJim Jagielski         }
57*b1cdbd2cSJim Jagielski }
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski     class MySQLThread extends Thread
60*b1cdbd2cSJim Jagielski     {
61*b1cdbd2cSJim Jagielski         Connection m_aCon = null;
62*b1cdbd2cSJim Jagielski         String m_sSQL;
MySQLThread(Connection _aCon, String _sSQL)63*b1cdbd2cSJim Jagielski         public MySQLThread(Connection _aCon, String _sSQL)
64*b1cdbd2cSJim Jagielski             {
65*b1cdbd2cSJim Jagielski                 m_aCon = _aCon;
66*b1cdbd2cSJim Jagielski                 m_sSQL = _sSQL;
67*b1cdbd2cSJim Jagielski             }
68*b1cdbd2cSJim Jagielski 
run()69*b1cdbd2cSJim Jagielski         public void run()
70*b1cdbd2cSJim Jagielski             {
71*b1cdbd2cSJim Jagielski                 Statement oStmt = null;
72*b1cdbd2cSJim Jagielski                 if (m_aCon == null)
73*b1cdbd2cSJim Jagielski                 {
74*b1cdbd2cSJim Jagielski                     GlobalLogWriter.get().println("DB: ERROR: in ExecSQL, connection not established.");
75*b1cdbd2cSJim Jagielski                     return;
76*b1cdbd2cSJim Jagielski                 }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski                 // Connection oCon = null;
79*b1cdbd2cSJim Jagielski                 try
80*b1cdbd2cSJim Jagielski                 {
81*b1cdbd2cSJim Jagielski                     // oCon = getMySQLConnection();
82*b1cdbd2cSJim Jagielski                     oStmt = m_aCon.createStatement();
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski                     GlobalLogWriter.get().println("DB: " + m_sSQL);
85*b1cdbd2cSJim Jagielski                     /* ResultSet oResult = */
86*b1cdbd2cSJim Jagielski                     oStmt.executeUpdate(m_sSQL);
87*b1cdbd2cSJim Jagielski                 }
88*b1cdbd2cSJim Jagielski                 catch(Exception e)
89*b1cdbd2cSJim Jagielski                 {
90*b1cdbd2cSJim Jagielski                     GlobalLogWriter.get().println("DB: Couldn't execute sql string '" + m_sSQL + "'");
91*b1cdbd2cSJim Jagielski                     GlobalLogWriter.get().println("DB: Reason: " + e.getMessage());
92*b1cdbd2cSJim Jagielski                 }
93*b1cdbd2cSJim Jagielski             }
94*b1cdbd2cSJim Jagielski     }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski public class DBHelper
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski     /**
99*b1cdbd2cSJim Jagielski      * This method inserts given values into<br>
100*b1cdbd2cSJim Jagielski      * the table 'states'
101*b1cdbd2cSJim Jagielski      * @param values a set of comma separated values to be inserted
102*b1cdbd2cSJim Jagielski      */
103*b1cdbd2cSJim Jagielski 
SQLinsertValues(Connection _aCon, String _sTableName, String value_names, String values)104*b1cdbd2cSJim Jagielski     public void SQLinsertValues(Connection _aCon, String _sTableName, String value_names, String values)
105*b1cdbd2cSJim Jagielski         {
106*b1cdbd2cSJim Jagielski             if (_aCon == null)
107*b1cdbd2cSJim Jagielski             {
108*b1cdbd2cSJim Jagielski                 GlobalLogWriter.get().println("DB: ERROR: in SQLinsertValues, connection not established.");
109*b1cdbd2cSJim Jagielski                 return;
110*b1cdbd2cSJim Jagielski             }
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski             // String aInsertStr = "";
113*b1cdbd2cSJim Jagielski             //
114*b1cdbd2cSJim Jagielski             // aInsertStr = "INSERT INTO " + _sTableName + " (" + value_names + " ) VALUES (" + values + ")";
115*b1cdbd2cSJim Jagielski             // ExecSQL(_aCon, aInsertStr);
116*b1cdbd2cSJim Jagielski             StringBuffer aInsertStr = new StringBuffer();
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski             aInsertStr.append( "INSERT INTO " ) . append( _sTableName );
119*b1cdbd2cSJim Jagielski             aInsertStr.append( " (").append( value_names ).append ( ")" );
120*b1cdbd2cSJim Jagielski             aInsertStr.append(" VALUES (" ).append( values ).append( ")" );
121*b1cdbd2cSJim Jagielski             ExecSQL(_aCon, aInsertStr.toString() );
122*b1cdbd2cSJim Jagielski         }
123*b1cdbd2cSJim Jagielski 
SQLupdateValue(Connection _aCon, String _sTableName, String _sSet, String _sWhere)124*b1cdbd2cSJim Jagielski     public void SQLupdateValue(Connection _aCon, String _sTableName, String _sSet, String _sWhere)
125*b1cdbd2cSJim Jagielski         {
126*b1cdbd2cSJim Jagielski             if (_aCon == null)
127*b1cdbd2cSJim Jagielski             {
128*b1cdbd2cSJim Jagielski                 GlobalLogWriter.get().println("DB: ERROR: in SQLinsertValues, connection not established.");
129*b1cdbd2cSJim Jagielski                 return;
130*b1cdbd2cSJim Jagielski             }
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski             // String aUpdateStr = "";
133*b1cdbd2cSJim Jagielski             //
134*b1cdbd2cSJim Jagielski             // aUpdateStr = "UPDATE " + _sTableName + " SET " + _sSet + " WHERE " + _sWhere;
135*b1cdbd2cSJim Jagielski             // ExecSQL( _aCon, aUpdateStr );
136*b1cdbd2cSJim Jagielski             StringBuffer aUpdateStr = new StringBuffer();
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski             aUpdateStr.append( "UPDATE " ).append( _sTableName )
139*b1cdbd2cSJim Jagielski                 .append( " SET " ).append( _sSet )
140*b1cdbd2cSJim Jagielski                 .append( " WHERE " ).append( _sWhere );
141*b1cdbd2cSJim Jagielski             ExecSQL( _aCon, aUpdateStr.toString() );
142*b1cdbd2cSJim Jagielski         }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski     private static String m_sDBServerName;
145*b1cdbd2cSJim Jagielski     private static String m_sDBName;
146*b1cdbd2cSJim Jagielski     private static String m_sDBUser;
147*b1cdbd2cSJim Jagielski     private static String m_sDBPasswd;
148*b1cdbd2cSJim Jagielski 
fillDBConnection(String _sInfo)149*b1cdbd2cSJim Jagielski     protected synchronized void fillDBConnection(String _sInfo)
150*b1cdbd2cSJim Jagielski         {
151*b1cdbd2cSJim Jagielski             StringTokenizer aTokenizer = new StringTokenizer(_sInfo,",",false);
152*b1cdbd2cSJim Jagielski             while (aTokenizer.hasMoreTokens())
153*b1cdbd2cSJim Jagielski             {
154*b1cdbd2cSJim Jagielski                 String sPart = aTokenizer.nextToken();
155*b1cdbd2cSJim Jagielski                 if (sPart.startsWith("db:"))
156*b1cdbd2cSJim Jagielski                 {
157*b1cdbd2cSJim Jagielski                     m_sDBName = sPart.substring(3);
158*b1cdbd2cSJim Jagielski                     // GlobalLogWriter.get().println("DB: source version: " + m_sSourceVersion);
159*b1cdbd2cSJim Jagielski                 }
160*b1cdbd2cSJim Jagielski                 else if (sPart.startsWith("user:"))
161*b1cdbd2cSJim Jagielski                 {
162*b1cdbd2cSJim Jagielski                     m_sDBUser = sPart.substring(5);
163*b1cdbd2cSJim Jagielski                 }
164*b1cdbd2cSJim Jagielski                 else if (sPart.startsWith("passwd:"))
165*b1cdbd2cSJim Jagielski                 {
166*b1cdbd2cSJim Jagielski                     m_sDBPasswd = sPart.substring(7);
167*b1cdbd2cSJim Jagielski                 }
168*b1cdbd2cSJim Jagielski                 else if (sPart.startsWith("server:"))
169*b1cdbd2cSJim Jagielski                 {
170*b1cdbd2cSJim Jagielski                     m_sDBServerName = sPart.substring(7);
171*b1cdbd2cSJim Jagielski                 }
172*b1cdbd2cSJim Jagielski             }
173*b1cdbd2cSJim Jagielski         }
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski     /**
176*b1cdbd2cSJim Jagielski      * This method establishes a Connection<br>
177*b1cdbd2cSJim Jagielski      * with the database 'module_unit' on jakobus
178*b1cdbd2cSJim Jagielski      */
179*b1cdbd2cSJim Jagielski 
getMySQLConnection()180*b1cdbd2cSJim Jagielski     public static Connection getMySQLConnection() throws SQLException
181*b1cdbd2cSJim Jagielski         {
182*b1cdbd2cSJim Jagielski             try
183*b1cdbd2cSJim Jagielski             {
184*b1cdbd2cSJim Jagielski                 Class.forName("org.gjt.mm.mysql.Driver");
185*b1cdbd2cSJim Jagielski                 String sConnection = "jdbc:mysql://" + m_sDBServerName + ":3306/" + m_sDBName;
186*b1cdbd2cSJim Jagielski                 // Connection mysql = DriverManager.getConnection(
187*b1cdbd2cSJim Jagielski                 //    "jdbc:mysql://jakobus:3306/jobs_convwatch","admin","admin");
188*b1cdbd2cSJim Jagielski                 Connection mysql = DriverManager.getConnection(sConnection, m_sDBUser, m_sDBPasswd);
189*b1cdbd2cSJim Jagielski                 return mysql;
190*b1cdbd2cSJim Jagielski             }
191*b1cdbd2cSJim Jagielski             catch (ClassNotFoundException e)
192*b1cdbd2cSJim Jagielski             {
193*b1cdbd2cSJim Jagielski                 GlobalLogWriter.get().println("DB: Class not found exception caught: " + e.getMessage());
194*b1cdbd2cSJim Jagielski                 GlobalLogWriter.get().println("DB: Maybe mysql.jar is not added to the classpath.");
195*b1cdbd2cSJim Jagielski             }
196*b1cdbd2cSJim Jagielski             return null;
197*b1cdbd2cSJim Jagielski         }
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski     /**
201*b1cdbd2cSJim Jagielski      * This method removes all entries of the given<br>
202*b1cdbd2cSJim Jagielski      * module/platform combination
203*b1cdbd2cSJim Jagielski      * @param mdl the name of the module, e.g. sal
204*b1cdbd2cSJim Jagielski      * @param os the name of the platform, e.g. unxsols
205*b1cdbd2cSJim Jagielski      */
206*b1cdbd2cSJim Jagielski     // LLA: public static void SQLdeleteValues(Connection _aCon, String _sEnvironment, String _sUnitName, String _sMethodName, String _sCWS, String _sDate)
207*b1cdbd2cSJim Jagielski     // LLA:     {
208*b1cdbd2cSJim Jagielski     // LLA:         String sSQL =
209*b1cdbd2cSJim Jagielski     // LLA:             "DELETE FROM states WHERE " +
210*b1cdbd2cSJim Jagielski     // LLA:             "     unit=" + DatabaseEntry.Quote(_sUnitName) +
211*b1cdbd2cSJim Jagielski     // LLA:             " AND pf="   + DatabaseEntry.Quote (_sEnvironment) +
212*b1cdbd2cSJim Jagielski     // LLA:             " AND meth=" + DatabaseEntry.Quote (_sMethodName) +
213*b1cdbd2cSJim Jagielski     // LLA:             " AND cws="  + DatabaseEntry.Quote(_sCWS) +
214*b1cdbd2cSJim Jagielski     // LLA:             " AND dt="   + DatabaseEntry.Quote(_sDate);
215*b1cdbd2cSJim Jagielski     // LLA:
216*b1cdbd2cSJim Jagielski     // LLA:         // ExecSQL(_aCon, sSQL);
217*b1cdbd2cSJim Jagielski     // LLA:     }
218*b1cdbd2cSJim Jagielski 
ExecSQL(Connection _aCon, String _sSQL)219*b1cdbd2cSJim Jagielski     protected synchronized void ExecSQL(Connection _aCon, String _sSQL)
220*b1cdbd2cSJim Jagielski             {
221*b1cdbd2cSJim Jagielski                 MySQLThread aSQLThread = new MySQLThread(_aCon, _sSQL);
222*b1cdbd2cSJim Jagielski                 aSQLThread.start();
223*b1cdbd2cSJim Jagielski             }
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski     // public static int QueryIntFromSQL(String _sSQL, String _sColumnName, String _sValue)
228*b1cdbd2cSJim Jagielski     //     {
229*b1cdbd2cSJim Jagielski     //         boolean bNeedSecondTry = false;
230*b1cdbd2cSJim Jagielski     //         int nValue = 0;
231*b1cdbd2cSJim Jagielski     //         do
232*b1cdbd2cSJim Jagielski     //         {
233*b1cdbd2cSJim Jagielski     //             try
234*b1cdbd2cSJim Jagielski     //             {
235*b1cdbd2cSJim Jagielski     //                 nValue = QueryIntFromSQL(_sSQL, _sColumnName, _sValue);
236*b1cdbd2cSJim Jagielski     //             }
237*b1cdbd2cSJim Jagielski     //             catch (ValueNotFoundException e)
238*b1cdbd2cSJim Jagielski     //             {
239*b1cdbd2cSJim Jagielski     //                 bNeedSecondTry = true;
240*b1cdbd2cSJim Jagielski     //                 String sSQL = "INSERT INTO " + _sTable + "(" + _sColumnName + ") VALUES (" + _sValue + ")";
241*b1cdbd2cSJim Jagielski     //                 ExecSQL(sSQL);
242*b1cdbd2cSJim Jagielski     //             }
243*b1cdbd2cSJim Jagielski     //         } while (bNeedSecondTry);
244*b1cdbd2cSJim Jagielski     //         return nValue;
245*b1cdbd2cSJim Jagielski     //     }
246*b1cdbd2cSJim Jagielski 
QueryIntFromSQL(Connection _aCon, String _sSQL, String _sColumnName)247*b1cdbd2cSJim Jagielski     public int QueryIntFromSQL(Connection _aCon, String _sSQL, String _sColumnName)
248*b1cdbd2cSJim Jagielski         throws ValueNotFoundException
249*b1cdbd2cSJim Jagielski         {
250*b1cdbd2cSJim Jagielski             Statement oStmt = null;
251*b1cdbd2cSJim Jagielski             Connection oCon = null;
252*b1cdbd2cSJim Jagielski             int nValue = 0;
253*b1cdbd2cSJim Jagielski             try
254*b1cdbd2cSJim Jagielski             {
255*b1cdbd2cSJim Jagielski                 // oCon = getMySQLConnection();
256*b1cdbd2cSJim Jagielski                 oStmt = _aCon.createStatement();
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski                 ResultSet oResult = oStmt.executeQuery(_sSQL);
259*b1cdbd2cSJim Jagielski                 oResult.next();
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 				try
262*b1cdbd2cSJim Jagielski                 {
263*b1cdbd2cSJim Jagielski                     if (_sColumnName.length() == 0)
264*b1cdbd2cSJim Jagielski                     {
265*b1cdbd2cSJim Jagielski                         // take the first row value (started with 1)
266*b1cdbd2cSJim Jagielski                         nValue = oResult.getInt(1);
267*b1cdbd2cSJim Jagielski                     }
268*b1cdbd2cSJim Jagielski                     else
269*b1cdbd2cSJim Jagielski                     {
270*b1cdbd2cSJim Jagielski                         nValue = oResult.getInt(_sColumnName);
271*b1cdbd2cSJim Jagielski                     }
272*b1cdbd2cSJim Jagielski     	            // System.out.println("value: " + String.valueOf(nValue));
273*b1cdbd2cSJim Jagielski 				}
274*b1cdbd2cSJim Jagielski 				catch (SQLException e)
275*b1cdbd2cSJim Jagielski 				{
276*b1cdbd2cSJim Jagielski 	                String sError = e.getMessage();
277*b1cdbd2cSJim Jagielski     	            GlobalLogWriter.get().println("DB: Original SQL error: " + sError);
278*b1cdbd2cSJim Jagielski                     throw new ValueNotFoundException("Cant execute SQL: " + _sSQL);
279*b1cdbd2cSJim Jagielski 				}
280*b1cdbd2cSJim Jagielski             }
281*b1cdbd2cSJim Jagielski             catch(SQLException e)
282*b1cdbd2cSJim Jagielski             {
283*b1cdbd2cSJim Jagielski                 String sError = e.getMessage();
284*b1cdbd2cSJim Jagielski                 GlobalLogWriter.get().println("DB: Couldn't execute sql string " + _sSQL + "\n" + sError);
285*b1cdbd2cSJim Jagielski             }
286*b1cdbd2cSJim Jagielski             return nValue;
287*b1cdbd2cSJim Jagielski         }
288*b1cdbd2cSJim Jagielski 
Quote(String _sToQuote)289*b1cdbd2cSJim Jagielski 	public String Quote(String _sToQuote)
290*b1cdbd2cSJim Jagielski 		{
291*b1cdbd2cSJim Jagielski             String ts = "'";
292*b1cdbd2cSJim Jagielski             String ds = "\"";
293*b1cdbd2cSJim Jagielski             int nQuote = _sToQuote.indexOf(ts);
294*b1cdbd2cSJim Jagielski             if (nQuote >= 0)
295*b1cdbd2cSJim Jagielski             {
296*b1cdbd2cSJim Jagielski                 return ds + _sToQuote + ds;
297*b1cdbd2cSJim Jagielski             }
298*b1cdbd2cSJim Jagielski 			return ts + _sToQuote + ts;
299*b1cdbd2cSJim Jagielski 		}
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski /* default date format in the MySQL DB yyyy-MM-dd */
today()302*b1cdbd2cSJim Jagielski     public static String today()
303*b1cdbd2cSJim Jagielski         {
304*b1cdbd2cSJim Jagielski             return DateHelper.getDateString("yyyy-MM-dd");
305*b1cdbd2cSJim Jagielski         }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski     public static final String sComma = ",";
308*b1cdbd2cSJim Jagielski     public static final String sEqual = "=";
309*b1cdbd2cSJim Jagielski     public static final String sAND = " AND ";
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski 
313