producer abort + timezone support
[mir.git] / source / mir / storage / Database.java
index 4c4ac94..7a3034e 100755 (executable)
@@ -76,7 +76,7 @@ import mir.util.JDBCStringRoutines;
  * Treiber, Host, User und Passwort, ueber den der Zugriff auf die
  * Datenbank erfolgt.
  *
- * @version $Id: Database.java,v 1.44.2.1 2003/05/22 19:45:06 zapata Exp $
+ * @version $Id: Database.java,v 1.44.2.4 2003/06/23 15:24:06 zapata Exp $
  * @author rk
  *
  */
@@ -117,11 +117,15 @@ public class Database implements StorageObject {
   private String database_url;
   private int defaultLimit;
   protected DatabaseAdaptor theAdaptor;
-  private SimpleDateFormat _dateFormatterOut =
-    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-  private SimpleDateFormat _dateFormatterIn =
-    new SimpleDateFormat("yyyy-MM-dd HH:mm");
-  private Calendar _cal = new GregorianCalendar();
+  TimeZone timezone;
+  SimpleDateFormat internalDateFormat;
+  SimpleDateFormat userInputDateFormat;
+/*
+  private SimpleDateFormat _dateFormatterOut;
+  private SimpleDateFormat _dateFormatterIn;
+  _dateFormatterOut = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+  _dateFormatterIn = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+*/
 
   /**
    * Kontruktor bekommt den Filenamen des Konfigurationsfiles ?bergeben.
@@ -141,6 +145,13 @@ public class Database implements StorageObject {
       throw new StorageObjectFailure(e);
     }
     logger = new LoggerWrapper("Database");
+    timezone = TimeZone.getTimeZone(configuration.getString("Mir.DefaultTimezone"));
+    internalDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    internalDateFormat.setTimeZone(timezone);
+
+    userInputDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+    userInputDateFormat.setTimeZone(timezone);
+
 
     String theAdaptorName = configuration.getString("Database.Adaptor");
     defaultLimit = Integer.parseInt(configuration.getString("Database.Limit"));
@@ -349,14 +360,20 @@ public class Database implements StorageObject {
 
             if (!rs.wasNull()) {
               java.util.Date date = new java.util.Date(timestamp.getTime());
-              outValue = _dateFormatterOut.format(date);
-              _cal.setTime(date);
-
-              int offset =
-                  _cal.get(Calendar.ZONE_OFFSET) + _cal.get(Calendar.DST_OFFSET);
-              String tzOffset =
-                  StringUtil.zeroPaddingNumber(offset / _millisPerHour, 2, 2);
-              outValue = outValue + "+" + tzOffset;
+
+              Calendar calendar = new GregorianCalendar();
+              calendar.setTime(date);
+              calendar.setTimeZone(timezone);
+              outValue = internalDateFormat.format(date);
+
+              int offset = calendar.get(Calendar.ZONE_OFFSET) + calendar.get(Calendar.DST_OFFSET);
+              String tzOffset = StringUtil.zeroPaddingNumber(Math.abs(offset) / _millisPerHour, 2, 2);
+
+              if (offset<0)
+                outValue = outValue + "-";
+              else
+                outValue = outValue + "+";
+              outValue = outValue + tzOffset;
             }
 
             break;
@@ -792,19 +809,20 @@ public class Database implements StorageObject {
           aValue = null;
 
           // exceptions
-          if (aField.equals("webdb_create") ||
-              aField.equals("webdb_lastchange")) {
+          if (!theEntity.hasValueForField(aField) && (
+              aField.equals("webdb_create") ||
+              aField.equals("webdb_lastchange"))) {
             aValue = "NOW()";
           }
           else {
             if ((streamedInput != null) && streamedInput.contains(aField)) {
               aValue = "?";
-            } else {
+            }
+            else {
               if (theEntity.hasValueForField(aField)) {
                 aValue =
                   "'" +
-                  JDBCStringRoutines.escapeStringLiteral((String) theEntity.getValue(
-                      aField)) + "'";
+                   JDBCStringRoutines.escapeStringLiteral((String) theEntity.getValue(aField)) + "'";
               }
             }
           }
@@ -957,10 +975,11 @@ public class Database implements StorageObject {
 
         // TimeStamp stuff
         try {
-          java.util.Date d = _dateFormatterIn.parse(dateString);
-          Timestamp tStamp = new Timestamp(d.getTime());
-          sql.append(",webdb_create='" + tStamp.toString() + "'");
-        } catch (ParseException e) {
+          java.util.Date d = userInputDateFormat.parse(dateString);
+//          Timestamp tStamp = new Timestamp(d.getTime());
+          sql.append(",webdb_create='" + JDBCStringRoutines.formatDate(d) + "'");
+        }
+        catch (ParseException e) {
           throw new StorageObjectFailure(e);
         }
       }
@@ -1050,6 +1069,42 @@ public class Database implements StorageObject {
     return (res > 0) ? true : false;
   }
 
+  /**
+   * Deletes entities based on a where clause
+   *
+   * @param aWhereClause
+   * @return
+   * @throws StorageObjectFailure
+   */
+  public int deleteByWhereClause(String aWhereClause) throws StorageObjectFailure {
+    invalidatePopupCache();
+    if (StoreUtil.implementsStorableObject(theEntityClass)) {
+      StoreContainerType stoc_type = StoreContainerType.valueOf(theEntityClass, StoreContainerType.STOC_TYPE_ENTITYLIST);
+      o_store.invalidate(stoc_type);
+    }
+
+    Statement stmt = null;
+    Connection con = null;
+    int res = 0;
+    String sql =
+      "delete from " + theTable + " where " + aWhereClause;
+
+    //theLog.printInfo("DELETE " + sql);
+    try {
+      con = getPooledCon();
+      stmt = con.createStatement();
+      res = stmt.executeUpdate(sql);
+    }
+    catch (SQLException sqe) {
+      throwSQLException(sqe, "delete");
+    }
+    finally {
+      freeConnection(con, stmt);
+    }
+
+    return res;
+  }
+
   /* noch nicht implementiert.
   * @return immer false
    */