/*
- * put your module comment here
+ * Copyright (C) 2001, 2002 The Mir-coders group
+ *
+ * This file is part of Mir.
+ *
+ * Mir is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Mir is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mir; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * In addition, as a special exception, The Mir-coders gives permission to link
+ * the code of this program with the com.oreilly.servlet library, any library
+ * licensed under the Apache Software License, The Sun (tm) Java Advanced
+ * Imaging library (JAI), The Sun JIMI library (or with modified versions of
+ * the above that use the same license as the above), and distribute linked
+ * combinations including the two. You must obey the GNU General Public
+ * License in all respects for all of the code used other than the above
+ * mentioned libraries. If you modify this file, you may extend this exception
+ * to your version of the file, but you are not obligated to do so. If you do
+ * not wish to do so, delete this exception statement from your version.
*/
+
package mir.storage;
import java.sql.*;
import java.lang.*;
import java.io.*;
import java.util.*;
+import java.text.SimpleDateFormat;
+import java.text.ParseException;
import freemarker.template.*;
import com.codestudio.sql.*;
import com.codestudio.util.*;
* Treiber, Host, User und Passwort, ueber den der Zugriff auf die
* Datenbank erfolgt.
*
- * @author RK
- * @version 16.7.1999
+ * @version $Revision: 1.21.2.4 $ $Date: 2002/12/20 03:01:01 $
+ * @author $Author: mh $
+ *
*/
public class Database implements StorageObject {
STORABLE_OBJECT_ENTITY_CLASS=null;
private static SimpleHash POPUP_EMTYLINE=new SimpleHash();
protected static final ObjectStore o_store=ObjectStore.getInstance();
+ 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();
+
+ private static final int _millisPerHour = 60 * 60 * 1000;
+ private static final int _millisPerMinute = 60 * 1000;
static {
// always same object saves a little space
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));
break;
case java.sql.Types.LONGVARBINARY:
outValue = rs.getString(valueIndex);
- //if (outValue != null)
- //outValue = StringUtil.encodeHtml(StringUtil.unquote(outValue));
break;
case java.sql.Types.TIMESTAMP:
- //Timestamp timestamp = (rs.getTimestamp(valueIndex));
- //jbdc drops time zone info,
- //so just get the string from
- //postgres
- String timestamp = (rs.getString(valueIndex));
- if (!rs.wasNull()) {
- outValue = timestamp;
- }
+ // it's important to use Timestamp here as getting it
+ // as a string is undefined and is only there for debugging
+ // according to the API. we can make it a string through formatting.
+ // -mh
+ Timestamp timestamp = (rs.getTimestamp(valueIndex));
+ 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;
+ }
break;
default:
outValue = "<unsupported value>";
// alle durchlaufen bis nix mehr da
theType = metadataTypes[i];
if (theType == java.sql.Types.LONGVARBINARY) {
- InputStream us = rs.getAsciiStream(i + 1);
- if (us != null) {
- InputStreamReader is = new InputStreamReader(us);
+ InputStreamReader is = (InputStreamReader)rs.getCharacterStream(i + 1);
+ if (is != null) {
char[] data = new char[32768];
StringBuffer theResultString = new StringBuffer();
int len;
if (!aField.equals(thePKeyName)) {
aValue = null;
// sonderfaelle
- if (aField.equals("webdb_create")) {
+ if (aField.equals("webdb_create") ||
+ aField.equals("webdb_lastchange")) {
aValue = "NOW()";
}
else {
}
else {
if (theEntity.hasValueForField(aField)) {
- aValue = "'" + StringUtil.quote((String)theEntity.getValue(aField))
+ aValue = "'" + StringUtil.JDBCescapeStringLiteral((String)theEntity.getValue(aField))
+ "'";
}
}
// insert into db
StringBuffer sqlBuf = new StringBuffer("insert into ").append(theTable).append("(").append(f).append(") values (").append(v).append(")");
String sql = sqlBuf.toString();
- theLog.printInfo("INSERT: " + sql);
+ //theLog.printInfo("INSERT: " + sql);
con = getPooledCon();
con.setAutoCommit(false);
pstmt = con.prepareStatement(sql);
else {
firstField = false;
}
- fv.append(aField).append("='").append(StringUtil.quote((String)theEntity.getValue(aField))).append("'");
+ fv.append(aField).append("='").append(StringUtil.JDBCescapeStringLiteral((String)theEntity.getValue(aField))).append("'");
}
}
}
if (metadataFields.contains("webdb_lastchange")) {
sql.append(",webdb_lastchange=NOW()");
}
+ // special case: the webdb_create requires the field in yyyy-mm-dd HH:mm
+ // format so anything extra will be ignored. -mh
+ if (metadataFields.contains("webdb_create") &&
+ theEntity.hasValueForField("webdb_create")) {
+ // minimum of 10 (yyyy-mm-dd)...
+ if (theEntity.getValue("webdb_create").length() >= 10) {
+ String dateString = theEntity.getValue("webdb_create");
+ // if only 10, then add 00:00 so it doesn't throw a ParseException
+ if (dateString.length() == 10)
+ dateString=dateString+" 00:00";
+
+ // 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) {
+ throw new StorageObjectException(e.toString());
+ }
+ }
+ }
if (streamedInput != null) {
for (int i = 0; i < streamedInput.size(); i++) {
sql.append(",").append(streamedInput.get(i)).append("=?");
}
}
sql.append(" where id=").append(id);
- theLog.printInfo("UPDATE: " + sql);
+ //theLog.printInfo("UPDATE: " + sql);
// execute sql
try {
con = getPooledCon();
Statement stmt = null; Connection con = null;
int res = 0;
String sql="delete from "+theTable+" where "+thePKeyName+"='"+id+"'";
- theLog.printInfo("DELETE " + sql);
+ //theLog.printInfo("DELETE " + sql);
try {
con = getPooledCon(); stmt = con.createStatement();
res = stmt.executeUpdate(sql);
freeConnection(con,stmt);
}
//theLog.printInfo(theTable + " has "+ result +" rows where " + where);
- theLog.printInfo((System.currentTimeMillis() - startTime) + "ms. for: "
- + sql);
+ //theLog.printInfo((System.currentTimeMillis() - startTime) + "ms. for: " + sql);
return result;
}
try
{
rs = stmt.executeUpdate(sql);
- theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: "
- + sql);
+ //theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " + sql);
}
catch (SQLException e)
{
result = pstmt.executeUpdate();
}
catch (Exception e) {
- theLog.printDebugInfo("settimage :: setImage gescheitert: "+e.toString());
+ theLog.printDebugInfo("executeUpdate failed: "+e.toString());
throw new StorageObjectException("executeUpdate failed: "+e.toString());
}
finally { freeConnection(con,pstmt); }
- theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: "
- + sql);
+ //theLog.printInfo((new java.util.Date().getTime() - startTime) + "ms. for: " + sql);
return result;
}
try {
con = getPooledCon();
pstmt = con.prepareStatement(sql);
- theLog.printInfo("METADATA: " + sql);
+ //theLog.printInfo("METADATA: " + sql);
ResultSet rs = pstmt.executeQuery();
evalMetaData(rs.getMetaData());
rs.close();