]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Move the multiplexor changes in the experimental branch
authordrh <drh@noemail.net>
Tue, 13 Dec 2011 15:02:54 +0000 (15:02 +0000)
committerdrh <drh@noemail.net>
Tue, 13 Dec 2011 15:02:54 +0000 (15:02 +0000)
(check-ins [255d21499b] and [199f52bced]) into the nx-devkit branch.

FossilOrigin-Name: eb95d2f72c625bcfd0f8e9db1db2cb8799854b57

manifest
manifest.uuid
src/test_multiplex.c

index 5d96461685ec22c0257834ec338b8955483d9e0c..b1b9ea84ff07f3f64a5a14f3c2c30c330f846f52 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C When\san\ssqlite3_auto_extension()\sfunction\sfails,\sreport\sback\sits\sactual\nerror\scode,\snot\sthe\sgeneric\sSQLITE_ERROR.
-D 2011-12-13T04:08:36.892
+C Move\sthe\smultiplexor\schanges\sin\sthe\sexperimental\sbranch\n(check-ins\s[255d21499b]\sand\s[199f52bced])\sinto\sthe\snx-devkit\sbranch.
+D 2011-12-13T15:02:54.819
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5b4a3e12a850b021547e43daf886b25133b44c07
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -214,7 +214,7 @@ F src/test_intarray.h 489edb9068bb926583445cb02589344961054207
 F src/test_journal.c 03313c693cca72959dcaaf79f8d76f21c01e19ff
 F src/test_loadext.c df586c27176e3c2cb2e099c78da67bf14379a56e
 F src/test_malloc.c 8d416f29ad8573f32601f6056c9d2b17472e9ad5
-F src/test_multiplex.c 56f837b9cafb0efb641a4073226f2b05a2c4872d
+F src/test_multiplex.c 10aaf8b7ebeb74f82d5c96e06c398b776917e457
 F src/test_multiplex.h e99c571bc4968b7a9363b661481f3934bfead61d
 F src/test_mutex.c a6bd7b9cf6e19d989e31392b06ac8d189f0d573e
 F src/test_onefile.c 40cf9e212a377a6511469384a64b01e6e34b2eec
@@ -976,7 +976,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P dc8118cd89da71f2035c6ee07c0edb772bba2186
-R fcee0dd6fa555d5216e315a8c5784053
+P ce55f250f56fa3a1ca864f81e9e86f911b981490
+R cc774ebd7c088b6b617c7f855781c545
 U drh
-Z 9d7ca46858b8a86804ab1862673e090c
+Z 1b3d8d40cb48e276ed9ae7077034a64e
index 1c74b293b8538776fc9759feda267ff1ec4c7515..a4233b55c65f7c78a7e17b8c457c14b5e02b29fa 100644 (file)
@@ -1 +1 @@
-ce55f250f56fa3a1ca864f81e9e86f911b981490
\ No newline at end of file
+eb95d2f72c625bcfd0f8e9db1db2cb8799854b57
\ No newline at end of file
index 1a3fbdef9f95a5c33e976a149901c5811c856419..ce55bad083ff97a6434f0ab0deaf998480aac5f6 100644 (file)
@@ -213,71 +213,6 @@ static int multiplexStrlen30(const char *z){
   return 0x3fffffff & (int)(z2 - z);
 }
 
-/*
-** Create a temporary file name in zBuf.  zBuf must be big enough to
-** hold at pOrigVfs->mxPathname characters.  This function departs
-** from the traditional temporary name generation in the os_win
-** and os_unix VFS in several ways, but is necessary so that 
-** the file name is known for temporary files (like those used 
-** during vacuum.)
-**
-** N.B. This routine assumes your underlying VFS is ok with using
-** "/" as a directory seperator.  This is the default for UNIXs
-** and is allowed (even mixed) for most versions of Windows.
-*/
-static int multiplexGetTempname(sqlite3_vfs *pOrigVfs, int nBuf, char *zBuf){
-  static char zChars[] =
-    "abcdefghijklmnopqrstuvwxyz"
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-    "0123456789";
-  int i,j;
-  int attempts = 0;
-  int exists = 0;
-  int rc = SQLITE_ERROR;
-
-  /* Check that the output buffer is large enough for 
-  ** pVfs->mxPathname characters.
-  */
-  if( pOrigVfs->mxPathname <= nBuf ){
-    char *zTmp = sqlite3_malloc(pOrigVfs->mxPathname);
-    if( zTmp==0 ) return SQLITE_NOMEM;
-
-    /* sqlite3_temp_directory should always be less than
-    ** pVfs->mxPathname characters.
-    */
-    sqlite3_snprintf(pOrigVfs->mxPathname,
-                     zTmp,
-                     "%s/",
-                     sqlite3_temp_directory ? sqlite3_temp_directory : ".");
-    rc = pOrigVfs->xFullPathname(pOrigVfs, zTmp, nBuf, zBuf);
-    sqlite3_free(zTmp);
-    if( rc ) return rc;
-
-    /* Check that the output buffer is large enough for the temporary file 
-    ** name.
-    */
-    j = multiplexStrlen30(zBuf);
-    if( (j + 8 + 1 + 3 + 1) <= nBuf ){
-      /* Make 3 attempts to generate a unique name. */
-      do {
-        attempts++;
-        sqlite3_randomness(8, &zBuf[j]);
-        for(i=0; i<8; i++){
-          unsigned char uc = (unsigned char)zBuf[j+i];
-          zBuf[j+i] = (char)zChars[uc%(sizeof(zChars)-1)];
-        }
-        memcpy(&zBuf[j+i], ".tmp", 5);
-        rc = pOrigVfs->xAccess(pOrigVfs, zBuf, SQLITE_ACCESS_EXISTS, &exists);
-      } while ( (rc==SQLITE_OK) && exists && (attempts<3) );
-      if( rc==SQLITE_OK && exists ){
-        rc = SQLITE_ERROR;
-      }
-    }
-  }
-
-  return rc;
-}
-
 /* Compute the filename for the iChunk-th chunk
 */
 static int multiplexSubFilename(multiplexGroup *pGroup, int iChunk){
@@ -291,7 +226,7 @@ static int multiplexSubFilename(multiplexGroup *pGroup, int iChunk){
     pGroup->aReal = p;
     pGroup->nReal = iChunk+1;
   }
-  if( pGroup->aReal[iChunk].z==0 ){
+  if( pGroup->zName && pGroup->aReal[iChunk].z==0 ){
     char *z;
     int n = pGroup->nName;
     pGroup->aReal[iChunk].z = z = sqlite3_malloc( n+4 );
@@ -461,6 +396,7 @@ static int multiplexOpen(
 
   UNUSED_PARAMETER(pVfs);
   memset(pConn, 0, pVfs->szOsFile);
+  assert( zName || (flags & SQLITE_OPEN_DELETEONCLOSE) );
 
   /* We need to create a group structure and manage
   ** access to this group of files.
@@ -468,23 +404,9 @@ static int multiplexOpen(
   multiplexEnter();
   pMultiplexOpen = (multiplexConn*)pConn;
 
-  /* If the second argument to this function is NULL, generate a 
-  ** temporary file name to use.  This will be handled by the
-  ** original xOpen method.  We just need to allocate space for
-  ** it.
-  */
-  if( !zName ){
-    zName = zToFree = sqlite3_malloc( pOrigVfs->mxPathname + 10 );
-    if( zName==0 ){
-      rc = SQLITE_NOMEM;
-    }else{
-      rc = multiplexGetTempname(pOrigVfs, pOrigVfs->mxPathname, zToFree);
-    }
-  }
-
   if( rc==SQLITE_OK ){
     /* allocate space for group */
-    nName = multiplexStrlen30(zName);
+    nName = zName ? multiplexStrlen30(zName) : 0;
     sz = sizeof(multiplexGroup)                             /* multiplexGroup */
        + nName + 1;                                         /* zName */
     pGroup = sqlite3_malloc( sz );
@@ -495,32 +417,34 @@ static int multiplexOpen(
 
   if( rc==SQLITE_OK ){
     /* assign pointers to extra space allocated */
-    char *p = (char *)&pGroup[1];
-    pMultiplexOpen->pGroup = pGroup;
     memset(pGroup, 0, sz);
+    pMultiplexOpen->pGroup = pGroup;
     pGroup->bEnabled = -1;
     pGroup->szChunk = SQLITE_MULTIPLEX_CHUNK_SIZE;
-    if( flags & SQLITE_OPEN_URI ){
-      const char *zChunkSize;
-      zChunkSize = sqlite3_uri_parameter(zName, "chunksize");
-      if( zChunkSize ){
-        unsigned int n = 0;
-        int i;
-        for(i=0; zChunkSize[i]>='0' && zChunkSize[i]<='9'; i++){
-          n = n*10 + zChunkSize[i] - '0';
-        }
-        if( n>0 ){
-          pGroup->szChunk = (n+0xffff)&~0xffff;
-        }else{
-          /* A zero or negative chunksize disabled the multiplexor */
-          pGroup->bEnabled = 0;
+
+    if( zName ){
+      char *p = (char *)&pGroup[1];
+      if( flags & SQLITE_OPEN_URI ){
+        const char *zChunkSize;
+        zChunkSize = sqlite3_uri_parameter(zName, "chunksize");
+        if( zChunkSize ){
+          unsigned int n = 0;
+          int i;
+          for(i=0; zChunkSize[i]>='0' && zChunkSize[i]<='9'; i++){
+            n = n*10 + zChunkSize[i] - '0';
+          }
+          if( n>0 ){
+            pGroup->szChunk = (n+0xffff)&~0xffff;
+          }else{
+            /* A zero or negative chunksize disabled the multiplexor */
+            pGroup->bEnabled = 0;
+          }
         }
       }
+      pGroup->zName = p;
+      memcpy(pGroup->zName, zName, nName+1);
+      pGroup->nName = nName;
     }
-    pGroup->zName = p;
-    /* save off base filename, name length, and original open flags  */
-    memcpy(pGroup->zName, zName, nName+1);
-    pGroup->nName = nName;
     pGroup->flags = flags;
     rc = multiplexSubFilename(pGroup, 1);
     if( rc==SQLITE_OK ){
@@ -796,52 +720,44 @@ static int multiplexFileSize(sqlite3_file *pConn, sqlite3_int64 *pSize){
   multiplexConn *p = (multiplexConn*)pConn;
   multiplexGroup *pGroup = p->pGroup;
   int rc = SQLITE_OK;
-  int rc2;
   int i;
-  *pSize = 0;
   multiplexEnter();
   if( !pGroup->bEnabled ){
     sqlite3_file *pSubOpen = multiplexSubOpen(pGroup, 0, &rc, NULL);
     if( pSubOpen==0 ){
-      rc = SQLITE_OK;  /* If SubOpen failed, assume a size of zero */
+      rc = SQLITE_IOERR_FSTAT;
     }else{
       rc = pSubOpen->pMethods->xFileSize(pSubOpen, pSize);
     }
   }else{
     sqlite3_vfs *pOrigVfs = gMultiplex.pOrigVfs;
     *pSize = 0;
-    for(i=0; 1; i++){
+    for(i=0; rc==SQLITE_OK; i++){
       sqlite3_file *pSubOpen = 0;
       int exists = 0;
       rc = multiplexSubFilename(pGroup, i);
-      if( rc ){ rc = SQLITE_OK; /* Assume size of zero */ break; }
-      if( pGroup->flags & SQLITE_OPEN_DELETEONCLOSE ){
-        exists = pGroup->nReal>=i && pGroup->aReal[i].p!=0;
-        rc2 = SQLITE_OK;
-      }else{
-        rc2 = pOrigVfs->xAccess(pOrigVfs, pGroup->aReal[i].z,
-            SQLITE_ACCESS_EXISTS, &exists);
+      if( rc!=SQLITE_OK ) break;
+      if( pGroup->nReal>i && pGroup->aReal[i].p!=0 ){
+        exists = 1;
+      }else if( (pGroup->flags & SQLITE_OPEN_DELETEONCLOSE)==0 ){
+        const char *zReal = pGroup->aReal[i].z;
+        rc = pOrigVfs->xAccess(pOrigVfs, zReal, SQLITE_ACCESS_EXISTS, &exists);
       }
-      if( rc2==SQLITE_OK && exists){
-        /* if it exists, open it */
-        pSubOpen = multiplexSubOpen(pGroup, i, &rc, NULL);
-      }else{
-        /* stop at first "gap" */
+      if( exists==0 ){
+        /* stop at first "gap" or IO error. */
         break;
       }
-      if( pSubOpen ){
-        sqlite3_int64 sz;
-        rc2 = pSubOpen->pMethods->xFileSize(pSubOpen, &sz);
-        if( rc2!=SQLITE_OK ){
-          rc = rc2;
-        }else{
-          if( sz>pGroup->szChunk ){
-            rc = SQLITE_IOERR_FSTAT;
-          }
-          *pSize += sz;
+      if( rc==SQLITE_OK ){
+        pSubOpen = multiplexSubOpen(pGroup, i, &rc, NULL);
+      }
+      assert( pSubOpen || rc!=SQLITE_OK );
+      if( rc==SQLITE_OK ){
+        sqlite3_int64 sz = 0;
+        rc = pSubOpen->pMethods->xFileSize(pSubOpen, &sz);
+        if( rc==SQLITE_OK && sz>pGroup->szChunk ){
+          rc = SQLITE_IOERR_FSTAT;
         }
-      }else{
-        break;
+        *pSize += sz;
       }
     }
   }
@@ -1192,9 +1108,13 @@ static int test_multiplex_dump(
   for(pGroup=gMultiplex.pGroups; pGroup; pGroup=pGroup->pNext){
     pGroupTerm = Tcl_NewObj();
 
-    pGroup->zName[pGroup->nName] = '\0';
-    Tcl_ListObjAppendElement(interp, pGroupTerm,
+    if( pGroup->zName ){
+      pGroup->zName[pGroup->nName] = '\0';
+      Tcl_ListObjAppendElement(interp, pGroupTerm,
           Tcl_NewStringObj(pGroup->zName, -1));
+    }else{
+      Tcl_ListObjAppendElement(interp, pGroupTerm, Tcl_NewObj());
+    }
     Tcl_ListObjAppendElement(interp, pGroupTerm,
           Tcl_NewIntObj(pGroup->nName));
     Tcl_ListObjAppendElement(interp, pGroupTerm,