You can register to events of the db4o-database. You can used these events to implement all kinds of additional functionality. Take a look a few example use-cases. See "Possible Usecases"
There's an event for each database operation. Most of the time there are two events for an operation. One is fired before the operation starts, the other when the operation ends.
You can gain access to the events via a event registry. These three steps show how to register to events.
First obtain a EventRegistry-instance from the object container.
EventRegistry events = EventRegistryFactory.forObjectContainer(container);
Now you can register your event-handlers on the event registry.
events.committing().addListener(new EventListener4<CommitEventArgs>() { public void onEvent(Event4<CommitEventArgs> source, CommitEventArgs arguments) { handleCommitting(source,arguments); } });
Then implement your event handling.
private static void handleCommitting(Event4<CommitEventArgs> source, CommitEventArgs commitEventArgs) { // handle the event here }
Some events can cancel the operation. All events which have a CancellableObjectEventArgs-parameter can cancel the operation. When you cancel in a event, the operation won't be executed. For example:
EventRegistry events = EventRegistryFactory.forObjectContainer(container); events.creating().addListener(new EventListener4<CancellableObjectEventArgs>() { public void onEvent(Event4<CancellableObjectEventArgs> events, CancellableObjectEventArgs eventArgs) { if(eventArgs.object() instanceof Person){ Person p = (Person) eventArgs.object(); if(p.getName().equals("Joe Junior")){ eventArgs.cancel(); } } } });
When you want to register for the events on the server, you should register it on the server-container.
ObjectServer server = Db4oClientServer.openServer(DATABASE_FILE_NAME, PORT_NUMBER); EventRegistry eventsOnServer = EventRegistryFactory.forObjectContainer(server.ext().objectContainer());
Commit-events bring a collection of the added, updated and deleted object with it. You can iterate over these objects. The updated- and added-collections contain LazyObjectReferences, the deleted-event a FrozenObjectInfos. Note that you may cannot get deleted object-instance anymore, but only the meta-info. Furthermore the object doesn't need to be activated. So when you need to read information out if it, ensure that you've activated it first.
EventRegistry events = EventRegistryFactory.forObjectContainer(container); events.committed().addListener(new EventListener4<CommitEventArgs>() { public void onEvent(Event4<CommitEventArgs> events, CommitEventArgs eventArgs) { for(Iterator4 it=eventArgs.added().iterator();it.moveNext();){ LazyObjectReference reference = (LazyObjectReference) it.current(); System.out.println("Added "+reference.getObject()); } for(Iterator4 it=eventArgs.updated().iterator();it.moveNext();){ LazyObjectReference reference = (LazyObjectReference) it.current(); System.out.println("Updated "+reference.getObject()); } for(Iterator4 it=eventArgs.deleted().iterator();it.moveNext();){ FrozenObjectInfo deletedInfo = (FrozenObjectInfo) it.current(); // the deleted info might doesn't contain the object anymore and // return the null. System.out.println("Deleted "+deletedInfo.getObject()); } } });