db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Peter Ondruška <peter.ondru...@gmail.com>
Subject Re: cleaning database between test cases
Date Sat, 20 Mar 2010 12:13:04 GMT
IMHO your deleteDir method is not deleting anything. See
http://java.sun.com/j2se/1.4.2/docs/api/java/io/File.html#delete()

It should be something like:

void delete(File f){
  if (f.isDirectory())
    for (File sf: f.listFiles()) delete(sf);
  f.delete();
}

On Sat, Mar 20, 2010 at 1:05 PM, Gabriele Kahlout
<gabriele@mysimpatico.com> wrote:
> any updates? This is bogging me down.
>
> 2010/3/19, Gabriele Kahlout <gabriele@mysimpatico.com>:
>> Here is the code for wrapper methods that might be incorrect:
>>
>>  public final static Connection connectToDerby(final File parentPath,
>> final boolean create) throws InstantiationException,
>> IllegalAccessException, ClassNotFoundException, SQLException {
>>         //  Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
>>         final Connection con =
>> DriverManager.getConnection("jdbc:derby:" + parentPath.getPath() +
>> File.separator + "db.sqlwrapper;create=" + create);
>>         return con;
>>     }
>>
>> public static boolean shutDownDerby() {
>>         try {
>>             Connection con = connectToDerby();
>>             con.close();
>>             con =
>> DriverManager.getConnection("jdbc:derby:db.sqlwrapper;shutdown=true");
>>
>>         } catch (SQLException e) { // with throw exception on
>> successful deletion.
>>             return true;
>>         }
>>         return false;
>>     }
>>
>> 2010/3/19, Gabriele Kahlout <gabriele@mysimpatico.com>:
>>> Here is the shortest test that shows the problem:
>>>
>>> import com.mysimpatico.sqlwrapper.*;
>>> import java.io.File;
>>> import java.sql.*;
>>>
>>> /*
>>>  * To change this template, choose Tools | Templates
>>>  * and open the template in the editor.
>>>  */
>>> /**
>>>  *
>>>  * @author simpatico
>>>  */
>>> public class DbDeletionTest {
>>>
>>>     public static boolean deleteDir(File dir) {
>>>         if (dir.isDirectory()) {
>>>             String[] children = dir.list();
>>>             for (int i = 0; i < children.length; i++) {
>>>                 boolean success = deleteDir(new File(dir, children[i]));
>>>                 if (!success) {
>>>                     return false;
>>>                 }
>>>             } // The directory is now empty so delete it return
>>> dir.delete(); }
>>>         }
>>>         return dir.delete();
>>>     }
>>>
>>>     public static void test() throws Exception {
>>>         final File dir = new File("test");
>>>         dir.mkdir();
>>>         final Connection con = SqlWrapper.connectToDerby(dir, true);
>>>         final Statement st = con.createStatement();
>>>         SqlWrapper.setVendor(SqlWrapper.vendor.JAVADB);
>>>
>>>         final String expTableName = "Expressions";
>>>         final String exp = "expression";
>>>         final ReferencedColumn expColumn = new ReferencedColumn(exp,
>>> SqlWrapper.VARCHAR, 100);
>>>         final Table expTable = new Table(expTableName, expColumn,
>>> expColumn);
>>>         st.executeUpdate(SqlWrapper.create(expTable));
>>>         con.close();
>>>         SqlWrapper.shutDownDerby();
>>>         deleteDir(dir);
>>>         System.out.println("test executed.");
>>>
>>>     }
>>>
>>>     public static void main(String[] args) {
>>>         try {
>>>             test();
>>>             test();
>>>         }
>>>             catch (Exception e) {
>>>             e.printStackTrace();
>>>         }
>>>     }
>>> }
>>> The libraries needed are: derby.jar, SqlWrapper.jar (just wraps around
>>> sql statements, u can replace it with sql strings).
>>> http://memorizeasy.googlecode.com/svn/tags/live/lib/derby.jar
>>> http://memorizeasy.googlecode.com/svn/tags/live/lib/sqlwrapper.jar
>>>
>>> The output is:
>>> test executed.
>>> Shutting down due to severe error.
>>> java.sql.SQLException: Table/View 'EXPRESSIONS' already exists in Schema
>>> 'APP'.
>>>         at
>>> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
>>> Source)
>>>         at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown
>>> Source)
>>>         at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(Unknown
>>> Source)
>>>         at DbDeletionTest.test(DbDeletionTest.java:42)
>>>         at DbDeletionTest.main(DbDeletionTest.java:53)
>>> Caused by: java.sql.SQLException: Table/View 'EXPRESSIONS' already
>>> exists in Schema 'APP'.
>>>         at
>>> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown
>>> Source)
>>>         at
>>> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
>>> Source)
>>>
>>> 2010/3/19, Gabriele Kahlout <gabriele@mysimpatico.com>:
>>>> 'rm -R myDbDirectory' in *nix'
>>>> How do you programmatically, from java do that (OS independent)?
>>>> What I do is I iterate over the db folder and delete all contents, as
>>>> returned by the java.io API.
>>>>
>>>> However, even doing that seems not sufficient.
>>>> I see that the test folder (the one that contains db.sqlwrapper) is
>>>> deleted after the first test, and created in the setup of the next.
>>>> However, I get:
>>>>
>>>> Caused by: ERROR X0Y32: Table/View 'EXPRESSIONS' already exists in
>>>> Schema
>>>> 'APP'.
>>>>
>>>> I think it has to do with the copy in memory not being updated with
>>>> the disk. That is because through the debugger, I've even manually
>>>> deleted the db, but to no avail.
>>>> Maybe this is more of a Java question now:
>>>> How do I make sure the memory is flushed/sync with the disk? Or that
>>>> derby, when creating a connection is not fooled by the cache in
>>>> memory?
>>>>
>>>>
>>>> 2010/3/19, Kristian Waagan <Kristian.Waagan@sun.com>:
>>>>> On 19.03.10 10:11, Gabriele Kahlout wrote:
>>>>>> Also, I've copied from the code what I seem to need, and then end
up
>>>>>> with when I use the db again in a 2nd method.
>>>>>>
>>>>>> Caused by: java.sql.SQLException: Database '/Volumes/STORE N
>>>>>> GO/ws/MemorizEasy/test/db.sqlwrapper' not found.
>>>>>>
>>>>>> Note that after destroying the schemas, I shut down the db, and delete
>>>>>> the test folder of the previous method.
>>>>>>
>>>>>
>>>>> Hi Gabriele,
>>>>>
>>>>> I don't know the requirements of your application, but note that in
>>>>> general you have three options:
>>>>>
>>>>>   - clean the database and reuse it
>>>>>     This is what we're doing in the Derby test framework (see the class
>>>>> that Bryan pointed to), because it would take much longer to actually
>>>>> delete and recreate the database files all the time. Here we use
>>>>> meta-data to detect all objects added to the database during the test,
>>>>> and then we drop them.
>>>>>
>>>>>   - simply just delete the database on disk (i.e. 'rm -R myDbDirectory'
>>>>> in *nix) and create a new one for the next test (through JDBC, using
>>>>> 'jdbc:derby:...;create=true').
>>>>>     You should shut down the database before deleting the files on
>>>>> disk.
>>>>>
>>>>>   - if you just need a database for a short period of time or similar,
>>>>> use an in-memory db.
>>>>>     Remember to drop it [1] to free up the memory.
>>>>>
>>>>> It's hard to tell exactly what went wrong above, but are you sure the
>>>>> database is still on disk?
>>>>> Can you locate the directory? (you should see the directories
>>>>> db.sqlwrapper, db.sqlwrapper/seg0 and db.sqlwrapper/log)
>>>>> If not, why did it get deleted?
>>>>>
>>>>>
>>>>> --
>>>>> Kristian
>>>>>
>>>>> [1] Note that proper support for this is added in 10.6, by using the
>>>>> "drop=true" attribute. In 10.5, the mechanism is different.
>>>>>
>>>>>> 2010/3/18, Gabriele Kahlout<gabriele@mysimpatico.com>:
>>>>>>
>>>>>>> I reached here:
>>>>>>> http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/CleanDatabaseTestSetup.java?view=markup
>>>>>>>
>>>>>>> But then what do I do? The code relies on some other class, and
it
>>>>>>> seems like I'd have to import the whole package to use it. Is
that
>>>>>>> it?
>>>>>>> Besides that one cannot delete the APP schema (which is the one
i
>>>>>>> use), while the code seems to want to do that.
>>>>>>> If not, is there how I can use this without concerning myself
with
>>>>>>> the
>>>>>>> impl. details?
>>>>>>>
>>>>>>> 2010/3/18, Gabriele Kahlout<gabriele@mysimpatico.com>:
>>>>>>>
>>>>>>>> Can you provide a link to it? Also, is it in some library
I could
>>>>>>>> use?
>>>>>>>>
>>>>>>>> 2010/3/18, Bryan Pendleton<bpendleton.derby@gmail.com>:
>>>>>>>>
>>>>>>>>>> For testing, how can I make sure the tearDown completely
deletes
>>>>>>>>>> the
>>>>>>>>>> db, and setUp creates a completely new copy, without
using
>>>>>>>>>> in-memory
>>>>>>>>>> db?
>>>>>>>>>>
>>>>>>>>> We do this in the Derby regression test suite.
>>>>>>>>>
>>>>>>>>> Have a look at
>>>>>>>>> org.apache.derbyTesting.functionTests.junit.CleanDatabaseTestSetup.java
>>>>>>>>>
>>>>>>>>> thanks,
>>>>>>>>>
>>>>>>>>> bryan
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Regards,
>>>>>>>> K. Gabriele
>>>>>>>>
>>>>>>>> --- unchanged since 25/1/10 ---
>>>>>>>> P.S. Unless a notification (LON), please reply either with
an answer
>>>>>>>> OR with " ACK" appended to this subject within 48 hours.
Otherwise,
>>>>>>>> I
>>>>>>>> might resend.
>>>>>>>> In(LON, this) ∨ In(48h, TimeNow) ∨ ∃x. In(x, MyInbox)
∧
>>>>>>>> IsAnswerTo(x,
>>>>>>>> this) ∨ (In(subject(this), subject(x)) ∧ In(ACK, subject(x))
∧
>>>>>>>> ¬IsAnswerTo(x,this)) ⇒ ¬IResend(this).
>>>>>>>>
>>>>>>>> Also note that correspondence may be received only from specified
a
>>>>>>>> priori senders, or if the subject of this email ends with
a code,
>>>>>>>> eg.
>>>>>>>> -LICHT01X, then also from senders whose reply contains it.
>>>>>>>> ∀x. In(x, MyInbox) ⇒ In(senderAddress(x), MySafeSenderList)
∨ (∃y.
>>>>>>>> In(y, subject(this) ) ∧ In(y,x) ∧ isCodeLike(y, -LICHT01X)
).
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Regards,
>>>>>>> K. Gabriele
>>>>>>>
>>>>>>> --- unchanged since 25/1/10 ---
>>>>>>> P.S. Unless a notification (LON), please reply either with an
answer
>>>>>>> OR with " ACK" appended to this subject within 48 hours. Otherwise,
I
>>>>>>> might resend.
>>>>>>> In(LON, this) ∨ In(48h, TimeNow) ∨ ∃x. In(x, MyInbox) ∧
IsAnswerTo(x,
>>>>>>> this) ∨ (In(subject(this), subject(x)) ∧ In(ACK, subject(x))
∧
>>>>>>> ¬IsAnswerTo(x,this)) ⇒ ¬IResend(this).
>>>>>>>
>>>>>>> Also note that correspondence may be received only from specified
a
>>>>>>> priori senders, or if the subject of this email ends with a code,
eg.
>>>>>>> -LICHT01X, then also from senders whose reply contains it.
>>>>>>> ∀x. In(x, MyInbox) ⇒ In(senderAddress(x), MySafeSenderList)
∨ (∃y.
>>>>>>> In(y, subject(this) ) ∧ In(y,x) ∧ isCodeLike(y, -LICHT01X)
).
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Regards,
>>>> K. Gabriele
>>>>
>>>> --- unchanged since 25/1/10 ---
>>>> P.S. Unless a notification (LON), please reply either with an answer
>>>> OR with " ACK" appended to this subject within 48 hours. Otherwise, I
>>>> might resend.
>>>> In(LON, this) ∨ In(48h, TimeNow) ∨ ∃x. In(x, MyInbox) ∧ IsAnswerTo(x,
>>>> this) ∨ (In(subject(this), subject(x)) ∧ In(ACK, subject(x)) ∧
>>>> ¬IsAnswerTo(x,this)) ⇒ ¬IResend(this).
>>>>
>>>> Also note that correspondence may be received only from specified a
>>>> priori senders, or if the subject of this email ends with a code, eg.
>>>> -LICHT01X, then also from senders whose reply contains it.
>>>> ∀x. In(x, MyInbox) ⇒ In(senderAddress(x), MySafeSenderList) ∨ (∃y.
>>>> In(y, subject(this) ) ∧ In(y,x) ∧ isCodeLike(y, -LICHT01X) ).
>>>>
>>>
>>>
>>> --
>>> Regards,
>>> K. Gabriele
>>>
>>> --- unchanged since 25/1/10 ---
>>> P.S. Unless a notification (LON), please reply either with an answer
>>> OR with " ACK" appended to this subject within 48 hours. Otherwise, I
>>> might resend.
>>> In(LON, this) ∨ In(48h, TimeNow) ∨ ∃x. In(x, MyInbox) ∧ IsAnswerTo(x,
>>> this) ∨ (In(subject(this), subject(x)) ∧ In(ACK, subject(x)) ∧
>>> ¬IsAnswerTo(x,this)) ⇒ ¬IResend(this).
>>>
>>> Also note that correspondence may be received only from specified a
>>> priori senders, or if the subject of this email ends with a code, eg.
>>> -LICHT01X, then also from senders whose reply contains it.
>>> ∀x. In(x, MyInbox) ⇒ In(senderAddress(x), MySafeSenderList) ∨ (∃y.
>>> In(y, subject(this) ) ∧ In(y,x) ∧ isCodeLike(y, -LICHT01X) ).
>>>
>>
>>
>> --
>> Regards,
>> K. Gabriele
>>
>> --- unchanged since 25/1/10 ---
>> P.S. Unless a notification (LON), please reply either with an answer
>> OR with " ACK" appended to this subject within 48 hours. Otherwise, I
>> might resend.
>> In(LON, this) ∨ In(48h, TimeNow) ∨ ∃x. In(x, MyInbox) ∧ IsAnswerTo(x,
>> this) ∨ (In(subject(this), subject(x)) ∧ In(ACK, subject(x)) ∧
>> ¬IsAnswerTo(x,this)) ⇒ ¬IResend(this).
>>
>> Also note that correspondence may be received only from specified a
>> priori senders, or if the subject of this email ends with a code, eg.
>> -LICHT01X, then also from senders whose reply contains it.
>> ∀x. In(x, MyInbox) ⇒ In(senderAddress(x), MySafeSenderList) ∨ (∃y.
>> In(y, subject(this) ) ∧ In(y,x) ∧ isCodeLike(y, -LICHT01X) ).
>>
>
>
> --
> Regards,
> K. Gabriele
>
> --- unchanged since 25/1/10 ---
> P.S. Unless a notification (LON), please reply either with an answer
> OR with " ACK" appended to this subject within 48 hours. Otherwise, I
> might resend.
> In(LON, this) ∨ In(48h, TimeNow) ∨ ∃x. In(x, MyInbox) ∧ IsAnswerTo(x,
> this) ∨ (In(subject(this), subject(x)) ∧ In(ACK, subject(x)) ∧
> ¬IsAnswerTo(x,this)) ⇒ ¬IResend(this).
>
> Also note that correspondence may be received only from specified a
> priori senders, or if the subject of this email ends with a code, eg.
> -LICHT01X, then also from senders whose reply contains it.
> ∀x. In(x, MyInbox) ⇒ In(senderAddress(x), MySafeSenderList) ∨ (∃y.
> In(y, subject(this) ) ∧ In(y,x) ∧ isCodeLike(y, -LICHT01X) ).
>

Mime
View raw message