content: import SQLite.*;
  
  public class test implements SQLite.Callback, SQLite.Function,
      SQLite.Authorizer, SQLite.Trace, SQLite.ProgressHandler {
  
      private StringBuffer acc = new StringBuffer();
  
      public void columns(String col[]) {
  	System.out.println("#cols = " + col.length);
  	for (int i = 0; i < col.length; i++) {
  	    System.out.println("col" + i + ": " + col[i]);
  	}
  	// throw new java.lang.RuntimeException("boom");
      }
  
      public void types(String types[]) {
  	if (types != null) {
  	    for (int i = 0; i < types.length; i++) {
  	        System.out.println("coltype" + i + ": " + types[i]);
  	    }
  	}
      }
  
      public boolean newrow(String data[]) {
  	for (int i = 0; i < data.length; i++) {
  	    System.out.println("data" + i + ": " + data[i]);
  	}
  	return false;
      }
  
      public void function(FunctionContext fc, String args[]) {
  	System.out.println("function:");
  	for (int i = 0; i < args.length; i++) {
  	    System.out.println("arg[" + i + "]=" + args[i]);
  	}
  	if (args.length > 0) {
  	    fc.set_result(args[0].toLowerCase());
  	}
      }
  
      public void step(FunctionContext fc, String args[]) {
  	System.out.println("step:");
  	for (int i = 0; i < args.length; i++) {
  	    acc.append(args[i]);
  	    acc.append(" ");
  	}
      }
  
      public void last_step(FunctionContext fc) {
  	System.out.println("last_step");
  	fc.set_result(acc.toString());
  	acc.setLength(0);
      }
  
      public int authorize(int what, String arg1, String arg2, String arg3,
  			 String arg4) {
  	System.out.println("AUTH: " + what + "," + arg1 + "," + arg2 + ","
  			   + arg3 + "," + arg4);
  	return Constants.SQLITE_OK;
      }
  
      public void trace(String stmt) {
  	System.out.println("TRACE: " + stmt);
      }
  
      public boolean progress() {
  	System.out.println("PROGRESS");
  	return true;
      }
  
      public static void main(String args[]) {
  	System.out.println("LIB version: " + SQLite.Database.version());
  	SQLite.Database db = new SQLite.Database();
  	try {
  	    db.open("db", 0666);
  	    System.out.println("DB version: " + db.dbversion());
  	    db.interrupt();
  	    db.busy_timeout(1000);
  	    db.busy_handler(null);
  	    db.create_function("myregfunc", -1, new test());
  	    db.function_type("myregfunc", Constants.SQLITE_TEXT);
  	    db.create_aggregate("myaggfunc", 1, new test());
  	    db.function_type("myaggfunc", Constants.SQLITE_TEXT);
  	    db.exec("PRAGMA show_datatypes = on", null);
  	    System.out.println("==== local callback ====");
  	    db.exec("select * from sqlite_master", new test());
  	    System.out.println("==== get_table ====");
  	    System.out.print(db.get_table("select * from TEST"));
  	    System.out.println("==== get_table w/ args ====");
  	    String qargs[] = new String[1];
  	    qargs[0] = "tab%";
  	    System.out.print(db.get_table("select * from sqlite_master where type like '%q'", qargs));
  	    System.out.println("==== call regular function ====");
  	    db.exec("select myregfunc(TEST.firstname) from TEST", new test());
  	    System.out.println("==== call aggregate function ====");
  	    db.exec("select myaggfunc(TEST.firstname) from TEST", new test());
  	    System.out.println("==== compile/step interface ====");
  	    test cb = new test();
  	    db.set_authorizer(cb);
  	    db.trace(cb);
  	    Vm vm = db.compile("select * from TEST; " +
  			       "delete from TEST where id = 5; " +
  			       "insert into TEST values(5, 'Speedy', 'Gonzales'); " +
  			       "select * from TEST");
  	    int stmt = 0;
  	    do {
  		++stmt;
  		if (stmt > 3) {
  		    System.out.println("setting progress handler");
  		    db.progress_handler(3, cb);
  		}
  		System.out.println("---- STMT #" + stmt + " ----");
  		while (vm.step(cb)) {
  		}
  	    } while (vm.compile());
  	    db.close();
  	    System.out.println("An exception is expected from now on.");
  	    System.out.println("==== local callback ====");
  	    db.exec("select * from sqlite_master", new test());
  	} catch (java.lang.Exception e) {
  	    System.err.println("error: " + e);
  	} finally {
  	    try {
  		System.err.println("cleaning up ...");
  		db.close();
  	    } catch(java.lang.Exception e) {
  		System.err.println("error: " + e);
  	    } finally {
  		System.err.println("done.");
  	    }
  	}
  	
      }
  }
  