dbpoolman instead of connectionbroker
[mir.git] / source / mir / storage / Database.java
index 3c75365..ec48710 100755 (executable)
@@ -12,6 +12,9 @@ import  com.javaexchange.dbConnectionBroker.*;
 import  mir.storage.StorageObject;
 import  mir.entity.*;
 import  mir.misc.*;
+import com.codestudio.sql.*;
+import com.codestudio.sql.*;
+import com.codestudio.util.*;
 
 
 /**
@@ -37,7 +40,7 @@ public class Database implements StorageObject {
   protected int[]                     metadataTypes;
   protected Class                     theEntityClass;
   protected StorageObject             myselfDatabase;
-  protected HashMap                   cache;
+  protected DatabaseCache             cache;
   protected SimpleList                popupCache=null;
   protected boolean                   hasPopupCache = false;
   protected SimpleHash                hashCache=null;
@@ -47,7 +50,6 @@ public class Database implements StorageObject {
   private int                         defaultLimit;
   protected DatabaseAdaptor             theAdaptor;
   protected Logfile                   theLog;
-  protected Connection                con;
 
   /**
    * Kontruktor bekommt den Filenamen des Konfigurationsfiles übergeben.
@@ -59,25 +61,25 @@ public class Database implements StorageObject {
    *
    * @param   String confFilename Dateiname der Konfigurationsdatei
    */
-  public Database() {
-    //theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("Database.Logfile"));
-    theLog = Logfile.getInstance(this.getClass().getName());
-    String database_username=DatabaseConfig.getProp("Database.Username");
-    String database_password=DatabaseConfig.getProp("Database.Password");
-    String database_host=DatabaseConfig.getProp("Database.Host");
-    String theAdaptorName=DatabaseConfig.getProp("Database.Adaptor");
+  public Database() throws StorageObjectException {
+    theLog = Logfile.getInstance(MirConfig.getProp("Home") + MirConfig.getProp("Database.Logfile"));
+    String database_username=MirConfig.getProp("Database.Username");
+    String database_password=MirConfig.getProp("Database.Password");
+    String database_host=MirConfig.getProp("Database.Host");
+    String theAdaptorName=MirConfig.getProp("Database.Adaptor");
     try {
       theEntityClass = Class.forName("mir.entity.GenericEntity");
       theAdaptor = (DatabaseAdaptor)Class.forName(theAdaptorName).newInstance();
-      defaultLimit = Integer.parseInt(DatabaseConfig.getProp("Database.Limit"));
+      defaultLimit = Integer.parseInt(MirConfig.getProp("Database.Limit"));
       database_driver=theAdaptor.getDriver();
       database_url=theAdaptor.getURL(database_username,database_password,database_host);
       theLog.printDebugInfo("adding Broker with: " +database_driver+":"+database_url  );
-      DatabaseConfig.addBroker(database_driver,database_url);
-      myBroker=DatabaseConfig.getBroker();
+      MirConfig.addBroker(database_driver,database_url);
+      //myBroker=MirConfig.getBroker();
     }
     catch (Exception e){
       theLog.printError("Bei Konstruktion von Database() with " + theAdaptorName + " -- " +e.toString());
+      throw new StorageObjectException(e.toString());
     }
   }
 
@@ -217,13 +219,13 @@ public class Database implements StorageObject {
             break;
           case java.sql.Types.CHAR:case java.sql.Types.VARCHAR:case java.sql.Types.LONGVARCHAR:
             outValue = rs.getString(valueIndex);
-            if (outValue != null)
-              outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue));
+            //if (outValue != null)
+              //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue));
             break;
           case java.sql.Types.LONGVARBINARY:
             outValue = rs.getString(valueIndex);
-            if (outValue != null)
-              outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue));
+            //if (outValue != null)
+              //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue));
             break;
           case java.sql.Types.TIMESTAMP:
             Timestamp timestamp = (rs.getTimestamp(valueIndex));
@@ -254,7 +256,7 @@ public class Database implements StorageObject {
 
     if (id==null||id.equals(""))
       throw new StorageObjectException("id war null");
-    if (cache != null && cache.containsKey(id))
+    if (cache != null && (cache.containsKey(id) > -1))
       return (Entity)cache.get(id);  // wenn cache gesetzt, evtl. kein roundtrip zur Datenbank
 
     Statement stmt=null;Connection con=getPooledCon();
@@ -434,10 +436,16 @@ public class Database implements StorageObject {
           if (rs.next())
             count = rs.getInt(1);
           rs.close();
+          //nothing in the table: return null
+          if(count<=0){
+            freeConnection(con, stmt);
+            return null;
+          }
+        } else {
+          theLog.printError("Could not count: " + countSql);
         }
-        else
-          theLog.printError("Mh. Konnte nicht zaehlen: " + countSql);
       }
+
       // hier select
       rs = executeSql(stmt, selectSql.toString());
       if (rs != null) {
@@ -517,11 +525,10 @@ public class Database implements StorageObject {
           theResultHash.put(metadataFields.get(i), theResult);
         }
       }
-      if (cache != null && theResultHash.containsKey(thePKeyName) && cache.containsKey((String)theResultHash.get(thePKeyName))) {
-        //theLog.printDebugInfo("CACHE: (out) "+ theResultHash.get(thePKeyName)+ " :"+theTable);
+      if (cache != null && theResultHash.containsKey(thePKeyName) &&
+          (cache.containsKey((String)theResultHash.get(thePKeyName)) > -1)) {
         returnEntity = (Entity)cache.get((String)theResultHash.get(thePKeyName));
-      }
-      else {
+      } else {
         if (theEntityClass != null) {
           returnEntity = (Entity)theEntityClass.newInstance();
           returnEntity.setValues(theResultHash);
@@ -530,13 +537,11 @@ public class Database implements StorageObject {
             //theLog.printDebugInfo("CACHE: ( in) " + returnEntity.getId() + " :"+theTable);
             cache.put(returnEntity.getId(), returnEntity);
           }
-        }
-        else {
+        } else {
           throwStorageObjectException("Interner Fehler theEntityClass nicht gesetzt!");
         }
       }
-    }           // try
-    catch (IllegalAccessException e) {
+    } catch (IllegalAccessException e) {
       throwStorageObjectException("Kein Zugriff! -- " + e.toString());
     } catch (IOException e) {
       throwStorageObjectException("IOException! -- " + e.toString());
@@ -563,7 +568,6 @@ public class Database implements StorageObject {
     //cache
     invalidatePopupCache();
     try {
-      HashMap theEntityValues = theEntity.getValues();
       ArrayList streamedInput = theEntity.streamedInput();
       StringBuffer f = new StringBuffer();
       StringBuffer v = new StringBuffer();
@@ -583,8 +587,8 @@ public class Database implements StorageObject {
               aValue = "?";
             }
             else {
-              if (theEntityValues.containsKey(aField)) {
-                aValue = "'" + StringUtil.quote((String)theEntityValues.get(aField))
+              if (theEntity.hasValueForField(aField)) {
+                aValue = "'" + StringUtil.quote((String)theEntity.getValue(aField))
                     + "'";
               }
             }
@@ -612,7 +616,7 @@ public class Database implements StorageObject {
       pstmt = con.prepareStatement(sql);
       if (streamedInput != null) {
         for (int i = 0; i < streamedInput.size(); i++) {
-          String inputString = (String)theEntityValues.get(streamedInput.get(i));
+          String inputString = (String)theEntity.getValue((String)streamedInput.get(i));
           pstmt.setBytes(i + 1, inputString.getBytes());
         }
       }
@@ -649,7 +653,6 @@ public class Database implements StorageObject {
     Connection con = null;
     PreparedStatement pstmt = null;
     ArrayList streamedInput = theEntity.streamedInput();
-    HashMap theEntityValues = theEntity.getValues();
     String id = theEntity.getId();
     String aField;
     StringBuffer fv = new StringBuffer();
@@ -662,14 +665,14 @@ public class Database implements StorageObject {
       // only normal cases
       if (!(aField.equals(thePKeyName) || aField.equals("webdb_create") ||
           aField.equals("webdb_lastchange") || (streamedInput != null && streamedInput.contains(aField)))) {
-        if (theEntityValues.containsKey(aField)) {
+        if (theEntity.hasValueForField(aField)) {
           if (firstField == false) {
             fv.append(", ");
           }
           else {
             firstField = false;
           }
-          fv.append(aField).append("='").append(StringUtil.quote((String)theEntityValues.get(aField))).append("'");
+          fv.append(aField).append("='").append(StringUtil.quote((String)theEntity.getValue(aField))).append("'");
         }
       }
     }
@@ -692,7 +695,7 @@ public class Database implements StorageObject {
       pstmt = con.prepareStatement(sql.toString());
       if (streamedInput != null) {
         for (int i = 0; i < streamedInput.size(); i++) {
-          String inputString = (String)theEntityValues.get(streamedInput.get(i));
+          String inputString = theEntity.getValue((String)streamedInput.get(i));
           pstmt.setBytes(i + 1, inputString.getBytes());
         }
       }
@@ -753,7 +756,7 @@ public class Database implements StorageObject {
    * eine SimpleList mit Standard-Popupdaten erzeugt werden koennen soll.
    * @return null
    */
-  public SimpleList getPopupData () {
+  public SimpleList getPopupData () throws StorageObjectException {
     return  null;
   }
 
@@ -763,7 +766,8 @@ public class Database implements StorageObject {
    *  @param hasNullValue  Wenn true wird eine leerer  Eintrag fuer die Popups erzeugt.
    *  @return SimpleList Gibt freemarker.template.SimpleList zurueck.
    */
-  public SimpleList getPopupData (String name, boolean hasNullValue) {
+  public SimpleList getPopupData (String name, boolean hasNullValue)
+    throws StorageObjectException {
     return  getPopupData(name, hasNullValue, null);
   }
 
@@ -774,8 +778,8 @@ public class Database implements StorageObject {
    *  @param where  Schraenkt die Selektion der Datensaetze ein.
    *  @return SimpleList Gibt freemarker.template.SimpleList zurueck.
    */
-  public SimpleList getPopupData (String name, boolean hasNullValue, String where) {
-    return  getPopupData(name, hasNullValue, where, null);
+  public SimpleList getPopupData (String name, boolean hasNullValue, String where) throws StorageObjectException {
+   return  getPopupData(name, hasNullValue, where, null);
   }
 
   /**
@@ -786,8 +790,7 @@ public class Database implements StorageObject {
    *  @param order  Gibt ein Feld als Sortierkriterium an.
    *  @return SimpleList Gibt freemarker.template.SimpleList zurueck.
    */
-  public SimpleList getPopupData (String name, boolean hasNullValue, String where,
-      String order) {
+  public SimpleList getPopupData (String name, boolean hasNullValue, String where, String order) throws StorageObjectException {
     // caching
     if (hasPopupCache && popupCache != null)
       return  popupCache;
@@ -829,6 +832,7 @@ public class Database implements StorageObject {
       }
     } catch (Exception e) {
       theLog.printDebugInfo(e.toString());
+      throw new StorageObjectException(e.toString());
     } finally {
       freeConnection(con, stmt);
     }
@@ -968,7 +972,10 @@ public class Database implements StorageObject {
       pstmt = con.prepareStatement(sql);
       result = pstmt.executeUpdate();
     }
-    catch (Exception e) {theLog.printDebugInfo("settimage :: setImage gescheitert: "+e.toString());}
+    catch (Exception e) {
+      theLog.printDebugInfo("settimage :: setImage gescheitert: "+e.toString());
+      throw new StorageObjectException("executeUpdate failed: "+e.toString());
+    }
     finally { freeConnection(con,pstmt); }
     theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " + sql);
     return result;
@@ -1032,12 +1039,29 @@ public class Database implements StorageObject {
   /**
    * Datenbankverbindung wird geschlossen
    */
-  public void disconnectPool () {
+  public void disconnectPool () throws StorageObjectException {
     try {
       myBroker.destroy(100);
     } catch (SQLException sqe) {
-      ;
+      throwSQLException(sqe, "disconnectPool");
+    }
+  }
+  
+  public Connection getPooledCon() throws StorageObjectException {
+    try{
+      Class.forName("com.codestudio.sql.PoolMan").newInstance();
+    } catch (Exception e){
+      e.printStackTrace();
+      throw new StorageObjectException("Could not find the PoolMan Driver"+e.toString());
+    }
+    Connection con = null;
+    try{
+      con = SQLManager.getInstance().requestConnection();
+    } catch(SQLException e){
+      e.printStackTrace();
+      throw new StorageObjectException("No connection to the database");
     }
+    return con;
   }
 
   /**
@@ -1045,7 +1069,7 @@ public class Database implements StorageObject {
    *
    * @return Connection Object.
    */
-  public Connection getPooledCon () throws StorageObjectException {
+  public Connection getPooledCon2() throws StorageObjectException {
     if (myBroker != null) {
       Connection con = myBroker.getConnection();
       if (con != null)
@@ -1060,17 +1084,27 @@ public class Database implements StorageObject {
    * @param con Connection zur Datenbank
    * @param stmt Statement-Objekt
    */
-  public void freeConnection (Connection con, Statement stmt) {
+  public void freeConnection2 (Connection con, Statement stmt)
+    throws StorageObjectException {
     try {
       if (stmt != null)
         stmt.close();
     } catch (SQLException e1) {
       theLog.printDebugInfo(e1.toString());
+      throw new StorageObjectException("DB, in freeConnection: "+e1.toString());
     }
     if (con != null)
       myBroker.freeConnection(con);
-    else
+    else {
       theLog.printDebugInfo("Con was null!");
+      throw new StorageObjectException("Con was null!");
+    }
+  }
+  
+  public void freeConnection (Connection con, Statement stmt)
+    throws StorageObjectException {
+    SQLManager.getInstance().closeStatement(stmt);
+    SQLManager.getInstance().returnConnection(con);
   }
 
   /**
@@ -1094,15 +1128,26 @@ public class Database implements StorageObject {
         sqe.toString());
   }
 
+  protected void _throwStorageObjectException (Exception e, String wo) throws StorageObjectException {
+    if (e != null) {
+        theLog.printError(e.toString()+ wo);
+        throw  new StorageObjectException(wo + e.toString());
+    } else {
+        theLog.printError(wo);
+        throw  new StorageObjectException(wo);
+    }
+
+  }
+
   /**
    * Loggt Fehlermeldung mit dem Parameter Message und wirft dannach eine StorageObjectException
    * @param message Nachricht mit dem Fehler
    * @exception StorageObjectException
    */
   void throwStorageObjectException (String message) throws StorageObjectException {
-    theLog.printError(message);
-    throw  new StorageObjectException(message);
+    _throwStorageObjectException(null, message);
   }
+
 }