]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add many more high-level wrappers to the JNI wrapper1 API. Correct the JNI bindings...
authorstephan <stephan@noemail.net>
Mon, 23 Oct 2023 01:34:17 +0000 (01:34 +0000)
committerstephan <stephan@noemail.net>
Mon, 23 Oct 2023 01:34:17 +0000 (01:34 +0000)
FossilOrigin-Name: 55c4b1dc402b358d53d65fa1f6ec063e9e38e95c81a05d98dae3cb58c52ef55c

ext/jni/src/c/sqlite3-jni.c
ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
manifest
manifest.uuid

index 86a4930917b2dd7d31bd83d0d7a8ee6b26a10af1..ed89b86e8b1d1bc48c0d1653a299eb74c3664afa 100644 (file)
@@ -2182,7 +2182,9 @@ S3JniApi(sqlite3_aggregate_context(),jlong,1aggregate_1context)(
   return S3JniCast_P2L(p);
 }
 
-/* Central auto-extension handler. */
+/*
+** Central auto-extension runner for auto-extensions created in Java.
+*/
 static int s3jni_run_java_auto_extensions(sqlite3 *pDb, const char **pzErr,
                                           const struct sqlite3_api_routines *ignored){
   int rc = 0;
@@ -3537,9 +3539,16 @@ S3JniApi(sqlite3_errmsg(),jstring,1errmsg)(
 S3JniApi(sqlite3_errstr(),jstring,1errstr)(
   JniArgsEnvClass, jint rcCode
 ){
-  jstring const rv = (*env)->NewStringUTF(env, sqlite3_errstr((int)rcCode))
-    /* We know these values to be plain ASCII, so pose no MUTF-8
-    ** incompatibility */;
+  jstring rv;
+  const char * z = sqlite3_errstr((int)rcCode);
+  if( !z ){
+    /* This hypothetically cannot happen, but we'll behave like the
+       low-level library would in such a case... */
+    z = "unknown error";
+  }
+  rv = (*env)->NewStringUTF(env, z)
+      /* We know these values to be plain ASCII, so pose no MUTF-8
+      ** incompatibility */;
   s3jni_oom_check( rv );
   return rv;
 }
@@ -4615,7 +4624,7 @@ static int s3jni_strlike_glob(int isLike, JNIEnv *const env,
                               jbyteArray baG, jbyteArray baT, jint escLike){
   int rc = 0;
   jbyte * const pG = s3jni_jbyteArray_bytes(baG);
-  jbyte * const pT = pG ? s3jni_jbyteArray_bytes(baT) : 0;
+  jbyte * const pT = s3jni_jbyteArray_bytes(baT);
 
   /* Note that we're relying on the byte arrays having been
      NUL-terminated on the Java side. */
index 016eb0b89c45767e6cf4549ee2b4d3a06e8756eb..b464bd7d5c185d8daf11f1b08e3a8bcce0454b99 100644 (file)
@@ -32,6 +32,34 @@ public final class Sqlite implements AutoCloseable  {
   public static final int OPEN_READWRITE = CApi.SQLITE_OPEN_READWRITE;
   public static final int OPEN_CREATE = CApi.SQLITE_OPEN_CREATE;
   public static final int OPEN_EXRESCODE = CApi.SQLITE_OPEN_EXRESCODE;
+  public static final int TXN_NONE = CApi.SQLITE_TXN_NONE;
+  public static final int TXN_READ = CApi.SQLITE_TXN_READ;
+  public static final int TXN_WRITE = CApi.SQLITE_TXN_WRITE;
+
+  public static final int STATUS_MEMORY_USED = CApi.SQLITE_STATUS_MEMORY_USED;
+  public static final int STATUS_PAGECACHE_USED = CApi.SQLITE_STATUS_PAGECACHE_USED;
+  public static final int STATUS_PAGECACHE_OVERFLOW = CApi.SQLITE_STATUS_PAGECACHE_OVERFLOW;
+  public static final int STATUS_MALLOC_SIZE = CApi.SQLITE_STATUS_MALLOC_SIZE;
+  public static final int STATUS_PARSER_STACK = CApi.SQLITE_STATUS_PARSER_STACK;
+  public static final int STATUS_PAGECACHE_SIZE = CApi.SQLITE_STATUS_PAGECACHE_SIZE;
+  public static final int STATUS_MALLOC_COUNT = CApi.SQLITE_STATUS_MALLOC_COUNT;
+
+  public static final int LIMIT_LENGTH = CApi.SQLITE_LIMIT_LENGTH;
+  public static final int LIMIT_SQL_LENGTH = CApi.SQLITE_LIMIT_SQL_LENGTH;
+  public static final int LIMIT_COLUMN = CApi.SQLITE_LIMIT_COLUMN;
+  public static final int LIMIT_EXPR_DEPTH = CApi.SQLITE_LIMIT_EXPR_DEPTH;
+  public static final int LIMIT_COMPOUND_SELECT = CApi.SQLITE_LIMIT_COMPOUND_SELECT;
+  public static final int LIMIT_VDBE_OP = CApi.SQLITE_LIMIT_VDBE_OP;
+  public static final int LIMIT_FUNCTION_ARG = CApi.SQLITE_LIMIT_FUNCTION_ARG;
+  public static final int LIMIT_ATTACHED = CApi.SQLITE_LIMIT_ATTACHED;
+  public static final int LIMIT_LIKE_PATTERN_LENGTH = CApi.SQLITE_LIMIT_LIKE_PATTERN_LENGTH;
+  public static final int LIMIT_VARIABLE_NUMBER = CApi.SQLITE_LIMIT_VARIABLE_NUMBER;
+  public static final int LIMIT_TRIGGER_DEPTH = CApi.SQLITE_LIMIT_TRIGGER_DEPTH;
+  public static final int LIMIT_WORKER_THREADS = CApi.SQLITE_LIMIT_WORKER_THREADS;
+
+  public static final int PREPARE_PERSISTENT = CApi.SQLITE_PREPARE_PERSISTENT;
+  public static final int PREPARE_NORMALIZE = CApi.SQLITE_PREPARE_NORMALIZE;
+  public static final int PREPARE_NO_VTAB = CApi.SQLITE_PREPARE_NO_VTAB;
 
   //! Used only by the open() factory functions.
   private Sqlite(sqlite3 db){
@@ -67,6 +95,33 @@ public final class Sqlite implements AutoCloseable  {
     return open(filename, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, null);
   }
 
+  public static String libVersion(){
+    return CApi.sqlite3_libversion();
+  }
+
+  public static int libVersionNumber(){
+    return CApi.sqlite3_libversion_number();
+  }
+
+  public static String libSourceId(){
+    return CApi.sqlite3_sourceid();
+  }
+
+  /**
+     As per sqlite3_status64(), but returns its current and high-water
+     results as a two-element array. Throws if the first argument is
+     not one of the STATUS_... constants.
+  */
+  public long[] libStatus(int op, boolean resetStats){
+    org.sqlite.jni.capi.OutputPointer.Int64 pCurrent =
+      new org.sqlite.jni.capi.OutputPointer.Int64();
+    org.sqlite.jni.capi.OutputPointer.Int64 pHighwater =
+      new org.sqlite.jni.capi.OutputPointer.Int64();
+    final int rc = CApi.sqlite3_status64(op, pCurrent, pHighwater, resetStats);
+    checkRc(rc);
+    return new long[] {pCurrent.value, pHighwater.value};
+  }
+
   @Override public void close(){
     if(null!=this.db){
       this.db.close();
@@ -74,6 +129,22 @@ public final class Sqlite implements AutoCloseable  {
     }
   }
 
+  /**
+     Returns the value of the native library's build-time value of the
+     SQLITE_THREADSAFE build option.
+  */
+  public static int libThreadsafe(){
+    return CApi.sqlite3_threadsafe();
+  }
+
+  public static boolean strglob(String glob, String txt){
+    return 0==CApi.sqlite3_strglob(glob, txt);
+  }
+
+  public static boolean strlike(String glob, String txt, char escChar){
+    return 0==CApi.sqlite3_strlike(glob, txt, escChar);
+  }
+
   /**
      Returns this object's underlying native db handle, or null if
      this instance has been closed. This is very specifically not
@@ -94,17 +165,21 @@ public final class Sqlite implements AutoCloseable  {
 
   /**
      If rc!=0, throws an SqliteException. If this db is currently
-     opened, the error state is extracted from it, else only the
-     string form of rc is used.
+     opened and has non-0 sqlite3_errcode(), the error state is
+     extracted from it, else only the string form of rc is used. It is
+     the caller's responsibility to filter out non-error codes such as
+     SQLITE_ROW and SQLITE_DONE before calling this.
   */
-  private void affirmRcOk(int rc){
+  private void checkRc(int rc){
     if( 0!=rc ){
-      if( null==db ) throw new SqliteException(rc);
+      if( null==db || 0==sqlite3_errcode(db)) throw new SqliteException(rc);
       else throw new SqliteException(db);
     }
   }
 
   /**
+     prepFlags must be 0 or a bitmask of the PREPARE_... constants.
+
      prepare() TODOs include:
 
      - overloads taking byte[] and ByteBuffer.
@@ -116,8 +191,20 @@ public final class Sqlite implements AutoCloseable  {
   public Stmt prepare(String sql, int prepFlags){
     final OutputPointer.sqlite3_stmt out = new OutputPointer.sqlite3_stmt();
     final int rc = sqlite3_prepare_v3(thisDb(), sql, prepFlags, out);
-    affirmRcOk(rc);
-    return new Stmt(this, out.take());
+    checkRc(rc);
+    final sqlite3_stmt q = out.take();
+    if( null==q ){
+      /* The C-level API treats input which is devoid of SQL
+         statements (e.g. all comments or an empty string) as success
+         but returns a NULL sqlite3_stmt object. In higher-level APIs,
+         wrapping a "successful NULL" object that way is tedious to
+         use because it forces clients and/or wrapper-level code to
+         check for that unusual case. In practice, higher-level
+         bindings are generally better-served by treating empty SQL
+         input as an error. */
+      throw new IllegalArgumentException("Input contains no SQL statements.");
+    }
+    return new Stmt(this, q);
   }
 
   public Stmt prepare(String sql){
@@ -154,6 +241,183 @@ public final class Sqlite implements AutoCloseable  {
     this.createFunction(name, nArg, CApi.SQLITE_UTF8, f);
   }
 
+  public long changes(){
+    return CApi.sqlite3_changes64(thisDb());
+  }
+
+  public long totalChanges(){
+    return CApi.sqlite3_total_changes64(thisDb());
+  }
+
+  public long lastInsertRowId(){
+    return CApi.sqlite3_last_insert_rowid(thisDb());
+  }
+
+  public void setLastInsertRowId(long rowId){
+    CApi.sqlite3_set_last_insert_rowid(thisDb(), rowId);
+  }
+
+  public void interrupt(){
+    CApi.sqlite3_interrupt(thisDb());
+  }
+
+  public boolean isInterrupted(){
+    return CApi.sqlite3_is_interrupted(thisDb());
+  }
+
+  public boolean isAutoCommit(){
+    return CApi.sqlite3_get_autocommit(thisDb());
+  }
+
+  public void setBusyTimeout(int ms){
+    checkRc(CApi.sqlite3_busy_timeout(thisDb(), ms));
+  }
+
+  /**
+     Analog to sqlite3_txn_state(). Returns one of TXN_NONE, TXN_READ,
+     or TXN_WRITE to denote this database's current transaction state
+     for the given schema name (or the most restrictive state of any
+     schema if zSchema is null).
+  */
+  public int transactionState(String zSchema){
+    return CApi.sqlite3_txn_state(thisDb(), zSchema);
+  }
+
+  /**
+     Analog to sqlite3_db_name(). Returns null if passed an unknown
+     index.
+  */
+  public String dbName(int dbNdx){
+    return CApi.sqlite3_db_name(thisDb(), dbNdx);
+  }
+
+  /**
+     Analog to sqlite3_db_filename(). Returns null if passed an
+     unknown db name.
+  */
+  public String dbFileName(String dbName){
+    return CApi.sqlite3_db_filename(thisDb(), dbName);
+  }
+
+  /**
+     Analog to the variant of sqlite3_db_config() for configuring the
+     SQLITE_DBCONFIG_MAINDBNAME option. Throws on error.
+  */
+  public void setMainDbName(String name){
+    checkRc(
+      CApi.sqlite3_db_config(thisDb(), CApi.SQLITE_DBCONFIG_MAINDBNAME,
+                             name)
+    );
+  }
+
+  /**
+     Analog to sqlite3_db_readonly() but throws an SqliteException
+     with result code SQLITE_NOTFOUND if given an unknown database
+     name.
+  */
+  public boolean readOnly(String dbName){
+    final int rc = CApi.sqlite3_db_readonly(thisDb(), dbName);
+    if( 0==rc ) return false;
+    else if( rc>0 ) return true;
+    throw new SqliteException(CApi.SQLITE_NOTFOUND);
+  }
+
+  /**
+     Analog to sqlite3_db_release_memory().
+  */
+  public void releaseMemory(){
+    CApi.sqlite3_db_release_memory(thisDb());
+  }
+
+  /**
+     Analog to sqlite3_release_memory().
+  */
+  public static int releaseMemory(int n){
+    return CApi.sqlite3_release_memory(n);
+  }
+
+  /**
+     Analog to sqlite3_limit(). limitId must be one of the
+     LIMIT_... constants.
+
+     Returns the old limit for the given option. If newLimit is
+     negative, it returns the old limit without modifying the limit.
+
+     If sqlite3_limit() returns a negative value, this function throws
+     an SqliteException with the SQLITE_RANGE result code but no
+     further error info (because that case does not qualify as a
+     db-level error). Such errors may indicate an invalid argument
+     value or an invalid range for newLimit (the underlying function
+     does not differentiate between those).
+  */
+  public int limit(int limitId, int newLimit){
+    final int rc = CApi.sqlite3_limit(thisDb(), limitId, newLimit);
+    if( rc<0 ){
+      throw new SqliteException(CApi.SQLITE_RANGE);
+    }
+    return rc;
+  }
+
+  /**
+     Analog to sqlite3_errstr().
+  */
+  static String errstr(int resultCode){
+    return CApi.sqlite3_errstr(resultCode);
+  }
+
+  /**
+     A wrapper object for use with tableColumnMetadata().  They are
+     created and populated only via that interface.
+  */
+  public final class TableColumnMetadata {
+    Boolean pNotNull = null;
+    Boolean pPrimaryKey = null;
+    Boolean pAutoinc = null;
+    String pzCollSeq = null;
+    String pzDataType = null;
+
+    private TableColumnMetadata(){}
+
+    public String getDataType(){ return pzDataType; }
+    public String getCollation(){ return pzCollSeq; }
+    public boolean isNotNull(){ return pNotNull; }
+    public boolean isPrimaryKey(){ return pPrimaryKey; }
+    public boolean isAutoincrement(){ return pAutoinc; }
+  }
+
+  /**
+     Returns data about a database, table, and (optionally) column
+     (which may be null), as per sqlite3_table_column_metadata().
+     Throws if passed invalid arguments, else returns the result as a
+     new TableColumnMetadata object.
+  */
+  TableColumnMetadata tableColumnMetadata(
+    String zDbName, String zTableName, String zColumnName
+  ){
+    org.sqlite.jni.capi.OutputPointer.String pzDataType
+      = new org.sqlite.jni.capi.OutputPointer.String();
+    org.sqlite.jni.capi.OutputPointer.String pzCollSeq
+      = new org.sqlite.jni.capi.OutputPointer.String();
+    org.sqlite.jni.capi.OutputPointer.Bool pNotNull
+      = new org.sqlite.jni.capi.OutputPointer.Bool();
+    org.sqlite.jni.capi.OutputPointer.Bool pPrimaryKey
+      = new org.sqlite.jni.capi.OutputPointer.Bool();
+    org.sqlite.jni.capi.OutputPointer.Bool pAutoinc
+      = new org.sqlite.jni.capi.OutputPointer.Bool();
+    final int rc = CApi.sqlite3_table_column_metadata(
+      thisDb(), zDbName, zTableName, zColumnName,
+      pzDataType, pzCollSeq, pNotNull, pPrimaryKey, pAutoinc
+    );
+    checkRc(rc);
+    TableColumnMetadata rv = new TableColumnMetadata();
+    rv.pzDataType = pzDataType.value;
+    rv.pzCollSeq = pzCollSeq.value;
+    rv.pNotNull = pNotNull.value;
+    rv.pPrimaryKey = pPrimaryKey.value;
+    rv.pAutoinc = pAutoinc.value;
+    return rv;
+  }
+
   /**
      Corresponds to the sqlite3_stmt class. Use Sqlite.prepare() to
      create new instances.
index 111f004db44cbc3b158c023309fb18ae8c00d8f9..27cfc0e6bb703d88f8cc5fdf7b25996e86528e78 100644 (file)
@@ -12,7 +12,7 @@
 ** This file is part of the wrapper1 interface for sqlite3.
 */
 package org.sqlite.jni.wrapper1;
-import static org.sqlite.jni.capi.CApi.*;
+import org.sqlite.jni.capi.CApi;
 import org.sqlite.jni.capi.sqlite3;
 
 /**
@@ -22,10 +22,10 @@ import org.sqlite.jni.capi.sqlite3;
    and C via JNI.
 */
 public final class SqliteException extends java.lang.RuntimeException {
-  int errCode = SQLITE_ERROR;
-  int xerrCode = SQLITE_ERROR;
-  int errOffset = -1;
-  int sysErrno = 0;
+  private int errCode = CApi.SQLITE_ERROR;
+  private int xerrCode = CApi.SQLITE_ERROR;
+  private int errOffset = -1;
+  private int sysErrno = 0;
 
   /**
      Records the given error string and uses SQLITE_ERROR for both the
@@ -38,10 +38,13 @@ public final class SqliteException extends java.lang.RuntimeException {
   /**
      Uses sqlite3_errstr(sqlite3ResultCode) for the error string and
      sets both the error code and extended error code to the given
-     value.
+     value. This approach includes no database-level information and
+     systemErrno() will be 0, so is intended only for use with sqlite3
+     APIs for which a result code is not an error but which the
+     higher-level wrapper should treat as one.
   */
   public SqliteException(int sqlite3ResultCode){
-    super(sqlite3_errstr(sqlite3ResultCode));
+    super(CApi.sqlite3_errstr(sqlite3ResultCode));
     errCode = xerrCode = sqlite3ResultCode;
   }
 
@@ -50,16 +53,16 @@ public final class SqliteException extends java.lang.RuntimeException {
      must refer to an opened db object). Note that this does NOT close
      the db.
 
-     Design note: closing the db on error is likely only useful during
+     Design note: closing the db on error is really only useful during
      a failed db-open operation, and the place(s) where that can
      happen are inside this library, not client-level code.
   */
   SqliteException(sqlite3 db){
-    super(sqlite3_errmsg(db));
-    errCode = sqlite3_errcode(db);
-    xerrCode = sqlite3_extended_errcode(db);
-    errOffset = sqlite3_error_offset(db);
-    sysErrno = sqlite3_system_errno(db);
+    super(CApi.sqlite3_errmsg(db));
+    errCode = CApi.sqlite3_errcode(db);
+    xerrCode = CApi.sqlite3_extended_errcode(db);
+    errOffset = CApi.sqlite3_error_offset(db);
+    sysErrno = CApi.sqlite3_system_errno(db);
   }
 
   /**
@@ -71,7 +74,7 @@ public final class SqliteException extends java.lang.RuntimeException {
   }
 
   public SqliteException(Sqlite.Stmt stmt){
-    this( stmt.db() );
+    this(stmt.db());
   }
 
   public int errcode(){ return errCode; }
index f6e1c2056ada49b32393ed6a73c5a5037e1c2e84..173d2bbaa7d2e2d25fe18fb64d9bbf361f369bc3 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\shigh-level\swindow\sfunction\swrapper\sto\sthe\sJNI\swrapper1\sinterface.
-D 2023-10-22T23:36:16.690
+C Add\smany\smore\shigh-level\swrappers\sto\sthe\sJNI\swrapper1\sAPI.\sCorrect\sthe\sJNI\sbindings\sof\ssqlite3_strglob/strlike()\sto\scompare\sas\sthe\score\slib\sdoes\sif\stheir\sglob\sargument\sis\sNULL\sand\sthe\sother\sis\snot.
+D 2023-10-23T01:34:17.318
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -239,7 +239,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
 F ext/jni/GNUmakefile 36919b7c4fb8447da4330df9996c7b064b766957f8b7be214a30eab55a8b8072
 F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
 F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c dcd6534b65b732ad927a49185c76c76abbd5ccadfa972d02f699abc45678e329
+F ext/jni/src/c/sqlite3-jni.c 21a218f50cfae116c5dbe780fd14181338e5b608dd6d52751e4a982c1b41c877
 F ext/jni/src/c/sqlite3-jni.h e839090f5ec35aa96983a5621659e55ef897dc0522242fd00f107028ef5e7dd5
 F ext/jni/src/org/sqlite/jni/annotation/NotNull.java a99341e88154e70447596b1af6a27c586317df41a7e0f246fd41370cd7b723b2
 F ext/jni/src/org/sqlite/jni/annotation/Nullable.java 0b1879852707f752512d4db9d7edd0d8db2f0c2612316ce1c832715e012ff6ba
@@ -294,8 +294,8 @@ F ext/jni/src/org/sqlite/jni/test-script-interpreter.md f9f25126127045d051e918fe
 F ext/jni/src/org/sqlite/jni/wrapper1/AggregateFunction.java bbe60ac7fd8718edb215a23dc901771bcedb1df3b46d9cf6caff6f419828587f
 F ext/jni/src/org/sqlite/jni/wrapper1/ScalarFunction.java 43c43adfb7866098aadaaca1620028a6ec82d5193149970019b1cce9eb59fb03
 F ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java 585309311ffce6f39626024bf2ea3add91339f6a146b674720165c1955efbe68
-F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java 3e6cdb5fe1b01a592ba5ca6ae7d11681a85d081786ce8d046ef631a08ae82dde
-F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 1386f7b753134fc12253ce2fbbc448ba8c970567fac01a3356cb672e14408d73
+F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java fae71b7454fa3d9243ad26c80e55b590c044a0f0a23d18cae21f0cfa3a92a969
+F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java aa85b4b05fae240b14f3d332f9524a2f80c619fb03856be72b4adda866b63b72
 F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java 13008f8d3c34c1dd55c3afe6dd18dcf94316874cde893ab0661a973fc51a87a4
 F ext/jni/src/org/sqlite/jni/wrapper1/ValueHolder.java 7b89a7391f771692c5b83b0a5b86266abe8d59f1c77d7a0eccc9b79f259d79af
 F ext/jni/src/org/sqlite/jni/wrapper1/WindowFunction.java 1a1afbafbd7406ff67e7d6405541c6347517c731de535a97d7a3df1d4db835b4
@@ -2137,8 +2137,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 89fecf1dd8b97941f9b45130a3c8a67af36ec65cc6f70f5026c569c058a4963f
-R 160b97c24140d26b449a4e16b3331ec4
+P a27e7471231a24864cbd04b77cbc4b336ce180d738a36ce4318543e2666ed708
+R ba0772b5db9c34b23be02455e60dfd03
 U stephan
-Z 05c9adecf2f51f54547f1d6b2c6aaa3c
+Z eac6f822004436c39a1705e9823cdae5
 # Remove this line to create a well-formed Fossil manifest.
index fbcdd1ab297d16a8c8787e959fa70ab25341c251..f6f96883336f4be293cb66067c7ef6aaad3e1f7b 100644 (file)
@@ -1 +1 @@
-a27e7471231a24864cbd04b77cbc4b336ce180d738a36ce4318543e2666ed708
\ No newline at end of file
+55c4b1dc402b358d53d65fa1f6ec063e9e38e95c81a05d98dae3cb58c52ef55c
\ No newline at end of file