Home | History | Annotate | Download | only in SQLite
      1 package SQLite;
      2 
      3 /**
      4  * Main class wrapping an SQLite database.
      5  */
      6 
      7 public class Database {
      8 
      9     /**
     10      * Internal handle for the native SQLite API.
     11      */
     12 
     13     protected long handle = 0;
     14 
     15     /**
     16      * Internal last error code for exec() methods.
     17      */
     18 
     19     protected int error_code = 0;
     20 
     21     /**
     22      * Open an SQLite database file.
     23      *
     24      * @param filename the name of the database file
     25      * @param mode open mode, currently ignored
     26      */
     27 
     28     public void open(String filename, int mode) throws SQLite.Exception {
     29     synchronized(this) {
     30         _open(filename, mode);
     31     }
     32     }
     33 
     34     private native void _open(String filename, int mode)
     35     throws SQLite.Exception;
     36 
     37     /**
     38      * Open SQLite auxiliary database file for temporary
     39      * tables.
     40      *
     41      * @param filename the name of the auxiliary file or null
     42      */
     43 
     44     public void open_aux_file(String filename) throws SQLite.Exception {
     45     synchronized(this) {
     46         _open_aux_file(filename);
     47     }
     48     }
     49 
     50     private native void _open_aux_file(String filename)
     51     throws SQLite.Exception;
     52 
     53     /**
     54      * Destructor for object.
     55      */
     56 
     57     protected void finalize() {
     58     synchronized(this) {
     59         _finalize();
     60     }
     61     }
     62 
     63     private native void _finalize();
     64 
     65     /**
     66      * Close the underlying SQLite database file.
     67      */
     68 
     69     public void close()    throws SQLite.Exception {
     70     synchronized(this) {
     71         _close();
     72     }
     73     }
     74 
     75     private native void _close()
     76     throws SQLite.Exception;
     77 
     78     /**
     79      * Execute an SQL statement and invoke callback methods
     80      * for each row of the result set.<P>
     81      *
     82      * It the method fails, an SQLite.Exception is thrown and
     83      * an error code is set, which later can be retrieved by
     84      * the last_error() method.
     85      *
     86      * @param sql the SQL statement to be executed
     87      * @param cb the object implementing the callback methods
     88      */
     89 
     90     public void exec(String sql, SQLite.Callback cb) throws SQLite.Exception {
     91     synchronized(this) {
     92         _exec(sql, cb);
     93     }
     94     }
     95 
     96     private native void _exec(String sql, SQLite.Callback cb)
     97     throws SQLite.Exception;
     98 
     99     /**
    100      * Execute an SQL statement and invoke callback methods
    101      * for each row of the result set. Each '%q' or %Q in the
    102      * statement string is substituted by its corresponding
    103      * element in the argument vector.
    104      * <BR><BR>
    105      * Example:<BR>
    106      * <PRE>
    107      *   String args[] = new String[1];
    108      *   args[0] = "tab%";
    109      *   db.exec("select * from sqlite_master where type like '%q'",
    110      *           null, args);
    111      * </PRE>
    112      *
    113      * It the method fails, an SQLite.Exception is thrown and
    114      * an error code is set, which later can be retrieved by
    115      * the last_error() method.
    116      *
    117      * @param sql the SQL statement to be executed
    118      * @param cb the object implementing the callback methods
    119      * @param args arguments for the SQL statement, '%q' substitution
    120      */
    121 
    122     public void exec(String sql, SQLite.Callback cb,
    123              String args[]) throws SQLite.Exception {
    124     synchronized(this) {
    125         _exec(sql, cb, args);
    126     }
    127     }
    128 
    129     private native void _exec(String sql, SQLite.Callback cb, String args[])
    130     throws SQLite.Exception;
    131 
    132     /**
    133      * Return the row identifier of the last inserted
    134      * row.
    135      */
    136 
    137     public long last_insert_rowid() {
    138     synchronized(this) {
    139         return _last_insert_rowid();
    140     }
    141     }
    142 
    143     private native long _last_insert_rowid();
    144 
    145     /**
    146      * Abort the current SQLite operation.
    147      */
    148 
    149     public void interrupt() {
    150     synchronized(this) {
    151         _interrupt();
    152     }
    153     }
    154 
    155     private native void _interrupt();
    156 
    157     /**
    158      * Return the number of changed rows for the last statement.
    159      */
    160 
    161     public long changes() {
    162     synchronized(this) {
    163         return _changes();
    164     }
    165     }
    166 
    167     private native long _changes();
    168 
    169     /**
    170      * Establish a busy callback method which gets called when
    171      * an SQLite table is locked.
    172      *
    173      * @param bh the object implementing the busy callback method
    174      */
    175 
    176     public void busy_handler(SQLite.BusyHandler bh) {
    177     synchronized(this) {
    178         _busy_handler(bh);
    179     }
    180     }
    181 
    182     private native void _busy_handler(SQLite.BusyHandler bh);
    183 
    184     /**
    185      * Set the timeout for waiting for an SQLite table to become
    186      * unlocked.
    187      *
    188      * @param ms number of millisecond to wait
    189      */
    190 
    191     public void busy_timeout(int ms) {
    192     synchronized(this) {
    193         _busy_timeout(ms);
    194     }
    195     }
    196 
    197     private native void _busy_timeout(int ms);
    198 
    199     /**
    200      * Convenience method to retrieve an entire result
    201      * set into memory.
    202      *
    203      * @param sql the SQL statement to be executed
    204      * @return result set
    205      */
    206 
    207     public TableResult get_table(String sql) throws SQLite.Exception {
    208     TableResult ret = new TableResult();
    209     if (!is3()) {
    210         exec(sql, ret);
    211     } else {
    212         synchronized(this) {
    213         /* only one statement !!! */
    214         Vm vm = compile(sql);
    215         set_last_error(vm.error_code);
    216         while (vm.step(ret)) {
    217             set_last_error(vm.error_code);
    218         }
    219         vm.finalize();
    220         }
    221     }
    222     return ret;
    223     }
    224 
    225     /**
    226      * Convenience method to retrieve an entire result
    227      * set into memory.
    228      *
    229      * @param sql the SQL statement to be executed
    230      * @param args arguments for the SQL statement, '%q' substitution
    231      * @return result set
    232      */
    233 
    234     public TableResult get_table(String sql, String args[])
    235     throws SQLite.Exception {
    236     TableResult ret = new TableResult();
    237     if (!is3()) {
    238         exec(sql, ret, args);
    239     } else {
    240         synchronized(this) {
    241         /* only one statement !!! */
    242         Vm vm = compile(sql, args);
    243         set_last_error(vm.error_code);
    244         while (vm.step(ret)) {
    245             set_last_error(vm.error_code);
    246         }
    247         vm.finalize();
    248         }
    249     }
    250     return ret;
    251     }
    252 
    253     /**
    254      * Convenience method to retrieve an entire result
    255      * set into memory.
    256      *
    257      * @param sql the SQL statement to be executed
    258      * @param args arguments for the SQL statement, '%q' substitution
    259      * @param tbl TableResult to receive result set
    260      * @return result set
    261      */
    262 
    263     public void get_table(String sql, String args[], TableResult tbl)
    264     throws SQLite.Exception {
    265     tbl.clear();
    266     if (!is3()) {
    267         exec(sql, tbl, args);
    268     } else {
    269         synchronized(this) {
    270         /* only one statement !!! */
    271         Vm vm = compile(sql, args);
    272         while (vm.step(tbl)) {
    273         }
    274         vm.finalize();
    275         }
    276     }
    277     }
    278 
    279     /**
    280      * See if an SQL statement is complete.
    281      * Returns true if the input string comprises
    282      * one or more complete SQL statements.
    283      *
    284      * @param sql the SQL statement to be checked
    285      */
    286 
    287     public synchronized static boolean complete(String sql) {
    288     return _complete(sql);
    289     }
    290 
    291     private native static boolean _complete(String sql);
    292 
    293     /**
    294      * Return SQLite version number as string.
    295      * Don't rely on this when both SQLite 2 and 3 are compiled
    296      * into the native part. Use the class method in this case.
    297      */
    298 
    299     public native static String version();
    300 
    301     /**
    302      * Return SQLite version number as string.
    303      * If the database is not open, <tt>unknown</tt> is returned.
    304      */
    305 
    306     public native String dbversion();
    307 
    308     /**
    309      * Create regular function.
    310      *
    311      * @param name the name of the new function
    312      * @param nargs number of arguments to function
    313      * @param f interface of function
    314      */
    315 
    316     public void create_function(String name, int nargs, Function f) {
    317     synchronized(this) {
    318         _create_function(name, nargs, f);
    319     }
    320     }
    321 
    322     private native void _create_function(String name, int nargs, Function f);
    323 
    324     /**
    325      * Create aggregate function.
    326      *
    327      * @param name the name of the new function
    328      * @param nargs number of arguments to function
    329      * @param f interface of function
    330      */
    331 
    332     public void create_aggregate(String name, int nargs, Function f) {
    333     synchronized(this) {
    334         _create_aggregate(name, nargs, f);
    335     }
    336     }
    337 
    338     private native void _create_aggregate(String name, int nargs, Function f);
    339 
    340     /**
    341      * Set function return type. Only available in SQLite 2.6.0 and
    342      * above, otherwise a no-op.
    343      *
    344      * @param name the name of the function whose return type is to be set
    345      * @param type return type code, e.g. SQLite.Constants.SQLITE_NUMERIC
    346      */
    347 
    348     public void function_type(String name, int type) {
    349     synchronized(this) {
    350         _function_type(name, type);
    351     }
    352     }
    353 
    354     private native void _function_type(String name, int type);
    355 
    356     /**
    357      * Return the code of the last error occured in
    358      * any of the exec() methods. The value is valid
    359      * after an Exception has been reported by one of
    360      * these methods. See the <A HREF="Constants.html">Constants</A>
    361      * class for possible values.
    362      *
    363      * @return SQLite error code
    364      */
    365 
    366     public int last_error() {
    367     return error_code;
    368     }
    369 
    370     /**
    371      * Internal: set error code.
    372      * @param error_code new error code
    373      */
    374 
    375     protected void set_last_error(int error_code) {
    376     this.error_code = error_code;
    377     }
    378 
    379     /**
    380      * Return last error message of SQLite3 engine.
    381      *
    382      * @return error string or null
    383      */
    384 
    385     public String error_message() {
    386     synchronized(this) {
    387         return _errmsg();
    388     }
    389     }
    390 
    391     private native String _errmsg();
    392 
    393     /**
    394      * Return error string given SQLite error code (SQLite2).
    395      *
    396      * @param error_code the error code
    397      * @return error string
    398      */
    399 
    400     public static native String error_string(int error_code);
    401 
    402     /**
    403      * Set character encoding.
    404      * @param enc name of encoding
    405      */
    406 
    407     public void set_encoding(String enc) throws SQLite.Exception {
    408     synchronized(this) {
    409         _set_encoding(enc);
    410     }
    411     }
    412 
    413     private native void _set_encoding(String enc)
    414     throws SQLite.Exception;
    415 
    416     /**
    417      * Set authorizer function. Only available in SQLite 2.7.6 and
    418      * above, otherwise a no-op.
    419      *
    420      * @param auth the authorizer function
    421      */
    422 
    423     public void set_authorizer(Authorizer auth) {
    424     synchronized(this) {
    425         _set_authorizer(auth);
    426     }
    427     }
    428 
    429     private native void _set_authorizer(Authorizer auth);
    430 
    431     /**
    432      * Set trace function. Only available in SQLite 2.7.6 and above,
    433      * otherwise a no-op.
    434      *
    435      * @param tr the trace function
    436      */
    437 
    438     public void trace(Trace tr) {
    439     synchronized(this) {
    440         _trace(tr);
    441     }
    442     }
    443 
    444     private native void _trace(Trace tr);
    445 
    446     /**
    447      * Compile and return SQLite VM for SQL statement. Only available
    448      * in SQLite 2.8.0 and above, otherwise a no-op.
    449      *
    450      * @param sql SQL statement to be compiled
    451      * @return a Vm object
    452      */
    453 
    454     public Vm compile(String sql) throws SQLite.Exception {
    455     synchronized(this) {
    456         Vm vm = new Vm();
    457         vm_compile(sql, vm);
    458         return vm;
    459     }
    460     }
    461 
    462     /**
    463      * Compile and return SQLite VM for SQL statement. Only available
    464      * in SQLite 3.0 and above, otherwise a no-op.
    465      *
    466      * @param sql SQL statement to be compiled
    467      * @param args arguments for the SQL statement, '%q' substitution
    468      * @return a Vm object
    469      */
    470 
    471     public Vm compile(String sql, String args[]) throws SQLite.Exception {
    472     synchronized(this) {
    473         Vm vm = new Vm();
    474         vm_compile_args(sql, vm, args);
    475         return vm;
    476     }
    477     }
    478 
    479     /**
    480      * Prepare and return SQLite3 statement for SQL. Only available
    481      * in SQLite 3.0 and above, otherwise a no-op.
    482      *
    483      * @param sql SQL statement to be prepared
    484      * @return a Stmt object
    485      */
    486 
    487     public Stmt prepare(String sql) throws SQLite.Exception {
    488     synchronized(this) {
    489         Stmt stmt = new Stmt();
    490         stmt_prepare(sql, stmt);
    491         return stmt;
    492     }
    493     }
    494 
    495     /**
    496      * Open an SQLite3 blob. Only available in SQLite 3.4.0 and above.
    497      * @param db database name
    498      * @param table table name
    499      * @param column column name
    500      * @param row row identifier
    501      * @param rw if true, open for read-write, else read-only
    502      * @return a Blob object
    503      */
    504 
    505     public Blob open_blob(String db, String table, String column,
    506               long row, boolean rw) throws SQLite.Exception {
    507     synchronized(this) {
    508         Blob blob = new Blob();
    509         _open_blob(db, table, column, row, rw, blob);
    510         return blob;
    511     }
    512     }
    513 
    514     /**
    515      * Check type of open database.
    516      * @return true if SQLite3 database
    517      */
    518 
    519     public native boolean is3();
    520 
    521     /**
    522      * Internal compile method.
    523      * @param sql SQL statement
    524      * @param vm Vm object
    525      */
    526 
    527     private native void vm_compile(String sql, Vm vm)
    528     throws SQLite.Exception;
    529 
    530     /**
    531      * Internal compile method, SQLite 3.0 only.
    532      * @param sql SQL statement
    533      * @param args arguments for the SQL statement, '%q' substitution
    534      * @param vm Vm object
    535      */
    536 
    537     private native void vm_compile_args(String sql, Vm vm, String args[])
    538     throws SQLite.Exception;
    539 
    540     /**
    541      * Internal SQLite3 prepare method.
    542      * @param sql SQL statement
    543      * @param stmt Stmt object
    544      */
    545 
    546     private native void stmt_prepare(String sql, Stmt stmt)
    547     throws SQLite.Exception;
    548 
    549     /**
    550      * Internal SQLite open blob method.
    551      * @param db database name
    552      * @param table table name
    553      * @param column column name
    554      * @param row row identifier
    555      * @param rw if true, open for read-write, else read-only
    556      * @param blob Blob object
    557      */
    558 
    559     private native void _open_blob(String db, String table, String column,
    560                    long row, boolean rw, Blob blob)
    561     throws SQLite.Exception;
    562 
    563     /**
    564      * Establish a progress callback method which gets called after
    565      * N SQLite VM opcodes.
    566      *
    567      * @param n number of SQLite VM opcodes until callback is invoked
    568      * @param p the object implementing the progress callback method
    569      */
    570 
    571     public void progress_handler(int n, SQLite.ProgressHandler p) {
    572     synchronized(this) {
    573         _progress_handler(n, p);
    574     }
    575     }
    576 
    577     private native void _progress_handler(int n, SQLite.ProgressHandler p);
    578 
    579     /**
    580      * Internal native initializer.
    581      */
    582 
    583     private static native void internal_init();
    584 
    585     /**
    586      * Static initializer to load the native part.
    587      */
    588 
    589     static {
    590     try {
    591 //        String path = System.getProperty("SQLite.library.path");
    592 //        if (path == null || path.length() == 0){
    593 //        System.loadLibrary("sqlite_jni");
    594 //        } else {
    595 //        try {
    596 //            java.lang.reflect.Method mapLibraryName;
    597 //            Class param[] = new Class[1];
    598 //            param[0] = String.class;
    599 //            mapLibraryName = System.class.getMethod("mapLibraryName",
    600 //                                param);
    601 //            Object args[] = new Object[1];
    602 //            args[0] = "sqlite_jni";
    603 //            String mapped = (String) mapLibraryName.invoke(null, args);
    604 //            System.load(path + java.io.File.separator + mapped);
    605 //        } catch (Throwable t) {
    606 //            System.loadLibrary("sqlite_jni");
    607 //        }
    608 //        }
    609         internal_init();
    610     } catch (Throwable t) {
    611         System.err.println("Unable to load sqlite: " + t);
    612     }
    613     }
    614 }
    615 
    616