--- Zbigniew Baniewski <[EMAIL PROTECTED]> wrote:
> On Thu, Jul 26, 2007 at 08:11:22AM -0700, Joe Wilson wrote:
> 
> > Try 
> > 
> >   PRAGMA temp_store_directory = 'directory-name';
> > 
> > Otherwise, the temp file location order for UNIX is:
> > 
> >      "/var/tmp",
> >      "/usr/tmp",
> >      "/tmp",
> >      ".",
> 
> Thanks, I'll try to. Although is rather temporar workaround than solution,
> because there's a need to set it at every database connection.
> 
> As I can see, the order, in which sqlite is searching the "temp"
> directories, is like the above. Someone from other list wrote, that sqlite
> doesn't like, when "any directory in the database path isn't writeable" (is
> it true?) - perhaps the same thing is related to any "temp" directory? Under
> NetBSD there are /var/tmp and /tmp directories - but, of course, /var doesn't
> have 777 (both /var/tmp and /tmp do). Perhaps this can make a problem?

/var on my machine is drwxr-xr-x, and I don't have any issues with sqlite 
reading and writing temp files to /var/tmp/. Even if the permissions of /var
were d--x--x--x, it would also be fine. As long as /var/tmp is rwx for
the sqlite process, it will work.

Just make sure the the first accessible temp dir has enough disk space
for the temporary files.

> If so - shouldn't be much more logical, to change the order of search to:
> 
> 1. /tmp
> 2. /var/tmp
> 3. /usr/tmp
> 4. .
> 
> In such way, on the first place could be the only one directory, which is
> always (if it does exist at all) both world-writeable and hasn't any
> parent-dir, which can be not set to 777. Wouldn't it be a "final solution"
> of the problem?

The function in question is in os_unix.c. You can change the temp dir list's 
order, or hard-code a preferred temp directory if you like:

int sqlite3UnixTempFileName(char *zBuf){
  static const char *azDirs[] = {
     0,
     "/var/tmp",
     "/usr/tmp",
     "/tmp",
     ".",
  };
  static const unsigned char zChars[] =
    "abcdefghijklmnopqrstuvwxyz"
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "0123456789";
  int i, j;
  struct stat buf;
  const char *zDir = ".";
  azDirs[0] = sqlite3_temp_directory;
  for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); i++){
    if( azDirs[i]==0 ) continue;
    if( stat(azDirs[i], &buf) ) continue;
    if( !S_ISDIR(buf.st_mode) ) continue;
    if( access(azDirs[i], 07) ) continue;
    zDir = azDirs[i];
    break;
  }
  do{
    sqlite3_snprintf(SQLITE_TEMPNAME_SIZE, zBuf, "%s/"TEMP_FILE_PREFIX, zDir);
    j = strlen(zBuf);
    sqlite3Randomness(15, &zBuf[j]);
    for(i=0; i<15; i++, j++){
      zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
    }
    zBuf[j] = 0;
  }while( access(zBuf,0)==0 );
  return SQLITE_OK;
}



       
____________________________________________________________________________________
Got a little couch potato? 
Check out fun summer activities for kids.
http://search.yahoo.com/search?fr=oni_on_mail&p=summer+activities+for+kids&cs=bz
 

-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to