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 (e.g. SQLITE_OPEN_READONLY) 26 */ 27 open(String filename, int mode)28 public void open(String filename, int mode) throws SQLite.Exception { 29 if ((mode & 0200) != 0) { 30 mode = SQLite.Constants.SQLITE_OPEN_READWRITE | 31 SQLite.Constants.SQLITE_OPEN_CREATE; 32 } else if ((mode & 0400) != 0) { 33 mode = SQLite.Constants.SQLITE_OPEN_READONLY; 34 } 35 synchronized(this) { 36 try { 37 _open4(filename, mode, null, false); 38 } catch (SQLite.Exception se) { 39 throw se; 40 } catch (java.lang.OutOfMemoryError me) { 41 throw me; 42 } catch (Throwable t) { 43 _open(filename, mode); 44 } 45 } 46 } 47 48 /** 49 * Open an SQLite database file. 50 * 51 * @param filename the name of the database file 52 * @param mode open mode (e.g. SQLITE_OPEN_READONLY) 53 * @param vfs VFS name (for SQLite >= 3.5) 54 */ 55 open(String filename, int mode, String vfs)56 public void open(String filename, int mode, String vfs) 57 throws SQLite.Exception { 58 if ((mode & 0200) != 0) { 59 mode = SQLite.Constants.SQLITE_OPEN_READWRITE | 60 SQLite.Constants.SQLITE_OPEN_CREATE; 61 } else if ((mode & 0400) != 0) { 62 mode = SQLite.Constants.SQLITE_OPEN_READONLY; 63 } 64 synchronized(this) { 65 try { 66 _open4(filename, mode, vfs, false); 67 } catch (SQLite.Exception se) { 68 throw se; 69 } catch (java.lang.OutOfMemoryError me) { 70 throw me; 71 } catch (Throwable t) { 72 _open(filename, mode); 73 } 74 } 75 } 76 77 /** 78 * Open an SQLite database file. 79 * 80 * @param filename the name of the database file 81 * @param mode open mode (e.g. SQLITE_OPEN_READONLY) 82 * @param vfs VFS name (for SQLite >= 3.5) 83 * @param ver2 flag to force version on create (false = SQLite3, true = SQLite2) 84 */ 85 open(String filename, int mode, String vfs, boolean ver2)86 public void open(String filename, int mode, String vfs, boolean ver2) 87 throws SQLite.Exception { 88 if ((mode & 0200) != 0) { 89 mode = SQLite.Constants.SQLITE_OPEN_READWRITE | 90 SQLite.Constants.SQLITE_OPEN_CREATE; 91 } else if ((mode & 0400) != 0) { 92 mode = SQLite.Constants.SQLITE_OPEN_READONLY; 93 } 94 synchronized(this) { 95 try { 96 _open4(filename, mode, vfs, ver2); 97 } catch (SQLite.Exception se) { 98 throw se; 99 } catch (java.lang.OutOfMemoryError me) { 100 throw me; 101 } catch (Throwable t) { 102 _open(filename, mode); 103 } 104 } 105 } 106 107 /* 108 * For backward compatibility to older sqlite.jar, sqlite_jni 109 */ 110 _open(String filename, int mode)111 private native void _open(String filename, int mode) 112 throws SQLite.Exception; 113 114 /* 115 * Newer full interface 116 */ 117 _open4(String filename, int mode, String vfs, boolean ver2)118 private native void _open4(String filename, int mode, String vfs, 119 boolean ver2) 120 throws SQLite.Exception; 121 122 /** 123 * Open SQLite auxiliary database file for temporary 124 * tables. 125 * 126 * @param filename the name of the auxiliary file or null 127 */ 128 open_aux_file(String filename)129 public void open_aux_file(String filename) throws SQLite.Exception { 130 synchronized(this) { 131 _open_aux_file(filename); 132 } 133 } 134 _open_aux_file(String filename)135 private native void _open_aux_file(String filename) 136 throws SQLite.Exception; 137 138 /** 139 * Destructor for object. 140 */ 141 finalize()142 protected void finalize() { 143 synchronized(this) { 144 _finalize(); 145 } 146 } 147 _finalize()148 private native void _finalize(); 149 150 /** 151 * Close the underlying SQLite database file. 152 */ 153 close()154 public void close() throws SQLite.Exception { 155 synchronized(this) { 156 _close(); 157 } 158 } 159 _close()160 private native void _close() 161 throws SQLite.Exception; 162 163 /** 164 * Execute an SQL statement and invoke callback methods 165 * for each row of the result set.<P> 166 * 167 * It the method fails, an SQLite.Exception is thrown and 168 * an error code is set, which later can be retrieved by 169 * the last_error() method. 170 * 171 * @param sql the SQL statement to be executed 172 * @param cb the object implementing the callback methods 173 */ 174 exec(String sql, SQLite.Callback cb)175 public void exec(String sql, SQLite.Callback cb) throws SQLite.Exception { 176 synchronized(this) { 177 _exec(sql, cb); 178 } 179 } 180 _exec(String sql, SQLite.Callback cb)181 private native void _exec(String sql, SQLite.Callback cb) 182 throws SQLite.Exception; 183 184 /** 185 * Execute an SQL statement and invoke callback methods 186 * for each row of the result set. Each '%q' or %Q in the 187 * statement string is substituted by its corresponding 188 * element in the argument vector. 189 * <BR><BR> 190 * Example:<BR> 191 * <PRE> 192 * String args[] = new String[1]; 193 * args[0] = "tab%"; 194 * db.exec("select * from sqlite_master where type like '%q'", 195 * null, args); 196 * </PRE> 197 * 198 * It the method fails, an SQLite.Exception is thrown and 199 * an error code is set, which later can be retrieved by 200 * the last_error() method. 201 * 202 * @param sql the SQL statement to be executed 203 * @param cb the object implementing the callback methods 204 * @param args arguments for the SQL statement, '%q' substitution 205 */ 206 exec(String sql, SQLite.Callback cb, String args[])207 public void exec(String sql, SQLite.Callback cb, 208 String args[]) throws SQLite.Exception { 209 synchronized(this) { 210 _exec(sql, cb, args); 211 } 212 } 213 _exec(String sql, SQLite.Callback cb, String args[])214 private native void _exec(String sql, SQLite.Callback cb, String args[]) 215 throws SQLite.Exception; 216 217 /** 218 * Return the row identifier of the last inserted 219 * row. 220 */ 221 last_insert_rowid()222 public long last_insert_rowid() { 223 synchronized(this) { 224 return _last_insert_rowid(); 225 } 226 } 227 _last_insert_rowid()228 private native long _last_insert_rowid(); 229 230 /** 231 * Abort the current SQLite operation. 232 */ 233 interrupt()234 public void interrupt() { 235 synchronized(this) { 236 _interrupt(); 237 } 238 } 239 _interrupt()240 private native void _interrupt(); 241 242 /** 243 * Return the number of changed rows for the last statement. 244 */ 245 changes()246 public long changes() { 247 synchronized(this) { 248 return _changes(); 249 } 250 } 251 _changes()252 private native long _changes(); 253 254 /** 255 * Establish a busy callback method which gets called when 256 * an SQLite table is locked. 257 * 258 * @param bh the object implementing the busy callback method 259 */ 260 busy_handler(SQLite.BusyHandler bh)261 public void busy_handler(SQLite.BusyHandler bh) { 262 synchronized(this) { 263 _busy_handler(bh); 264 } 265 } 266 _busy_handler(SQLite.BusyHandler bh)267 private native void _busy_handler(SQLite.BusyHandler bh); 268 269 /** 270 * Set the timeout for waiting for an SQLite table to become 271 * unlocked. 272 * 273 * @param ms number of millisecond to wait 274 */ 275 busy_timeout(int ms)276 public void busy_timeout(int ms) { 277 synchronized(this) { 278 _busy_timeout(ms); 279 } 280 } 281 _busy_timeout(int ms)282 private native void _busy_timeout(int ms); 283 284 /** 285 * Convenience method to retrieve an entire result 286 * set into memory. 287 * 288 * @param sql the SQL statement to be executed 289 * @param maxrows the max. number of rows to retrieve 290 * @return result set 291 */ 292 get_table(String sql, int maxrows)293 public TableResult get_table(String sql, int maxrows) 294 throws SQLite.Exception { 295 TableResult ret = new TableResult(maxrows); 296 if (!is3()) { 297 try { 298 exec(sql, ret); 299 } catch (SQLite.Exception e) { 300 if (maxrows <= 0 || !ret.atmaxrows) { 301 throw e; 302 } 303 } 304 } else { 305 synchronized(this) { 306 /* only one statement !!! */ 307 Vm vm = compile(sql); 308 set_last_error(vm.error_code); 309 if (ret.maxrows > 0) { 310 while (ret.nrows < ret.maxrows && vm.step(ret)) { 311 set_last_error(vm.error_code); 312 } 313 } else { 314 while (vm.step(ret)) { 315 set_last_error(vm.error_code); 316 } 317 } 318 vm.finalize(); 319 } 320 } 321 return ret; 322 } 323 324 /** 325 * Convenience method to retrieve an entire result 326 * set into memory. 327 * 328 * @param sql the SQL statement to be executed 329 * @return result set 330 */ 331 get_table(String sql)332 public TableResult get_table(String sql) throws SQLite.Exception { 333 return get_table(sql, 0); 334 } 335 336 /** 337 * Convenience method to retrieve an entire result 338 * set into memory. 339 * 340 * @param sql the SQL statement to be executed 341 * @param maxrows the max. number of rows to retrieve 342 * @param args arguments for the SQL statement, '%q' substitution 343 * @return result set 344 */ 345 get_table(String sql, int maxrows, String args[])346 public TableResult get_table(String sql, int maxrows, String args[]) 347 throws SQLite.Exception { 348 TableResult ret = new TableResult(maxrows); 349 if (!is3()) { 350 try { 351 exec(sql, ret, args); 352 } catch (SQLite.Exception e) { 353 if (maxrows <= 0 || !ret.atmaxrows) { 354 throw e; 355 } 356 } 357 } else { 358 synchronized(this) { 359 /* only one statement !!! */ 360 Vm vm = compile(sql, args); 361 set_last_error(vm.error_code); 362 if (ret.maxrows > 0) { 363 while (ret.nrows < ret.maxrows && vm.step(ret)) { 364 set_last_error(vm.error_code); 365 } 366 } else { 367 while (vm.step(ret)) { 368 set_last_error(vm.error_code); 369 } 370 } 371 vm.finalize(); 372 } 373 } 374 return ret; 375 } 376 377 /** 378 * Convenience method to retrieve an entire result 379 * set into memory. 380 * 381 * @param sql the SQL statement to be executed 382 * @param args arguments for the SQL statement, '%q' substitution 383 * @return result set 384 */ 385 get_table(String sql, String args[])386 public TableResult get_table(String sql, String args[]) 387 throws SQLite.Exception { 388 return get_table(sql, 0, args); 389 } 390 391 /** 392 * Convenience method to retrieve an entire result 393 * set into memory. 394 * 395 * @param sql the SQL statement to be executed 396 * @param args arguments for the SQL statement, '%q' substitution 397 * @param tbl TableResult to receive result set 398 * @return result set 399 */ 400 get_table(String sql, String args[], TableResult tbl)401 public void get_table(String sql, String args[], TableResult tbl) 402 throws SQLite.Exception { 403 tbl.clear(); 404 if (!is3()) { 405 try { 406 exec(sql, tbl, args); 407 } catch (SQLite.Exception e) { 408 if (tbl.maxrows <= 0 || !tbl.atmaxrows) { 409 throw e; 410 } 411 } 412 } else { 413 synchronized(this) { 414 /* only one statement !!! */ 415 Vm vm = compile(sql, args); 416 if (tbl.maxrows > 0) { 417 while (tbl.nrows < tbl.maxrows && vm.step(tbl)) { 418 set_last_error(vm.error_code); 419 } 420 } else { 421 while (vm.step(tbl)) { 422 set_last_error(vm.error_code); 423 } 424 } 425 vm.finalize(); 426 } 427 } 428 } 429 430 /** 431 * See if an SQL statement is complete. 432 * Returns true if the input string comprises 433 * one or more complete SQL statements. 434 * 435 * @param sql the SQL statement to be checked 436 */ 437 complete(String sql)438 public synchronized static boolean complete(String sql) { 439 return _complete(sql); 440 } 441 _complete(String sql)442 private native static boolean _complete(String sql); 443 444 /** 445 * Return SQLite version number as string. 446 * Don't rely on this when both SQLite 2 and 3 are compiled 447 * into the native part. Use the class method in this case. 448 */ 449 version()450 public native static String version(); 451 452 /** 453 * Return SQLite version number as string. 454 * If the database is not open, <tt>unknown</tt> is returned. 455 */ 456 dbversion()457 public native String dbversion(); 458 459 /** 460 * Create regular function. 461 * 462 * @param name the name of the new function 463 * @param nargs number of arguments to function 464 * @param f interface of function 465 */ 466 create_function(String name, int nargs, Function f)467 public void create_function(String name, int nargs, Function f) { 468 synchronized(this) { 469 _create_function(name, nargs, f); 470 } 471 } 472 _create_function(String name, int nargs, Function f)473 private native void _create_function(String name, int nargs, Function f); 474 475 /** 476 * Create aggregate function. 477 * 478 * @param name the name of the new function 479 * @param nargs number of arguments to function 480 * @param f interface of function 481 */ 482 create_aggregate(String name, int nargs, Function f)483 public void create_aggregate(String name, int nargs, Function f) { 484 synchronized(this) { 485 _create_aggregate(name, nargs, f); 486 } 487 } 488 _create_aggregate(String name, int nargs, Function f)489 private native void _create_aggregate(String name, int nargs, Function f); 490 491 /** 492 * Set function return type. Only available in SQLite 2.6.0 and 493 * above, otherwise a no-op. 494 * 495 * @param name the name of the function whose return type is to be set 496 * @param type return type code, e.g. SQLite.Constants.SQLITE_NUMERIC 497 */ 498 function_type(String name, int type)499 public void function_type(String name, int type) { 500 synchronized(this) { 501 _function_type(name, type); 502 } 503 } 504 _function_type(String name, int type)505 private native void _function_type(String name, int type); 506 507 /** 508 * Return the code of the last error occured in 509 * any of the exec() methods. The value is valid 510 * after an Exception has been reported by one of 511 * these methods. See the <A HREF="Constants.html">Constants</A> 512 * class for possible values. 513 * 514 * @return SQLite error code 515 */ 516 last_error()517 public int last_error() { 518 return error_code; 519 } 520 521 /** 522 * Internal: set error code. 523 * @param error_code new error code 524 */ 525 set_last_error(int error_code)526 protected void set_last_error(int error_code) { 527 this.error_code = error_code; 528 } 529 530 /** 531 * Return last error message of SQLite3 engine. 532 * 533 * @return error string or null 534 */ 535 error_message()536 public String error_message() { 537 synchronized(this) { 538 return _errmsg(); 539 } 540 } 541 _errmsg()542 private native String _errmsg(); 543 544 /** 545 * Return error string given SQLite error code (SQLite2). 546 * 547 * @param error_code the error code 548 * @return error string 549 */ 550 error_string(int error_code)551 public static native String error_string(int error_code); 552 553 /** 554 * Set character encoding. 555 * @param enc name of encoding 556 */ 557 set_encoding(String enc)558 public void set_encoding(String enc) throws SQLite.Exception { 559 synchronized(this) { 560 _set_encoding(enc); 561 } 562 } 563 _set_encoding(String enc)564 private native void _set_encoding(String enc) 565 throws SQLite.Exception; 566 567 /** 568 * Set authorizer function. Only available in SQLite 2.7.6 and 569 * above, otherwise a no-op. 570 * 571 * @param auth the authorizer function 572 */ 573 set_authorizer(Authorizer auth)574 public void set_authorizer(Authorizer auth) { 575 synchronized(this) { 576 _set_authorizer(auth); 577 } 578 } 579 _set_authorizer(Authorizer auth)580 private native void _set_authorizer(Authorizer auth); 581 582 /** 583 * Set trace function. Only available in SQLite 2.7.6 and above, 584 * otherwise a no-op. 585 * 586 * @param tr the trace function 587 */ 588 trace(Trace tr)589 public void trace(Trace tr) { 590 synchronized(this) { 591 _trace(tr); 592 } 593 } 594 _trace(Trace tr)595 private native void _trace(Trace tr); 596 597 /** 598 * Compile and return SQLite VM for SQL statement. Only available 599 * in SQLite 2.8.0 and above, otherwise a no-op. 600 * 601 * @param sql SQL statement to be compiled 602 * @return a Vm object 603 */ 604 compile(String sql)605 public Vm compile(String sql) throws SQLite.Exception { 606 synchronized(this) { 607 Vm vm = new Vm(); 608 vm_compile(sql, vm); 609 return vm; 610 } 611 } 612 613 /** 614 * Compile and return SQLite VM for SQL statement. Only available 615 * in SQLite 3.0 and above, otherwise a no-op. 616 * 617 * @param sql SQL statement to be compiled 618 * @param args arguments for the SQL statement, '%q' substitution 619 * @return a Vm object 620 */ 621 compile(String sql, String args[])622 public Vm compile(String sql, String args[]) throws SQLite.Exception { 623 synchronized(this) { 624 Vm vm = new Vm(); 625 vm_compile_args(sql, vm, args); 626 return vm; 627 } 628 } 629 630 /** 631 * Prepare and return SQLite3 statement for SQL. Only available 632 * in SQLite 3.0 and above, otherwise a no-op. 633 * 634 * @param sql SQL statement to be prepared 635 * @return a Stmt object 636 */ 637 prepare(String sql)638 public Stmt prepare(String sql) throws SQLite.Exception { 639 synchronized(this) { 640 Stmt stmt = new Stmt(); 641 stmt_prepare(sql, stmt); 642 return stmt; 643 } 644 } 645 646 /** 647 * Open an SQLite3 blob. Only available in SQLite 3.4.0 and above. 648 * @param db database name 649 * @param table table name 650 * @param column column name 651 * @param row row identifier 652 * @param rw if true, open for read-write, else read-only 653 * @return a Blob object 654 */ 655 open_blob(String db, String table, String column, long row, boolean rw)656 public Blob open_blob(String db, String table, String column, 657 long row, boolean rw) throws SQLite.Exception { 658 synchronized(this) { 659 Blob blob = new Blob(); 660 _open_blob(db, table, column, row, rw, blob); 661 return blob; 662 } 663 } 664 665 /** 666 * Check type of open database. 667 * @return true if SQLite3 database 668 */ 669 is3()670 public native boolean is3(); 671 672 /** 673 * Internal compile method. 674 * @param sql SQL statement 675 * @param vm Vm object 676 */ 677 vm_compile(String sql, Vm vm)678 private native void vm_compile(String sql, Vm vm) 679 throws SQLite.Exception; 680 681 /** 682 * Internal compile method, SQLite 3.0 only. 683 * @param sql SQL statement 684 * @param args arguments for the SQL statement, '%q' substitution 685 * @param vm Vm object 686 */ 687 vm_compile_args(String sql, Vm vm, String args[])688 private native void vm_compile_args(String sql, Vm vm, String args[]) 689 throws SQLite.Exception; 690 691 /** 692 * Internal SQLite3 prepare method. 693 * @param sql SQL statement 694 * @param stmt Stmt object 695 */ 696 stmt_prepare(String sql, Stmt stmt)697 private native void stmt_prepare(String sql, Stmt stmt) 698 throws SQLite.Exception; 699 700 /** 701 * Internal SQLite open blob method. 702 * @param db database name 703 * @param table table name 704 * @param column column name 705 * @param row row identifier 706 * @param rw if true, open for read-write, else read-only 707 * @param blob Blob object 708 */ 709 _open_blob(String db, String table, String column, long row, boolean rw, Blob blob)710 private native void _open_blob(String db, String table, String column, 711 long row, boolean rw, Blob blob) 712 throws SQLite.Exception; 713 714 /** 715 * Establish a progress callback method which gets called after 716 * N SQLite VM opcodes. 717 * 718 * @param n number of SQLite VM opcodes until callback is invoked 719 * @param p the object implementing the progress callback method 720 */ 721 progress_handler(int n, SQLite.ProgressHandler p)722 public void progress_handler(int n, SQLite.ProgressHandler p) { 723 synchronized(this) { 724 _progress_handler(n, p); 725 } 726 } 727 _progress_handler(int n, SQLite.ProgressHandler p)728 private native void _progress_handler(int n, SQLite.ProgressHandler p); 729 730 /** 731 * Specify key for encrypted database. To be called 732 * right after open() on SQLite3 databases. 733 * Not available in public releases of SQLite. 734 * 735 * @param ekey the key as byte array 736 */ 737 key(byte[] ekey)738 public void key(byte[] ekey) throws SQLite.Exception { 739 synchronized(this) { 740 _key(ekey); 741 } 742 } 743 744 /** 745 * Specify key for encrypted database. To be called 746 * right after open() on SQLite3 databases. 747 * Not available in public releases of SQLite. 748 * 749 * @param skey the key as String 750 */ 751 key(String skey)752 public void key(String skey) throws SQLite.Exception { 753 synchronized(this) { 754 byte ekey[] = null; 755 if (skey != null && skey.length() > 0) { 756 ekey = new byte[skey.length()]; 757 for (int i = 0; i< skey.length(); i++) { 758 char c = skey.charAt(i); 759 ekey[i] = (byte) ((c & 0xff) ^ (c >> 8)); 760 } 761 } 762 _key(ekey); 763 } 764 } 765 _key(byte[] ekey)766 private native void _key(byte[] ekey); 767 768 /** 769 * Change the key of a encrypted database. The 770 * SQLite3 database must have been open()ed. 771 * Not available in public releases of SQLite. 772 * 773 * @param ekey the key as byte array 774 */ 775 rekey(byte[] ekey)776 public void rekey(byte[] ekey) throws SQLite.Exception { 777 synchronized(this) { 778 _rekey(ekey); 779 } 780 } 781 782 /** 783 * Change the key of a encrypted database. The 784 * SQLite3 database must have been open()ed. 785 * Not available in public releases of SQLite. 786 * 787 * @param skey the key as String 788 */ 789 rekey(String skey)790 public void rekey(String skey) throws SQLite.Exception { 791 synchronized(this) { 792 byte ekey[] = null; 793 if (skey != null && skey.length() > 0) { 794 ekey = new byte[skey.length()]; 795 for (int i = 0; i< skey.length(); i++) { 796 char c = skey.charAt(i); 797 ekey[i] = (byte) ((c & 0xff) ^ (c >> 8)); 798 } 799 } 800 _rekey(ekey); 801 } 802 } 803 _rekey(byte[] ekey)804 private native void _rekey(byte[] ekey); 805 806 /** 807 * Enable/disable shared cache mode (SQLite 3.x only). 808 * 809 * @param onoff boolean to enable or disable shared cache 810 * @return boolean when true, function supported/succeeded 811 */ 812 _enable_shared_cache(boolean onoff)813 protected static native boolean _enable_shared_cache(boolean onoff); 814 815 /** 816 * Internal native initializer. 817 */ 818 internal_init()819 private static native void internal_init(); 820 821 /** 822 * Make long value from julian date for java.lang.Date 823 * 824 * @param d double value (julian date in SQLite3 format) 825 * @return long 826 */ 827 long_from_julian(double d)828 public static long long_from_julian(double d) { 829 d -= 2440587.5; 830 d *= 86400000.0; 831 return (long) d; 832 } 833 834 /** 835 * Make long value from julian date for java.lang.Date 836 * 837 * @param s string (double value) (julian date in SQLite3 format) 838 * @return long 839 */ 840 long_from_julian(String s)841 public static long long_from_julian(String s) throws SQLite.Exception { 842 try { 843 double d = Double.parseDouble(s); // android-changed: performance 844 return long_from_julian(d); 845 } catch (java.lang.Exception ee) { 846 throw new SQLite.Exception("not a julian date"); 847 } 848 } 849 850 /** 851 * Make julian date value from java.lang.Date 852 * 853 * @param ms millisecond value of java.lang.Date 854 * @return double 855 */ 856 julian_from_long(long ms)857 public static double julian_from_long(long ms) { 858 double adj = (ms < 0) ? 0 : 0.5; 859 double d = (ms + adj) / 86400000.0 + 2440587.5; 860 return d; 861 } 862 863 /** 864 * Static initializer to load the native part. 865 */ 866 867 static { 868 try { 869 String path = System.getProperty("SQLite.library.path"); 870 if (path == null || path.length() == 0) { 871 System.loadLibrary("sqlite_jni"); 872 } else { 873 try { 874 java.lang.reflect.Method mapLibraryName; 875 Class param[] = new Class[1]; 876 param[0] = String.class; 877 mapLibraryName = System.class.getMethod("mapLibraryName", 878 param); 879 Object args[] = new Object[1]; 880 args[0] = "sqlite_jni"; 881 String mapped = (String) mapLibraryName.invoke(null, args); 882 System.load(path + java.io.File.separator + mapped); 883 } catch (Throwable t) { 884 System.err.println("Unable to load sqlite_jni from" + 885 "SQLite.library.path=" + path + 886 ", trying system default: " + t); 887 System.loadLibrary("sqlite_jni"); 888 } 889 } 890 } catch (Throwable t) { 891 System.err.println("Unable to load sqlite_jni: " + t); 892 } 893 /* 894 * Call native initializer functions now, since the 895 * native part could have been linked statically, i.e. 896 * the try/catch above would have failed in that case. 897 */ 898 try { internal_init()899 internal_init(); FunctionContext()900 new FunctionContext(); 901 } catch (java.lang.Exception e) { 902 } 903 } 904 } 905 906