ID:               27990
 Updated by:       [EMAIL PROTECTED]
 Reported By:      csaba at alum dot mit dot edu
-Status:           Open
+Status:           Feedback
 Bug Type:         SQLite related
 Operating System: Win 2K
 PHP Version:      5.0.0RC1
 New Comment:

Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip

I think this was fixed just recently.




Previous Comments:
------------------------------------------------------------------------

[2004-04-14 07:45:06] csaba at alum dot mit dot edu

Description:
------------
I want to get a list of all SQLite databases under my root directory so
I figured I'd get a list of all the files, open each one using
sqlite_open, and assume those that didn't result in warnings/errors
were keepers.



sqlite_open is extremely unhappy about this and apache 2.0.48 dies.

Reproduce code:
---------------
$root = "c:\\Your\\Path\\Here";



$aFiles = dirList($root, 2, 1);

for ($i=sizeof($aFiles);$i--;) {

    if (!($db=sqlite_open($aFiles[$i],0666,$sqliteerror))) unset
($aFiles[$i]);

    else {

        if (!sqlite_array_query($db,"SELECT * FROM sqlite_master;",
SQLITE_ASSOC))

            unset ($aFiles[$i]);

        sqlite_close($db);

    }

}

var_dump ($aFiles);



function dirList($path=NULL, $types=2, $levels=1) {

//  returns an array of the specified files/directories

//  Note that directories are prefixed with a '*'

//      This can be eliminated from the line above the return

//  $path defaults to the current working directory

//  $types:  2 => files; 1 => directories; 3 => both;

//  $levels: 1 => look in the $path only; 2 => $path and all children;

//           3 => $path, children, grandchildren; 0 => $path and all
descendants;

//           less than 0 => complement of -$levels: everything starting
-$levels down

//                e.g. -1 => everthing except $path; -2 => all
descendants except $path + children



    $pathSep = strstr(PHP_OS, "WIN") ? "\\" : "/";

    if ([EMAIL PROTECTED]) $path = getcwd();

    $aRes = array();        // result

    $aAcc=array();          // accumulate

    $aDir = array(realpath($path));

    for
($i=$levels>0?$levels++:-1;$i--&&$aDir;$aDir=$aAcc,$aAcc=array())

        while ($dir = array_shift($aDir))

            foreach (scandir ($dir) as $fileOrDir)

                if ($fileOrDir!="." && $fileOrDir!="..") {

                    if ($isDir = is_dir ($rp="$dir$pathSep$fileOrDir"))
$aAcc[] = $rp;

                    if ($i<$levels-1 && ($types & (2-$isDir))) $aRes[]
= ($isDir?"*":"") . $rp; }

    return $aRes;

}



Expected result:
----------------
I expect to get a list of sqlite database files.  I expect to be able
to use @sqlite_open and have it fail gracefully (silently) without
taking PHP and Apache with it.



Actual result:
--------------
The above variant on my system with three files in the directory
(dbFile.db, index.php, index.php~) produced two warnings:



Warning: sqlite_open() [function.sqlite-open]: database disk image is
malformed in .../test.php on sqlite_open line

and showed the dbFile.db as OK



Every other variant crashes apache, such as doing a print of
$aFiles[$i] within the else, or inserting ' || $sqliteerror' as the
second half of the first if, or putting an '@' in front of
sqlite_open.



Thanks,

Csaba Gabor


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=27990&edit=1

Reply via email to