package basextest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.concurrent.atomic.AtomicBoolean;
import org.basex.core.Context;
import org.basex.core.locks.DBLocking;
import org.basex.util.list.StringList;

public class BaseXTestDBLocking {

    public static void main(String[] args) throws IOException {
        final AtomicBoolean goOn = new AtomicBoolean(true);

        final Context ctx = new Context();
        final DBLocking lock = new DBLocking(ctx.soptions);

        for (int d = 1; d < 20; d++) {
            final String prevdbname = "doc" + (d - 1);
            final String dbname = "doc" + d;
            // CreateDb
            lock.acquire(null, new StringList(prevdbname), new StringList(dbname));
            lock.release(null);

            new Thread() {
                @Override
                public void run() {
                    while (goOn.get()) {
                        try {
                            // Open
                            lock.acquire(null, new StringList(dbname), new StringList(0));
                            lock.release(null);
                        }
                        catch (Exception ex) {
                            System.out.println("Thread " + Thread.currentThread().getId() + " released([" + dbname + "], [])");
                            ex.printStackTrace();
                            System.exit(1);
                        }

                        // Add
                        try {
                            lock.acquire(null, new StringList(0), new StringList(dbname));
                            lock.release(null);
                        }
                        catch (Exception ex) {
                            System.out.println("Thread " + Thread.currentThread().getId() + " released([], [" + dbname + "])");
                            ex.printStackTrace();
                            System.exit(1);
                        }
                    }
                }
            }.start();
        }
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        bufferedReader.readLine();
        goOn.set(false);
    }
}
