Revision: 148
http://polepos.svn.sourceforge.net/polepos/?rev=148&view=rev
Author: carlrosenberger
Date: 2010-11-30 19:04:46 +0000 (Tue, 30 Nov 2010)
Log Message:
-----------
cr + pr + acv: Work on Complex circuit for JDBC.
Modified Paths:
--------------
trunk/polepos/settings/DebugCircuits.properties
trunk/polepos/src/org/polepos/data/ComplexHolder0.java
trunk/polepos/src/org/polepos/data/ComplexHolder1.java
trunk/polepos/src/org/polepos/data/ComplexHolder2.java
trunk/polepos/src/org/polepos/data/ComplexHolder3.java
trunk/polepos/src/org/polepos/data/ComplexHolder4.java
trunk/polepos/src/org/polepos/framework/DriverBase.java
trunk/polepos/src/org/polepos/teams/db4o/ComplexDb4o.java
trunk/polepos/src/org/polepos/teams/db4o/FlatObjectDb4o.java
trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java
Added Paths:
-----------
trunk/polepos/src/org/polepos/framework/NullVisitor.java
trunk/polepos/src/org/polepos/teams/jdbc/ComplexJdbc.java
Modified: trunk/polepos/settings/DebugCircuits.properties
===================================================================
--- trunk/polepos/settings/DebugCircuits.properties 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/settings/DebugCircuits.properties 2010-11-30 19:04:46 UTC (rev 148)
@@ -1,4 +1,8 @@
+# Settings for the database benchmark
+# with short test runs for debugging only
+# Results are not signifant
+
# Global settings for all circuits
concurrency=false
@@ -37,18 +41,19 @@
inheritancehierarchy.objects=100,300,1000
inheritancehierarchy.selects=10,10,10
+
# complex
#
# [objects]: number of objects to select from
# [selects]: number of queries run against all objects
+#complex.depth=5,6,7
+#complex.objects=5,5,5
+#complex.selects=100,100,100
+complex.depth=5
+complex.objects=5
+complex.selects=50
-complex.depth=5,6
-complex.objects=5,5,5
-complex.selects=100,100,100
-# Settings for the database benchmark
-# with short test runs for debugging only
-# Results are not signifant
# melbourne
#
Modified: trunk/polepos/src/org/polepos/data/ComplexHolder0.java
===================================================================
--- trunk/polepos/src/org/polepos/data/ComplexHolder0.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/data/ComplexHolder0.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -54,7 +54,6 @@
if(depth < 1){
return;
}
-
int factoryIdx = 0;
int holderIdx = 0;
List<ComplexHolder0> parentLevel = Arrays.asList(root);
@@ -101,7 +100,7 @@
return holders;
}
- private void addChild(ComplexHolder0 child) {
+ public void addChild(ComplexHolder0 child) {
_children.add(child);
}
@@ -141,33 +140,75 @@
@Override
public long checkSum() {
- return internalCheckSum(new IdentityHashMap<ComplexHolder0, ComplexHolder0>());
+
+ class CheckSumVisitor implements Visitor<ComplexHolder0> {
+
+ long checkSum;
+
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ checkSum = holder.ownCheckSum();
+ }
+ }
+ CheckSumVisitor visitor = new CheckSumVisitor();
+ traverse(visitor, new NullVisitor<ComplexHolder0>());
+ return visitor.checkSum;
}
- private long internalCheckSum(IdentityHashMap<ComplexHolder0, ComplexHolder0> visited) {
+ public void traverse(Visitor<ComplexHolder0> preVisitor, Visitor<ComplexHolder0> postVisitor) {
+ internalTraverse(new IdentityHashMap<ComplexHolder0, ComplexHolder0>(), preVisitor, postVisitor);
+ }
+
+ private void internalTraverse(IdentityHashMap<ComplexHolder0, ComplexHolder0> visited, Visitor<ComplexHolder0> preVisitor, Visitor<ComplexHolder0> postVisitor) {
if(visited.containsKey(this)) {
- return 0;
+ return;
}
visited.put(this, this);
- long checkSum = internalCheckSum();
+ preVisitor.visit(this);
for (ComplexHolder0 child : _children) {
- checkSum += child.internalCheckSum(visited);
+ child.internalTraverse(visited, preVisitor, postVisitor);
}
if(_array != null) {
for (ComplexHolder0 child : _array) {
- checkSum += child.internalCheckSum(visited);
+ child.internalTraverse(visited, preVisitor, postVisitor);
}
}
if(_previous != null) {
- checkSum += _previous.internalCheckSum(visited);
+ _previous.internalTraverse(visited, preVisitor, postVisitor);
}
- return checkSum;
+ postVisitor.visit(this);
}
+
- protected long internalCheckSum() {
+ public long ownCheckSum() {
return _name.hashCode();
}
protected void setSpecial(int value) {
}
+
+ public String getName() {
+ return _name;
+ }
+
+ public void setPrevious(ComplexHolder0 holder) {
+ _previous = holder;
+ }
+
+ public void setName(String name) {
+ _name = name;
+ }
+
+ public List<ComplexHolder0> getChildren() {
+ return _children;
+ }
+
+ public ComplexHolder0 getPrevious() {
+ return _previous;
+ }
+
+ public ComplexHolder0[] getArray() {
+ return _array;
+ }
+
}
Modified: trunk/polepos/src/org/polepos/data/ComplexHolder1.java
===================================================================
--- trunk/polepos/src/org/polepos/data/ComplexHolder1.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/data/ComplexHolder1.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -22,15 +22,17 @@
public class ComplexHolder1 extends ComplexHolder0 {
- private int _i1;
+ public int _i1;
- protected long internalCheckSum() {
- return _i1 + super.internalCheckSum();
+ @Override
+ public long ownCheckSum() {
+ return _i1 + super.ownCheckSum();
}
+ @Override
protected void setSpecial(int value) {
super.setSpecial(value);
_i1 = value;
}
-
+
}
Modified: trunk/polepos/src/org/polepos/data/ComplexHolder2.java
===================================================================
--- trunk/polepos/src/org/polepos/data/ComplexHolder2.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/data/ComplexHolder2.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -24,13 +24,16 @@
public int _i2;
- protected long internalCheckSum() {
- return _i2 + super.internalCheckSum();
+ @Override
+ public long ownCheckSum() {
+ return _i2 + super.ownCheckSum();
}
+ @Override
protected void setSpecial(int value) {
super.setSpecial(value);
_i2 = value;
}
+
}
Modified: trunk/polepos/src/org/polepos/data/ComplexHolder3.java
===================================================================
--- trunk/polepos/src/org/polepos/data/ComplexHolder3.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/data/ComplexHolder3.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -22,12 +22,14 @@
public class ComplexHolder3 extends ComplexHolder2 {
- private int _i3;
+ public int _i3;
- protected long internalCheckSum() {
- return _i3 + super.internalCheckSum();
+ @Override
+ public long ownCheckSum() {
+ return _i3 + super.ownCheckSum();
}
+ @Override
protected void setSpecial(int value) {
super.setSpecial(value);
_i3 = value;
Modified: trunk/polepos/src/org/polepos/data/ComplexHolder4.java
===================================================================
--- trunk/polepos/src/org/polepos/data/ComplexHolder4.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/data/ComplexHolder4.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -22,12 +22,14 @@
public class ComplexHolder4 extends ComplexHolder3 {
- private int _i4;
+ public int _i4;
- protected long internalCheckSum() {
- return _i4 + super.internalCheckSum();
+ @Override
+ public long ownCheckSum() {
+ return _i4 + super.ownCheckSum();
}
+ @Override
protected void setSpecial(int value) {
super.setSpecial(value);
_i4 = value;
Modified: trunk/polepos/src/org/polepos/framework/DriverBase.java
===================================================================
--- trunk/polepos/src/org/polepos/framework/DriverBase.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/framework/DriverBase.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -186,6 +186,10 @@
throw new IllegalStateException(" Out of _objectCount. Did you call initializeTestId ?");
}
+ protected int selectCount(){
+ return setup().getSelectCount();
+ }
+
protected int objectCount() {
return setup().getObjectCount();
}
Added: trunk/polepos/src/org/polepos/framework/NullVisitor.java
===================================================================
--- trunk/polepos/src/org/polepos/framework/NullVisitor.java (rev 0)
+++ trunk/polepos/src/org/polepos/framework/NullVisitor.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -0,0 +1,30 @@
+/*
+This file is part of the PolePosition database benchmark
+http://www.polepos.org
+
+This program 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.
+
+This program 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 this program; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+MA 02111-1307, USA. */
+
+
+package org.polepos.framework;
+
+public class NullVisitor<T> implements Visitor<T>{
+
+ @Override
+ public void visit(T t) {
+ // do nothing
+ }
+
+}
Property changes on: trunk/polepos/src/org/polepos/framework/NullVisitor.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/polepos/src/org/polepos/teams/db4o/ComplexDb4o.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/db4o/ComplexDb4o.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/teams/db4o/ComplexDb4o.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -22,6 +22,7 @@
import org.polepos.circuits.complex.*;
import org.polepos.data.*;
+import org.polepos.framework.*;
import com.db4o.*;
import com.db4o.config.*;
@@ -38,52 +39,88 @@
@Override
public void read() {
+ ComplexHolder0 holder = root();
+ db().activate(holder, Integer.MAX_VALUE);
+ addToCheckSum(holder);
+ }
+
+ private ComplexHolder0 root() {
ObjectSet<ComplexRoot> result = db().query(ComplexRoot.class);
if(result.size() != 1) {
throw new IllegalStateException();
}
ComplexHolder0 holder = result.get(0)._holder;
- db().activate(holder, Integer.MAX_VALUE);
- addToCheckSum(holder);
+ return holder;
}
@Override
public void query() {
- int holderId = objectCount() * objectCount() + objectCount();
- System.err.println("QUERYING FOR " + holderId);
- Query query = db().query();
- query.constrain(ComplexHolder2.class);
-// query.descend("_id2").constrain(holderId);
- ObjectSet<ComplexHolder2> result = query.execute();
-// if(result.size() != 1) {
-// throw new IllegalStateException("" + result.size());
-// }
- for (ComplexHolder2 holder : result) {
- if(holder.getClass() == ComplexHolder2.class) {
- System.err.println(holder._i2);
+ int selectCount = selectCount();
+ int firstInt = objectCount() * objectCount() + objectCount();
+ int lastInt = firstInt + (objectCount() * objectCount() * objectCount()) - 1;
+ int currentInt = firstInt;
+ for (int run = 0; run < selectCount; run++) {
+
+ Query query = db().query();
+ query.constrain(ComplexHolder2.class);
+ query.descend("_i2").constrain(currentInt);
+ ObjectSet<ComplexHolder2> result = query.execute();
+ if(result.size() != 1) {
+ throw new IllegalStateException("" + result.size());
}
+ ComplexHolder2 holder = result.get(0);
+ db().activate(holder, Integer.MAX_VALUE);
+ addToCheckSum(holder);
+
+ currentInt++;
+ if(currentInt > lastInt){
+ currentInt = firstInt;
+ }
}
- ComplexHolder2 holder = result.get(0);
- db().activate(holder, Integer.MAX_VALUE);
- addToCheckSum(holder);
+
}
-
+
@Override
- public void delete() {
- // TODO Auto-generated method stub
-
+ public void update() {
+ ComplexHolder0 root = root();
+ root.traverse(new Visitor<ComplexHolder0>() {
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ db().activate(holder, 2);
+ }
+ }, new Visitor<ComplexHolder0>() {
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ addToCheckSum(holder.ownCheckSum());
+ holder.setName("updated");
+ holder.addChild(new ComplexHolder2());
+ store(holder.getChildren());
+ store(holder);
+ }
+ });
}
@Override
- public void update() {
- // TODO Auto-generated method stub
-
+ public void delete() {
+ ComplexHolder0 root = root();
+ root.traverse(new Visitor<ComplexHolder0>() {
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ db().activate(holder, 2);
+ }
+ }, new Visitor<ComplexHolder0>() {
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ addToCheckSum(holder.ownCheckSum());
+ db().delete(holder);
+ }
+ });
}
@Override
public void configure(Configuration config) {
config.objectClass(ComplexHolder2.class).objectField("_i2").indexed(true);
+ config.activationDepth(1);
}
-
}
Modified: trunk/polepos/src/org/polepos/teams/db4o/FlatObjectDb4o.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/db4o/FlatObjectDb4o.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/teams/db4o/FlatObjectDb4o.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -49,7 +49,7 @@
}
public void queryIndexedString() {
- initializeTestId(setup().getSelectCount());
+ initializeTestId(selectCount());
while(hasMoreTestIds()) {
Query q = db().query();
q.constrain( IndexedObject.class );
@@ -59,7 +59,7 @@
}
public void queryIndexedInt() {
- initializeTestId(setup().getSelectCount());
+ initializeTestId(selectCount());
while(hasMoreTestIds()) {
Query q = db().query();
q.constrain( IndexedObject.class );
@@ -69,7 +69,7 @@
}
public void update() {
- initializeTestId(setup().getUpdateCount());
+ initializeTestId(updateCount());
while(hasMoreTestIds()) {
Query q = db().query();
q.constrain( IndexedObject.class );
@@ -84,7 +84,7 @@
}
public void delete() {
- initializeTestId(setup().getUpdateCount());
+ initializeTestId(updateCount());
while(hasMoreTestIds()) {
Query q = db().query();
q.constrain( IndexedObject.class );
Added: trunk/polepos/src/org/polepos/teams/jdbc/ComplexJdbc.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdbc/ComplexJdbc.java (rev 0)
+++ trunk/polepos/src/org/polepos/teams/jdbc/ComplexJdbc.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -0,0 +1,230 @@
+/*
+This file is part of the PolePosition database benchmark
+http://www.polepos.org
+
+This program 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.
+
+This program 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 this program; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+MA 02111-1307, USA. */
+
+
+package org.polepos.teams.jdbc;
+
+import java.sql.*;
+import java.util.*;
+
+import org.polepos.circuits.complex.*;
+import org.polepos.data.*;
+import org.polepos.framework.*;
+
+public class ComplexJdbc extends JdbcDriver implements Complex {
+
+ private static final String HOLDER_TABLE0 = "complexHolder0";
+
+ private static final String[] HOLDER_TABLES = new String[]{
+ "complexHolder1",
+ "complexHolder2",
+ "complexHolder3",
+ "complexHolder4",
+ };
+
+ private static final String CHILDREN_TABLE = "children";
+
+ private static final String ARRAY_TABLE = "tarray";
+
+ public void takeSeatIn(Car car, TurnSetup setup) throws CarMotorFailureException{
+
+ super.takeSeatIn(car, setup);
+ openConnection();
+
+ dropTable(HOLDER_TABLE0);
+ dropTable(CHILDREN_TABLE);
+ dropTable(ARRAY_TABLE);
+
+ createTable( HOLDER_TABLE0, new String[]{ "id", "previous", "name" },
+ new Class[]{Integer.TYPE, Integer.TYPE, String.class} );
+
+ createTable(CHILDREN_TABLE,
+ new String[]{ "parent", "child", "pos"},
+ new Class[] {Integer.TYPE, Integer.TYPE, Integer.TYPE},
+ null);
+ createIndex( CHILDREN_TABLE, "parent" );
+ createIndex( CHILDREN_TABLE, "child" );
+ createIndex( CHILDREN_TABLE, "pos" );
+
+ createTable(ARRAY_TABLE,
+ new String[]{ "parent", "child", "pos"},
+ new Class[] {Integer.TYPE, Integer.TYPE, Integer.TYPE},
+ null);
+ createIndex( ARRAY_TABLE, "parent" );
+ createIndex( ARRAY_TABLE, "child" );
+ createIndex( ARRAY_TABLE, "pos" );
+
+ int i = 1;
+ for(String table : HOLDER_TABLES){
+ dropTable( table);
+ createTable( table, new String[]{ "id", "i" + i},
+ new Class[]{Integer.TYPE, Integer.TYPE, Integer.TYPE} );
+ if(i == 2){
+ createIndex( table, "i2" );
+ }
+ i++;
+ }
+ close();
+
+ }
+
+ @Override
+ public void write() {
+ final IdGenerator idGenerator = new IdGenerator();
+ final Stack<Integer> parentIds = new Stack<Integer>();
+ final PreparedStatement complexHolder0Stat = prepareStatement("insert into complexHolder0 (id, previous, name) values (?,?,?)");
+ final PreparedStatement[] complexHolderStats = new PreparedStatement[4];
+ for (int i = 0; i < complexHolderStats.length; i++) {
+ int idx = i + 1;
+ String table = "complexHolder" + idx;
+ complexHolderStats[i] = prepareStatement("insert into " + table + "(id, i" + idx + ") values (?,?)");
+ }
+ final PreparedStatement arrayStat = prepareStatement("insert into tarray (parent, child, pos) values (?,?,?)");
+ final PreparedStatement childrenStat = prepareStatement("insert into children (parent, child, pos) values (?,?,?)");
+ final Map<ComplexHolder0,Integer> ids = new HashMap<ComplexHolder0, Integer>();
+ ComplexHolder0 root = ComplexHolder0.generate(depth(), objectCount());
+ root.traverse(new Visitor<ComplexHolder0>() {
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ int id = (int) idGenerator.nextId();
+ ids.put(holder, id);
+ try {
+ complexHolder0Stat.setInt(1, id);
+ complexHolder0Stat.setInt(2, holder.getPrevious() == null ? 0 : ids.get(holder.getPrevious()));
+ complexHolder0Stat.setString(3, holder.getName());
+ complexHolder0Stat.addBatch();
+
+ if(holder instanceof ComplexHolder1){
+ complexHolderStats[0].setInt(1, id);
+ ComplexHolder1 complexHolder1 = (ComplexHolder1) holder;
+ complexHolderStats[0].setInt(2, complexHolder1._i1);
+ complexHolderStats[0].addBatch();
+ }
+
+ if(holder instanceof ComplexHolder2){
+ complexHolderStats[1].setInt(1, id);
+ ComplexHolder2 complexHolder2 = (ComplexHolder2) holder;
+ complexHolderStats[1].setInt(2, complexHolder2._i2);
+ complexHolderStats[1].addBatch();
+ }
+
+ if(holder instanceof ComplexHolder3){
+ complexHolderStats[2].setInt(1, id);
+ ComplexHolder3 complexHolder3 = (ComplexHolder3) holder;
+ complexHolderStats[2].setInt(2, complexHolder3._i3);
+ complexHolderStats[2].addBatch();
+ }
+
+ if(holder instanceof ComplexHolder4){
+ complexHolderStats[3].setInt(1, id);
+ ComplexHolder4 complexHolder4 = (ComplexHolder4) holder;
+ complexHolderStats[3].setInt(2, complexHolder4._i4);
+ complexHolderStats[3].addBatch();
+ }
+
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ parentIds.push(id);
+ }
+ }, new Visitor<ComplexHolder0>() {
+ @Override
+ public void visit(ComplexHolder0 holder) {
+ int parentId = parentIds.pop();
+ List<ComplexHolder0> children = holder.getChildren();
+ for (int i = 0; i < children.size(); i++) {
+ ComplexHolder0 child = children.get(i);
+ int childId = ids.get(child);
+ try {
+ childrenStat.setInt(1, parentId);
+ childrenStat.setInt(2, childId);
+ childrenStat.setInt(3, i);
+ childrenStat.addBatch();
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ ComplexHolder0[] array = holder.getArray();
+ if(array != null){
+ for (int i = 0; i < array.length; i++) {
+ ComplexHolder0 entry = array[i];
+ int childId = ids.get(entry);
+ try {
+ arrayStat.setInt(1, parentId);
+ arrayStat.setInt(2, childId);
+ arrayStat.setInt(3, i);
+ arrayStat.addBatch();
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ }
+ });
+
+ try {
+ complexHolder0Stat.executeBatch();
+ complexHolder0Stat.close();
+ for (int i = 0; i < complexHolderStats.length; i++) {
+ complexHolderStats[i].executeBatch();
+ complexHolderStats[i].close();
+ }
+ childrenStat.executeBatch();
+ childrenStat.close();
+ arrayStat.executeBatch();
+ arrayStat.close();
+
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ @Override
+ public void read() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void query() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void update() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void delete() {
+ // TODO Auto-generated method stub
+
+ }
+
+
+}
Property changes on: trunk/polepos/src/org/polepos/teams/jdbc/ComplexJdbc.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java
===================================================================
--- trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java 2010-11-29 16:02:39 UTC (rev 147)
+++ trunk/polepos/src/org/polepos/teams/jdbc/JdbcTeam.java 2010-11-30 19:04:46 UTC (rev 148)
@@ -61,6 +61,7 @@
new FlatObjectJdbc(),
new NestedListsJdbc(),
new InheritanceHierarchyJdbc(),
+ new ComplexJdbc(),
new MelbourneJdbc(),
new SepangJdbc(),
new BahrainJdbc(),
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|