com.codename1.db.ThreadSafeDatabase Maven / Gradle / Ivy
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codename1.db;
import com.codename1.io.Log;
import com.codename1.util.EasyThread;
import com.codename1.util.RunnableWithResultSync;
import java.io.IOException;
/**
* Wraps all database calls in a single thread so they are all proxied thru that thread
*
* @author Shai Almog
* @deprecated platform specific nuances prevented this approach from working out, we improved the native iOS support for thread safety instead
*/
public class ThreadSafeDatabase extends Database {
private final Database underlying;
private final EasyThread et;
/**
* Wraps the given database with a threadsafe version
* @param db the database
*/
public ThreadSafeDatabase(Database db) {
underlying = db;
et = EasyThread.start("Database");
}
/**
* Returns the underlying easy thread we can use to pipe tasks to the db thread
* @return the easy thread object
*/
public EasyThread getThread() {
return et;
}
@Override
public void beginTransaction() throws IOException {
invokeWithException(new RunnableWithIOException() {
public void run() throws IOException {
underlying.beginTransaction();
}
});
}
interface RunnableWithIOException {
public void run() throws IOException;
}
interface RunnableWithResponseOrIOException {
public Object run() throws IOException;
}
private void invokeWithException(final RunnableWithIOException r) throws IOException {
IOException err = et.run(new RunnableWithResultSync() {
public IOException run() {
try {
r.run();
return null;
} catch(IOException err) {
return err;
}
}
});
if(err != null) {
throw err;
}
}
private Object invokeWithException(final RunnableWithResponseOrIOException r) throws IOException {
Object ret = et.run(new RunnableWithResultSync