Return-Path: Delivered-To: apmail-incubator-connectors-commits-archive@minotaur.apache.org Received: (qmail 61898 invoked from network); 2 Jun 2010 02:41:06 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 2 Jun 2010 02:41:06 -0000 Received: (qmail 41392 invoked by uid 500); 2 Jun 2010 02:41:05 -0000 Delivered-To: apmail-incubator-connectors-commits-archive@incubator.apache.org Received: (qmail 41348 invoked by uid 500); 2 Jun 2010 02:41:05 -0000 Mailing-List: contact connectors-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: connectors-dev@incubator.apache.org Delivered-To: mailing list connectors-commits@incubator.apache.org Received: (qmail 41341 invoked by uid 99); 2 Jun 2010 02:41:04 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 Jun 2010 02:41:04 +0000 X-ASF-Spam-Status: No, hits=-1999.7 required=10.0 tests=ALL_TRUSTED,AWL,FILL_THIS_FORM_FRAUD_PHISH,T_FILL_THIS_FORM_SHORT,WEIRD_QUOTING X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 Jun 2010 02:41:02 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id D4748238890B; Wed, 2 Jun 2010 02:40:42 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r950342 - in /incubator/lcf/trunk/modules/framework: core/org/apache/lcf/core/database/ core/org/apache/lcf/core/interfaces/ pull-agent/org/apache/lcf/crawler/jobs/ pull-agent/org/apache/lcf/crawler/repository/ Date: Wed, 02 Jun 2010 02:40:42 -0000 To: connectors-commits@incubator.apache.org From: kwright@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100602024042.D4748238890B@eris.apache.org> Author: kwright Date: Wed Jun 2 02:40:42 2010 New Revision: 950342 URL: http://svn.apache.org/viewvc?rev=950342&view=rev Log: Revamp database layer to allow abstraction of transactions, and change the schema so that Derby's keywords don't blow up install. Removed: incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/interfaces/DatabaseFactory.java incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/interfaces/IDatabase.java Modified: incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceDerby.java incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceMySQL.java incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfacePostgreSQL.java incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/Database.java incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/jobs/ScheduleManager.java incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/repository/ThrottleSpecManager.java Modified: incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceDerby.java URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceDerby.java?rev=950342&r1=950341&r2=950342&view=diff ============================================================================== --- incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceDerby.java (original) +++ incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceDerby.java Wed Jun 2 02:40:42 2010 @@ -23,15 +23,13 @@ import org.apache.lcf.core.system.Loggin import java.util.*; import java.io.*; -public class DBInterfaceDerby implements IDBInterface +public class DBInterfaceDerby extends Database implements IDBInterface { public static final String _rcsid = "@(#)$Id$"; protected final static String _url = "jdbc:derby:"; protected final static String _driver = "org.apache.derby.jdbc.EmbeddedDriver"; - protected IThreadContext context; - protected IDatabase database; protected String userName; protected String password; @@ -43,31 +41,12 @@ public class DBInterfaceDerby implements public DBInterfaceDerby(IThreadContext tc, String databaseName, String userName, String password) throws LCFException { - this.context = tc; - if (databaseName == null) - databaseName = "default"; - database = DatabaseFactory.make(tc,_url+databaseName+";create=true;user="+userName+";password="+password,_driver,databaseName,userName,password); - cacheKey = CacheKeyFactory.makeDatabaseKey(databaseName); + super(tc,_url+((databaseName==null)?"default":databaseName)+";create=true;user="+userName+";password="+password,_driver,((databaseName==null)?"default":databaseName),userName,password); + cacheKey = CacheKeyFactory.makeDatabaseKey(this.databaseName); this.userName = userName; this.password = password; } - /** Get the database name. - *@return the database name. - */ - public String getDatabaseName() - { - return database.getDatabaseName(); - } - - /** Get the current transaction id. - *@return the current transaction identifier, or null if no transaction. - */ - public String getTransactionID() - { - return database.getTransactionID(); - } - /** Get the database general cache key. *@return the general cache key for the database. */ @@ -483,7 +462,7 @@ public class DBInterfaceDerby implements public boolean lookupUser(String userName, StringSet cacheKeys, String queryClass) throws LCFException { - IDatabase rootDatabase = DatabaseFactory.make(context,_url+database.getDatabaseName()+";create=true",_driver,database.getDatabaseName(),"",""); + Database rootDatabase = new Database(context,_url+databaseName+";create=true",_driver,databaseName,"",""); IResultSet set = rootDatabase.executeQuery("VALUES SYSCS_UTIL.SYSCS_GET_DATABASE_PROPERTY('derby.user."+userName+"')",null,cacheKeys,null,queryClass,true,-1,null,null); if (set.getRowCount() == 0) return false; @@ -497,7 +476,7 @@ public class DBInterfaceDerby implements public void performCreateUser(String userName, String password) throws LCFException { - IDatabase rootDatabase = DatabaseFactory.make(context,_url+database.getDatabaseName()+";create=true",_driver,database.getDatabaseName(),"",""); + Database rootDatabase = new Database(context,_url+databaseName+";create=true",_driver,databaseName,"",""); rootDatabase.executeQuery("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.user."+userName+"', '"+password+"')",null,null,null,null,false,0,null,null); rootDatabase.executeQuery("CREATE SCHEMA "+userName+" AUTHORIZATION "+userName,null,null,null,null,false,0,null,null); } @@ -508,7 +487,7 @@ public class DBInterfaceDerby implements public void performDropUser(String userName) throws LCFException { - IDatabase rootDatabase = DatabaseFactory.make(context,_url+database.getDatabaseName()+";create=true",_driver,database.getDatabaseName(),"",""); + Database rootDatabase = new Database(context,_url+databaseName+";create=true",_driver,databaseName,"",""); rootDatabase.executeQuery("DROP SCHEMA "+userName+" RESTRICT",null,null,null,null,false,0,null,null); rootDatabase.executeQuery("CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.user."+userName+"', null)",null,null,null,null,false,0,null,null); } @@ -611,7 +590,7 @@ public class DBInterfaceDerby implements { try { - database.executeQuery(query,params,null,invalidateKeys,null,false,0,null,null); + executeQuery(query,params,null,invalidateKeys,null,false,0,null,null); } catch (LCFException e) { @@ -629,9 +608,9 @@ public class DBInterfaceDerby implements public Map getTableSchema(String tableName, StringSet cacheKeys, String queryClass) throws LCFException { - String query = "SELECT t0.columnname,t0.columndatatype FROM sys.syscolumns t0, sys.systables t1 WHERE t0.referenceid=t1.tableid AND CAST(t1.tablename AS VARCHAR(128))=? ORDER BY t0.columnnumber ASC"; + String query = "SELECT CAST(t0.columnname AS VARCHAR(128)) AS columnname,CAST(t0.columndatatype AS VARCHAR(128)) AS columndatatype FROM sys.syscolumns t0, sys.systables t1 WHERE t0.referenceid=t1.tableid AND CAST(t1.tablename AS VARCHAR(128))=? ORDER BY t0.columnnumber ASC"; ArrayList list = new ArrayList(); - list.add(tableName); + list.add(tableName.toUpperCase()); IResultSet set = performQuery(query,list,cacheKeys,queryClass); if (set.getRowCount() == 0) @@ -642,8 +621,8 @@ public class DBInterfaceDerby implements while (i < set.getRowCount()) { IResultRow row = set.getRow(i++); - String fieldName = row.getValue("columnname").toString(); - String type = row.getValue("columndatatype").toString(); + String fieldName = (String)row.getValue("columnname"); + String type = (String)row.getValue("columndatatype"); boolean isNull = false; boolean isPrimaryKey = false; rval.put(fieldName,new ColumnDescription(type,isPrimaryKey,isNull,null,null,false)); @@ -720,7 +699,7 @@ public class DBInterfaceDerby implements { try { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null); + return executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null); } catch (LCFException e) { @@ -744,7 +723,7 @@ public class DBInterfaceDerby implements { try { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit); + return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit); } catch (LCFException e) { @@ -769,7 +748,7 @@ public class DBInterfaceDerby implements { try { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit); + return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit); } catch (LCFException e) { @@ -848,7 +827,7 @@ public class DBInterfaceDerby implements public void beginTransaction(int transactionType) throws LCFException { - if (database.getCurrentTransactionType() == database.TRANSACTION_SERIALIZED) + if (getCurrentTransactionType() == TRANSACTION_SERIALIZED) { serializableDepth++; return; @@ -856,18 +835,7 @@ public class DBInterfaceDerby implements if (transactionType == TRANSACTION_ENCLOSING) { - int enclosingTransactionType = database.getCurrentTransactionType(); - switch (enclosingTransactionType) - { - case IDatabase.TRANSACTION_READCOMMITTED: - transactionType = TRANSACTION_READCOMMITTED; - break; - case IDatabase.TRANSACTION_SERIALIZED: - transactionType = TRANSACTION_SERIALIZED; - break; - default: - throw new LCFException("Unknown transaction type"); - } + transactionType = super.getCurrentTransactionType(); } switch (transactionType) @@ -875,40 +843,40 @@ public class DBInterfaceDerby implements case TRANSACTION_READCOMMITTED: try { - performModification("SET ISOLATION READ COMMITTED",null,null); + executeViaThread(connection,"SET ISOLATION READ COMMITTED",null,false,0,null,null); } catch (Error e) { - database.signalRollback(); - database.endTransaction(); + super.signalRollback(); + super.endTransaction(); throw e; } catch (LCFException e) { - database.signalRollback(); - database.endTransaction(); + super.signalRollback(); + super.endTransaction(); throw e; } - database.beginTransaction(database.TRANSACTION_READCOMMITTED); + super.beginTransaction(TRANSACTION_READCOMMITTED); break; case TRANSACTION_SERIALIZED: try { - performModification("SET ISOLATION SERIALIZABLE",null,null); + executeViaThread(connection,"SET ISOLATION SERIALIZABLE",null,false,0,null,null); } catch (Error e) { - database.signalRollback(); - database.endTransaction(); + super.signalRollback(); + super.endTransaction(); throw e; } catch (LCFException e) { - database.signalRollback(); - database.endTransaction(); + super.signalRollback(); + super.endTransaction(); throw e; } - database.beginTransaction(database.TRANSACTION_SERIALIZED); + super.beginTransaction(TRANSACTION_SERIALIZED); break; default: throw new LCFException("Bad transaction type"); @@ -920,7 +888,7 @@ public class DBInterfaceDerby implements public void signalRollback() { if (serializableDepth == 0) - database.signalRollback(); + super.signalRollback(); } /** End a database transaction, either performing a commit or a rollback (depending on whether @@ -935,7 +903,77 @@ public class DBInterfaceDerby implements return; } - database.endTransaction(); + super.endTransaction(); + } + + int depthCount = 0; + boolean inTransaction = false; + + /** Abstract method to start a transaction */ + protected void startATransaction() + throws LCFException + { + if (!inTransaction) + { + try + { + connection.setAutoCommit(false); + } + catch (java.sql.SQLException e) + { + throw new LCFException(e.getMessage(),e); + } + inTransaction = true; + } + depthCount++; + } + + /** Abstract method to commit a transaction */ + protected void commitCurrentTransaction() + throws LCFException + { + if (inTransaction) + { + depthCount--; + if (depthCount == 0) + { + try + { + connection.commit(); + } + catch (java.sql.SQLException e) + { + throw new LCFException(e.getMessage(),e); + } + inTransaction = false; + } + } + else + throw new LCFException("Transaction nesting error!"); + } + + /** Abstract method to roll back a transaction */ + protected void rollbackCurrentTransaction() + throws LCFException + { + if (inTransaction) + { + depthCount--; + if (depthCount == 0) + { + try + { + connection.rollback(); + } + catch (java.sql.SQLException e) + { + throw new LCFException(e.getMessage(),e); + } + inTransaction = false; + } + } + else + throw new LCFException("Transaction nesting error!"); } Modified: incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceMySQL.java URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceMySQL.java?rev=950342&r1=950341&r2=950342&view=diff ============================================================================== --- incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceMySQL.java (original) +++ incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfaceMySQL.java Wed Jun 2 02:40:42 2010 @@ -21,7 +21,7 @@ package org.apache.lcf.core.database; import org.apache.lcf.core.interfaces.*; import java.util.*; -public class DBInterfaceMySQL implements IDBInterface +public class DBInterfaceMySQL extends Database implements IDBInterface { public static final String _rcsid = "@(#)$Id$"; @@ -29,33 +29,13 @@ public class DBInterfaceMySQL implements private static final String _driver = "org.gjt.mm.mysql.Driver"; protected IThreadContext context; - protected IDatabase database; protected String cacheKey; public DBInterfaceMySQL(IThreadContext tc, String databaseName, String userName, String password) throws LCFException { - this.context = tc; - if (databaseName == null) - databaseName = "mysql"; - database = DatabaseFactory.make(tc,_url+databaseName,_driver,databaseName,userName,password); - cacheKey = CacheKeyFactory.makeDatabaseKey(databaseName); - } - - /** Get the database name. - *@return the database name. - */ - public String getDatabaseName() - { - return database.getDatabaseName(); - } - - /** Get the current transaction id. - *@return the current transaction identifier, or null if no transaction. - */ - public String getTransactionID() - { - return database.getTransactionID(); + super(tc,_url+databaseName,_driver,(databaseName==null)?"mysql":databaseName,userName,password); + cacheKey = CacheKeyFactory.makeDatabaseKey(this.databaseName); } /** Get the database general cache key. @@ -477,7 +457,7 @@ public class DBInterfaceMySQL implements public void performModification(String query, ArrayList params, StringSet invalidateKeys) throws LCFException { - database.executeQuery(query,params,null,invalidateKeys,null,false,0,null,null); + executeQuery(query,params,null,invalidateKeys,null,false,0,null,null); } /** Get a table's schema. @@ -529,7 +509,7 @@ public class DBInterfaceMySQL implements { IResultSet set = performQuery("SHOW TABLES",null,cacheKeys,queryClass); StringSetBuffer ssb = new StringSetBuffer(); - String columnName = "Tables_in_"+database.getDatabaseName().toLowerCase(); + String columnName = "Tables_in_"+databaseName.toLowerCase(); // System.out.println(columnName); int i = 0; @@ -556,7 +536,7 @@ public class DBInterfaceMySQL implements public IResultSet performQuery(String query, ArrayList params, StringSet cacheKeys, String queryClass) throws LCFException { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null); + return executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null); } /** Perform a general "data fetch" query. @@ -573,7 +553,7 @@ public class DBInterfaceMySQL implements int maxResults, ILimitChecker returnLimit) throws LCFException { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit); + return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit); } /** Perform a general "data fetch" query. @@ -591,7 +571,7 @@ public class DBInterfaceMySQL implements int maxResults, ResultSpecification resultSpec, ILimitChecker returnLimit) throws LCFException { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit); + return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit); } /** Quote a sql string. @@ -650,7 +630,7 @@ public class DBInterfaceMySQL implements public void beginTransaction() throws LCFException { - database.beginTransaction(database.TRANSACTION_READCOMMITTED); + super.beginTransaction(TRANSACTION_READCOMMITTED); } /** Begin a database transaction. This method call MUST be paired with an endTransaction() call, @@ -665,25 +645,29 @@ public class DBInterfaceMySQL implements public void beginTransaction(int transactionType) throws LCFException { - database.beginTransaction(database.TRANSACTION_READCOMMITTED); + super.beginTransaction(TRANSACTION_READCOMMITTED); } - /** Signal that a rollback should occur on the next endTransaction(). - */ - public void signalRollback() + /** Abstract method to start a transaction */ + protected void startATransaction() + throws LCFException { - database.signalRollback(); + executeViaThread(connection,"START TRANSACTION",null,false,0,null,null); } - /** End a database transaction, either performing a commit or a rollback (depending on whether - * signalRollback() was called within the transaction). - */ - public void endTransaction() + /** Abstract method to commit a transaction */ + protected void commitCurrentTransaction() throws LCFException { - database.endTransaction(); + executeViaThread(connection,"COMMIT",null,false,0,null,null); + } + + /** Abstract method to roll back a transaction */ + protected void rollbackCurrentTransaction() + throws LCFException + { + executeViaThread(connection,"ROLLBACK",null,false,0,null,null); } - } Modified: incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfacePostgreSQL.java URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfacePostgreSQL.java?rev=950342&r1=950341&r2=950342&view=diff ============================================================================== --- incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfacePostgreSQL.java (original) +++ incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/DBInterfacePostgreSQL.java Wed Jun 2 02:40:42 2010 @@ -22,17 +22,13 @@ import org.apache.lcf.core.interfaces.*; import org.apache.lcf.core.system.Logging; import java.util.*; -public class DBInterfacePostgreSQL implements IDBInterface +public class DBInterfacePostgreSQL extends Database implements IDBInterface { public static final String _rcsid = "@(#)$Id$"; private static final String _url = "jdbc:postgresql://localhost/"; - // private static final String _url = "jdbc:mysql://localhost/"; private static final String _driver = "org.postgresql.Driver"; - // private static final String _driver = "org.gjt.mm.mysql.Driver"; - protected IThreadContext context; - protected IDatabase database; protected String cacheKey; // Postgresql serializable transactions are broken in that transactions that occur within them do not in fact work properly. // So, once we enter the serializable realm, STOP any additional transactions from doing anything at all. @@ -47,27 +43,8 @@ public class DBInterfacePostgreSQL imple public DBInterfacePostgreSQL(IThreadContext tc, String databaseName, String userName, String password) throws LCFException { - this.context = tc; - if (databaseName == null) - databaseName = "template1"; - database = DatabaseFactory.make(tc,_url+databaseName,_driver,databaseName,userName,password); - cacheKey = CacheKeyFactory.makeDatabaseKey(databaseName); - } - - /** Get the database name. - *@return the database name. - */ - public String getDatabaseName() - { - return database.getDatabaseName(); - } - - /** Get the current transaction id. - *@return the current transaction identifier, or null if no transaction. - */ - public String getTransactionID() - { - return database.getTransactionID(); + super(tc,_url+((databaseName==null)?"template1":databaseName),_driver,((databaseName==null)?"template1":databaseName),userName,password); + cacheKey = CacheKeyFactory.makeDatabaseKey(this.databaseName); } /** Get the database general cache key. @@ -599,7 +576,7 @@ public class DBInterfacePostgreSQL imple { try { - database.executeQuery(query,params,null,invalidateKeys,null,false,0,null,null); + executeQuery(query,params,null,invalidateKeys,null,false,0,null,null); } catch (LCFException e) { @@ -767,7 +744,7 @@ public class DBInterfacePostgreSQL imple { try { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null); + return executeQuery(query,params,cacheKeys,null,queryClass,true,-1,null,null); } catch (LCFException e) { @@ -791,7 +768,7 @@ public class DBInterfacePostgreSQL imple { try { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit); + return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,null,returnLimit); } catch (LCFException e) { @@ -816,7 +793,7 @@ public class DBInterfacePostgreSQL imple { try { - return database.executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit); + return executeQuery(query,params,cacheKeys,null,queryClass,true,maxResults,resultSpec,returnLimit); } catch (LCFException e) { @@ -880,7 +857,7 @@ public class DBInterfacePostgreSQL imple public void beginTransaction() throws LCFException { - beginTransaction(TRANSACTION_ENCLOSING); + super.beginTransaction(TRANSACTION_ENCLOSING); } /** Begin a database transaction. This method call MUST be paired with an endTransaction() call, @@ -895,7 +872,7 @@ public class DBInterfacePostgreSQL imple public void beginTransaction(int transactionType) throws LCFException { - if (database.getCurrentTransactionType() == database.TRANSACTION_SERIALIZED) + if (getCurrentTransactionType() == TRANSACTION_SERIALIZED) { serializableDepth++; return; @@ -903,41 +880,30 @@ public class DBInterfacePostgreSQL imple if (transactionType == TRANSACTION_ENCLOSING) { - int enclosingTransactionType = database.getCurrentTransactionType(); - switch (enclosingTransactionType) - { - case IDatabase.TRANSACTION_READCOMMITTED: - transactionType = TRANSACTION_READCOMMITTED; - break; - case IDatabase.TRANSACTION_SERIALIZED: - transactionType = TRANSACTION_SERIALIZED; - break; - default: - throw new LCFException("Unknown transaction type"); - } + transactionType = getCurrentTransactionType(); } switch (transactionType) { case TRANSACTION_READCOMMITTED: - database.beginTransaction(database.TRANSACTION_READCOMMITTED); + super.beginTransaction(TRANSACTION_READCOMMITTED); break; case TRANSACTION_SERIALIZED: - database.beginTransaction(database.TRANSACTION_SERIALIZED); + super.beginTransaction(TRANSACTION_SERIALIZED); try { performModification("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE",null,null); } catch (Error e) { - database.signalRollback(); - database.endTransaction(); + super.signalRollback(); + super.endTransaction(); throw e; } catch (LCFException e) { - database.signalRollback(); - database.endTransaction(); + super.signalRollback(); + super.endTransaction(); throw e; } break; @@ -951,7 +917,7 @@ public class DBInterfacePostgreSQL imple public void signalRollback() { if (serializableDepth == 0) - database.signalRollback(); + super.signalRollback(); } /** End a database transaction, either performing a commit or a rollback (depending on whether @@ -966,7 +932,7 @@ public class DBInterfacePostgreSQL imple return; } - database.endTransaction(); + super.endTransaction(); if (getTransactionID() == null) { int i = 0; @@ -984,6 +950,43 @@ public class DBInterfacePostgreSQL imple } } + /** Abstract method to start a transaction */ + protected void startATransaction() + throws LCFException + { + executeViaThread(connection,"START TRANSACTION",null,false,0,null,null); + } + + /** Abstract method to commit a transaction */ + protected void commitCurrentTransaction() + throws LCFException + { + executeViaThread(connection,"COMMIT",null,false,0,null,null); + } + + /** Abstract method to roll back a transaction */ + protected void rollbackCurrentTransaction() + throws LCFException + { + executeViaThread(connection,"ROLLBACK",null,false,0,null,null); + } + + /** Abstract method for explaining a query */ + protected void explainQuery(String query, ArrayList params) + throws LCFException + { + IResultSet x = executeUncachedQuery("EXPLAIN "+query,params,true, + -1,null,null); + int k = 0; + while (k < x.getRowCount()) + { + IResultRow row = x.getRow(k++); + Iterator iter = row.getColumns(); + String colName = (String)iter.next(); + Logging.db.warn(" Plan: "+row.getValue(colName).toString()); + } + Logging.db.warn(""); + } } Modified: incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/Database.java URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/Database.java?rev=950342&r1=950341&r2=950342&view=diff ============================================================================== --- incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/Database.java (original) +++ incubator/lcf/trunk/modules/framework/core/org/apache/lcf/core/database/Database.java Wed Jun 2 02:40:42 2010 @@ -32,7 +32,7 @@ import javax.sql.*; * the transaction management will get screwed up (i.e. nobody will know what happened to the connection * handles...) */ -public class Database implements IDatabase +public class Database { public static final String _rcsid = "@(#)$Id$"; @@ -49,9 +49,6 @@ public class Database implements IDataba protected int delayedTransactionDepth = 0; protected final static String _TRANSACTION_ = "_TRANSACTION_"; - protected final static String BEGIN_TRANSACTION = "START TRANSACTION"; - protected final static String END_TRANSACTION = "COMMIT"; - protected final static String ROLLBACK_TRANSACTION = "ROLLBACK"; public Database(IThreadContext context, String jdbcUrl, String jdbcDriverClass, String databaseName, String userName, String password) throws LCFException @@ -83,6 +80,30 @@ public class Database implements IDataba return th.getTransactionID(); } + /** Abstract method to start a transaction */ + protected void startATransaction() + throws LCFException + { + } + + /** Abstract method to commit a transaction */ + protected void commitCurrentTransaction() + throws LCFException + { + } + + /** Abstract method to roll back a transaction */ + protected void rollbackCurrentTransaction() + throws LCFException + { + } + + /** Abstract method for explaining a query */ + protected void explainQuery(String query, ArrayList params) + throws LCFException + { + } + /** Execute arbitrary database query, and optionally cache the result. Cached results are * returned for this operation if they are valid and appropriate. Note that any cached results * returned were only guaranteed to be pertinent at the time the cached result was obtained; the @@ -148,7 +169,7 @@ public class Database implements IDataba public int getCurrentTransactionType() { if (th == null) - return TRANSACTION_READCOMMITTED; + return IDBInterface.TRANSACTION_READCOMMITTED; return th.getTransactionType(); } @@ -204,16 +225,15 @@ public class Database implements IDataba try { // Start a transaction - executeViaThread(connection,BEGIN_TRANSACTION,null,false,0,null,null); - } - catch (InterruptedException e) - { - // Don't do anything else other than drop the connection on the floor - connection = null; - throw new LCFException("Interrupted: "+e.getMessage(),e,LCFException.INTERRUPTED); + startATransaction(); } catch (LCFException e) { + if (e.getErrorCode() == LCFException.INTERRUPTED) + { + connection = null; + throw e; + } ConnectionFactory.releaseConnection(connection); connection = null; throw e; @@ -229,13 +249,16 @@ public class Database implements IDataba { try { - executeViaThread(connection,BEGIN_TRANSACTION,null,false,0,null,null); + startATransaction(); } - catch (InterruptedException e) + catch (LCFException e) { - // Don't do anything else other than drop the connection on the floor - connection = null; - throw new LCFException("Interrupted: "+e.getMessage(),e,LCFException.INTERRUPTED); + if (e.getErrorCode() == LCFException.INTERRUPTED) + { + // Don't do anything else other than drop the connection on the floor + connection = null; + } + throw e; } } } @@ -275,20 +298,23 @@ public class Database implements IDataba { // Do a rollback in the database, and blow away cached queries (cached against the // database transaction key). - executeViaThread(connection,ROLLBACK_TRANSACTION,null,false,0,null,null); + rollbackCurrentTransaction(); } else { // Do a commit into the database, and blow away cached queries (cached against the // database transaction key). - executeViaThread(connection,END_TRANSACTION,null,false,0,null,null); + commitCurrentTransaction(); } } - catch (InterruptedException e) + catch (LCFException e) { - // Drop the connection on the floor, so it cannot be reused. - connection = null; - throw new LCFException("Interrupted: "+e.getMessage(),e,LCFException.INTERRUPTED); + if (e.getErrorCode() == LCFException.INTERRUPTED) + { + // Drop the connection on the floor, so it cannot be reused. + connection = null; + } + throw e; } finally { @@ -368,7 +394,7 @@ public class Database implements IDataba /** Do query execution via a subthread, so the primary thread can be interrupted */ protected IResultSet executeViaThread(Connection connection, String query, ArrayList params, boolean bResults, int maxResults, ResultSpecification spec, ILimitChecker returnLimit) - throws LCFException, InterruptedException + throws LCFException { if (connection == null) // This probably means that the thread was interrupted and the connection was abandoned. Just return null. @@ -397,7 +423,7 @@ public class Database implements IDataba { t.interrupt(); // We need the caller to abandon any connections left around, so rethrow in a way that forces them to process the event properly. - throw e; + throw new LCFException(e.getMessage(),e,LCFException.INTERRUPTED); } } @@ -416,11 +442,12 @@ public class Database implements IDataba { return executeViaThread(connection,query,params,bResults,maxResults,spec,returnLimit); } - catch (InterruptedException e) + catch (LCFException e) { - // drop the connection object on the floor, so it cannot possibly be reused - connection = null; - throw new LCFException("Interrupted: "+e.getMessage(),e,LCFException.INTERRUPTED); + if (e.getErrorCode() == LCFException.INTERRUPTED) + // drop the connection object on the floor, so it cannot possibly be reused + connection = null; + throw e; } } else @@ -431,11 +458,12 @@ public class Database implements IDataba { return executeViaThread(tempConnection,query,params,bResults,maxResults,spec,returnLimit); } - catch (InterruptedException e) + catch (LCFException e) { - // drop the connection object on the floor, so it cannot possibly be reused - tempConnection = null; - throw new LCFException("Interrupted: "+e.getMessage(),e,LCFException.INTERRUPTED); + if (e.getErrorCode() == LCFException.INTERRUPTED) + // drop the connection object on the floor, so it cannot possibly be reused + tempConnection = null; + throw e; } finally { @@ -1054,17 +1082,7 @@ public class Database implements IDataba } try { - IResultSet x = database.executeUncachedQuery("EXPLAIN "+description.getQuery(),description.getParameters(),true, - -1,null,null); - int k = 0; - while (k < x.getRowCount()) - { - IResultRow row = x.getRow(k++); - Iterator iter = row.getColumns(); - String colName = (String)iter.next(); - Logging.db.warn(" Plan: "+row.getValue(colName).toString()); - } - Logging.db.warn(""); + database.explainQuery(description.getQuery(),description.getParameters()); } catch (LCFException e) { Modified: incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/jobs/ScheduleManager.java URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/jobs/ScheduleManager.java?rev=950342&r1=950341&r2=950342&view=diff ============================================================================== --- incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/jobs/ScheduleManager.java (original) +++ incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/jobs/ScheduleManager.java Wed Jun 2 02:40:42 2010 @@ -36,7 +36,7 @@ public class ScheduleManager extends org public final static String dayOfWeekField = "dayofweek"; public final static String dayOfMonthField = "dayofmonth"; public final static String monthOfYearField = "monthofyear"; - public final static String yearField = "year"; + public final static String yearField = "yearlist"; public final static String hourOfDayField = "hourofday"; public final static String minutesOfHourField = "minutesofhour"; public final static String timezoneField = "timezone"; @@ -82,6 +82,18 @@ public class ScheduleManager extends org else { // Upgrade code goes here, if needed. + if (existing.get(yearField) == null) + { + // Need to rename the "year" column as the "yearlist" column. + HashMap map = new HashMap(); + map.put(yearField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false)); + performAlter(map,null,null,null); + performModification("UPDATE "+getTableName()+" SET ("+yearField+"=year)",null,null); + ArrayList list = new ArrayList(); + list.add("year"); + performAlter(null,null,list,null); + + } } // Index management Modified: incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/repository/ThrottleSpecManager.java URL: http://svn.apache.org/viewvc/incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/repository/ThrottleSpecManager.java?rev=950342&r1=950341&r2=950342&view=diff ============================================================================== --- incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/repository/ThrottleSpecManager.java (original) +++ incubator/lcf/trunk/modules/framework/pull-agent/org/apache/lcf/crawler/repository/ThrottleSpecManager.java Wed Jun 2 02:40:42 2010 @@ -34,7 +34,7 @@ public class ThrottleSpecManager extends // Schema public final static String ownerNameField = "ownername"; public final static String descriptionField = "description"; - public final static String matchField = "match"; + public final static String matchField = "matchstring"; public final static String throttleField = "throttle"; /** Constructor. @@ -69,6 +69,17 @@ public class ThrottleSpecManager extends else { // Upgrade code goes here, if needed. + if (existing.get(matchField) == null) + { + // Need to rename the "match" column as the "matchstring" column. + HashMap map = new HashMap(); + map.put(matchField,new ColumnDescription("VARCHAR(255)",false,true,null,null,false)); + performAlter(map,null,null,null); + performModification("UPDATE "+getTableName()+" SET ("+matchField+"=match)",null,null); + ArrayList list = new ArrayList(); + list.add("match"); + performAlter(null,null,list,null); + } } // Index management