/* * The contents of this file are subject to the Mozilla Public License Version 1.1 * (the "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at . * * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT * WARRANTY OF ANY KIND, either express or implied. See the License for the specific * language governing rights and limitations under the License. * * The Original Code is the Venice Web Communities System. * * The Initial Developer of the Original Code is Eric J. Bowersox , * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * Copyright (C) 2003 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * * Contributor(s): */ package com.silverwrist.venice.community; import java.sql.*; import java.util.*; import com.silverwrist.util.*; import com.silverwrist.dynamo.except.*; import com.silverwrist.dynamo.iface.*; import com.silverwrist.dynamo.util.*; import com.silverwrist.venice.CommunityVisibility; class CommunityOps_mysql extends CommunityOps { /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- */ private DBUtilities m_utils; // reference to utilities object private PropertySerializer m_psz; // reference to property serializer /*-------------------------------------------------------------------------------- * Constructor *-------------------------------------------------------------------------------- */ CommunityOps_mysql(DBConnectionPool pool) { super(pool); m_utils = (DBUtilities)(pool.queryService(DBUtilities.class)); m_psz = (PropertySerializer)(pool.queryService(PropertySerializer.class)); } // end constructor /*-------------------------------------------------------------------------------- * Internal operations *-------------------------------------------------------------------------------- */ private final java.util.Date touchCommunity(Connection conn, int cid, java.util.Date date) throws SQLException { PreparedStatement stmt = null; try { // prepare and execute the update statement stmt = conn.prepareStatement("UPDATE communities SET lastaccess = ?, lastupdate = ? WHERE cid = ?;"); m_utils.setDateTime(stmt,1,date); m_utils.setDateTime(stmt,2,date); stmt.setInt(3,cid); stmt.executeUpdate(); return date; } // end try finally { // make sure and close out the statement SQLUtils.shutdown(stmt); } // end finally } // end touchCommunity private final java.util.Date touchCommunity(Connection conn, int cid) throws SQLException { return this.touchCommunity(conn,cid,new java.util.Date()); } // end touchCommunity /*-------------------------------------------------------------------------------- * Overrides from class OpsBase *-------------------------------------------------------------------------------- */ public void dispose() { m_psz = null; m_utils = null; super.dispose(); } // end dispose /*-------------------------------------------------------------------------------- * Abstract implementations from class CommunityOps *-------------------------------------------------------------------------------- */ java.util.Date setCategoryID(int cid, int catid) throws DatabaseException { Connection conn = null; PreparedStatement stmt = null; Statement stmt2 = null; java.util.Date lastupd = null; try { // get a connection conn = getConnection(); // lock the table stmt2 = conn.createStatement(); stmt2.executeUpdate("LOCK TABLES communities WRITE;"); // prepare and execute the statement stmt = conn.prepareStatement("UPDATE communities SET catid = ?, lastaccess = ?, lastupdate = ? WHERE cid = ?;"); stmt.setInt(1,catid); lastupd = new java.util.Date(); m_utils.setDateTime(stmt,2,lastupd); m_utils.setDateTime(stmt,3,lastupd); stmt.setInt(4,cid); stmt.executeUpdate(); return lastupd; } // end try catch (SQLException e) { // translate to a general DatabaseException throw generalException(e); } // end catch finally { // shut everything down MySQLUtils.unlockTables(conn); SQLUtils.shutdown(stmt2); SQLUtils.shutdown(stmt); SQLUtils.shutdown(conn); } // end finally } // end setCategoryID Object getProperty(int cid, PropertyKey key) throws DatabaseException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; String rc_str = null; try { // get a connection conn = getConnection(); // look up the property stmt = conn.prepareStatement("SELECT prop_value FROM commprops WHERE cid = ? AND nsid = ? AND prop_name = ?;"); stmt.setInt(1,cid); stmt.setInt(2,key.getNamespaceID()); stmt.setString(3,key.getName()); rs = stmt.executeQuery(); if (!(rs.next())) return null; // property not found rc_str = rs.getString(1); } // end try catch (SQLException e) { // translate to a general DatabaseException throw generalException(e); } // end catch finally { // shut everything down SQLUtils.shutdown(rs); SQLUtils.shutdown(stmt); SQLUtils.shutdown(conn); } // end finally // Deserialize the property value. Object rc = m_psz.deserializeProperty(rc_str); if (rc!=null) return rc; // deserialization exception - throw it DatabaseException de = new DatabaseException(CommunityOps_mysql.class,"CommunityMessages","property.deserialize"); de.setParameter(0,key.getName()); throw de; } // end getProperty DateObjectPair setProperty(int cid, PropertyKey key, Object value) throws DatabaseException { String serialized_value = m_psz.serializeProperty(value); if (serialized_value==null) { // serialization exception - throw it DatabaseException de = new DatabaseException(CommunityOps_mysql.class,"CommunityMessages","property.serialize"); de.setParameter(0,key.getName()); throw de; } // end if String old_value = null; Connection conn = null; PreparedStatement stmt = null; Statement stmt2 = null; ResultSet rs = null; java.util.Date update = null; try { // get a connection conn = getConnection(); // lock the table stmt2 = conn.createStatement(); stmt2.executeUpdate("LOCK TABLES commprops WRITE, communities WRITE;"); // look to see if the property value is already there stmt = conn.prepareStatement("SELECT prop_value FROM commprops WHERE cid = ? AND nsid = ? AND prop_name = ?;"); stmt.setInt(1,cid); stmt.setInt(2,key.getNamespaceID()); stmt.setString(3,key.getName()); rs = stmt.executeQuery(); if (rs.next()) old_value = rs.getString(1); SQLUtils.shutdown(rs); rs = null; SQLUtils.shutdown(stmt); if (old_value!=null) { // prepare the statement to update the existing record stmt = conn.prepareStatement("UPDATE commprops SET prop_value = ? WHERE cid = ? AND nsid = ? " + "AND prop_name = ?;"); stmt.setString(1,serialized_value); stmt.setInt(2,cid); stmt.setInt(3,key.getNamespaceID()); stmt.setString(4,key.getName()); } // end if else { // prepare the statement to insert a new record stmt = conn.prepareStatement("INSERT INTO commprops (cid, nsid, prop_name, prop_value) VALUES (?, ?, ?, ?);"); stmt.setInt(1,cid); stmt.setInt(2,key.getNamespaceID()); stmt.setString(3,key.getName()); stmt.setString(4,serialized_value); } // end else stmt.executeUpdate(); // execute it! // Touch the community entry. update = touchCommunity(conn,cid); } // end try catch (SQLException e) { // translate to a general DatabaseException throw generalException(e); } // end catch finally { // shut everything down MySQLUtils.unlockTables(conn); SQLUtils.shutdown(rs); SQLUtils.shutdown(stmt); SQLUtils.shutdown(stmt2); SQLUtils.shutdown(conn); } // end finally if (old_value==null) return new DateObjectPair(null,update); // no previous value // Deserialize the property value. Object rc = m_psz.deserializeProperty(old_value); if (rc!=null) return new DateObjectPair(rc,update); // deserialization exception - throw it DatabaseException de = new DatabaseException(CommunityOps_mysql.class,"CommunityMessages","property.deserialize"); de.setParameter(0,key.getName()); throw de; } // end setProperty DateObjectPair removeProperty(int cid, PropertyKey key) throws DatabaseException { String old_value = null; Connection conn = null; PreparedStatement stmt = null; Statement stmt2 = null; ResultSet rs = null; java.util.Date update = null; try { // get a connection conn = getConnection(); // lock the table stmt2 = conn.createStatement(); stmt2.executeUpdate("LOCK TABLES commprops WRITE, communities WRITE;"); // look to see if the property value is already there stmt = conn.prepareStatement("SELECT prop_value FROM commprops WHERE cid = ? AND nsid = ? AND prop_name = ?;"); stmt.setInt(1,cid); stmt.setInt(2,key.getNamespaceID()); stmt.setString(3,key.getName()); rs = stmt.executeQuery(); if (rs.next()) old_value = rs.getString(1); else return null; // no need to remove anything SQLUtils.shutdown(rs); rs = null; SQLUtils.shutdown(stmt); // delete the database row stmt = conn.prepareStatement("DELETE FROM commprops WHERE cid = ? AND nsid = ? AND prop_name = ?;"); stmt.setInt(1,cid); stmt.setInt(2,key.getNamespaceID()); stmt.setString(3,key.getName()); stmt.executeUpdate(); // Touch the community entry. update = touchCommunity(conn,cid); } // end try catch (SQLException e) { // translate to a general DatabaseException throw generalException(e); } // end catch finally { // shut everything down MySQLUtils.unlockTables(conn); SQLUtils.shutdown(rs); SQLUtils.shutdown(stmt); SQLUtils.shutdown(stmt2); SQLUtils.shutdown(conn); } // end finally // Deserialize the property value. Object rc = m_psz.deserializeProperty(old_value); if (rc!=null) return new DateObjectPair(rc,update); // deserialization exception - throw it DatabaseException de = new DatabaseException(CommunityOps_mysql.class,"DatabaseMessages","property.deserialize"); de.setParameter(0,key.getName()); throw de; } // end removeProperty int[] getPropertyNamespaceIDs(int cid) throws DatabaseException { Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; try { // get a connection conn = getConnection(); // execute the query! stmt = conn.prepareStatement("SELECT DISTINCT nsid FROM commprops WHERE cid = ?;"); stmt.setInt(1,cid); rs = stmt.executeQuery(); // read out a list of the namespace IDs ArrayList tmp = new ArrayList(); while (rs.next()) tmp.add(new Integer(rs.getInt(1))); // create and return the array int[] rc = new int[tmp.size()]; for (int i=0; i0) return rc; // if we found any values, return them } // end try catch (SQLException e) { // translate to a general DatabaseException throw generalException(e); } // end catch finally { // shut everything down SQLUtils.shutdown(rs); SQLUtils.shutdown(stmt); SQLUtils.shutdown(conn); } // end finally return null; // nothing else found... } // end getJoinRequirement } // end class CommunityOps_mysql