db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gabriele Kahlout <gabri...@mysimpatico.com>
Subject Re: cleaning database between test cases
Date Sat, 20 Mar 2010 15:07:35 GMT
Well, did u try it? The result is the same, run on the same code
example I gave above but replacing it with you method.



2010/3/20, Peter Ondruška <peter.ondruska@gmail.com>:
> 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) ).
>>
>


-- 
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