/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
import net.sourceforge.pain.db.*;

import java.util.*;

public class PainDBQuickStart {

	public static void main(String[] args) throws Exception {
		final PainDB db = new PainDB("mydbfile");

		// Example 1: new object creation
		db.beginTransaction();
		MyDataObject obj = new MyDataObject(db);
		obj.setMyIntField(10);
		obj.setMyStringField("Hello World!");
		db.commitTransaction();

		// Example 2: transparent collections support
		db.beginTransaction();
		for (int i = 0; i < 100; i++) {
			MyDataObject myReference = new MyDataObject(db);
			myReference.setMyStringField("my_reference");
			obj.getMyReferences().add(myReference);
		}
		db.commitTransaction();


		//Example 3: rollback
		db.beginTransaction();
		for (Iterator it = obj.getMyReferences().iterator(); it.hasNext();) {
			MyDataObject myReference = (MyDataObject) it.next();
			it.remove();
			myReference.delete();
		}
		db.rollbackTransaction(); // here all changes done in  last transaction will be rolled back


		//Example 4: savepoints (subtransactions)
		db.beginTransaction();
		obj.setMyStringField("new value 1");
		db.beginTransaction(); // internal transaction (savepoint)!
		obj.setMyStringField("new value 2");
		db.rollbackTransaction(); // here we rolling back all changes done in internal transaction
		db.commitTransaction(); // commiting all changes done in first level transaction

		//Example 5: transaction wrapper, it's convinient to never write commit or rollback :)
		DbTransaction t = new DbTransaction() {
			public Object execute(Object[] params) {
				MyDataObject myDataObject = new MyDataObject(db);
				myDataObject.setMyStringField("this transaction will be commited if no exception thrown!");
				return null;
			}
		};
		db.execute(t);


		//Example 6: Subtransactions wrapping.
		DbTransaction t1 = new DbTransaction() {
			public Object execute(Object[] params) throws Exception {
				final MyDataObject myDataObject = new MyDataObject(db);
				myDataObject.setMyStringField("value1");
				DbTransaction t2 = new DbTransaction() {
					public Object execute(Object[] params) throws Exception {
						myDataObject.setMyStringField("value2");
						return null;
					}
				};
				db.execute(t2);
				assert(myDataObject.getMyStringField().equals("value2"));
				return null;
			}
		};
		db.execute(t1);

		//example 7: automatic removal all references during object deletion
		db.beginTransaction();
		MyDataObject obj7_1 = new MyDataObject(db);
		MyDataObject obj7_2 = new MyDataObject(db);
		obj7_1.getMyReferences().add(obj7_2);
		assert (obj7_1.getMyReferences().contains(obj7_2));
		obj7_2.delete();
		assert (obj7_1.getMyReferences().isEmpty());
		db.commitTransaction();

		db.close();
	}
}