handle = $handle; } function fetch_assoc($result){ return $this->fetch_array($result,DB_ASSOC); } function fetch_row($result){ return $this->fetch_array($result,DB_NUM); } } class SQLiteDB extends DB{ var $error; function SQLiteDB(){ $this->error = ''; $args = func_get_args(); set_error_handler(array(&$this, 'catcherror')); switch(func_num_args()){ case 1: $handle = sqlite_open($args[0]); break; case 2: $handle = sqlite_open($args[0], $args[1]); break; default: $handle = sqlite_open($args[0], $args[1], $args[2]); break; } restore_error_handler(); if($this->error){ return null; } $this->DB($handle); } function query($sql){ $this->error = ''; if(strtolower(substr(ltrim($sql),0,5))=='alter'){ $queryparts = preg_split("/[\s]+/",$sql,4,PREG_SPLIT_NO_EMPTY); $tablename = $queryparts[2]; $alterdefs = $queryparts[3]; if(strtolower($queryparts[1]) != 'table' || $queryparts[2] == '') $this->error = 'near "'.$queryparts[0] . '": syntax error'; else{ set_error_handler(array(&$this, 'catcherror')); $result = $this->altertable($tablename,$alterdefs); restore_error_handler(); } } else{ set_error_handler(array(&$this, 'catcherror')); $result = sqlite_query($this->handle,$sql); restore_error_handler(); if($this->error){ return null; } } return $result; } function altertable($table,$alterdefs){ if($alterdefs != ''){ $result = sqlite_query($this->handle,"SELECT sql,name,type FROM sqlite_master WHERE tbl_name = '".$table."' ORDER BY type DESC"); if(sqlite_num_rows($result)>0){ $row = sqlite_fetch_array($result); //table sql $tmpname = 't'.time(); $origsql = trim(preg_replace("/[\s]+/"," ",str_replace(",",", ",preg_replace("/[\(]/","( ",$row['sql'],1)))); $createtemptableSQL = 'CREATE TEMPORARY '.substr(trim(preg_replace("'".$table."'",$tmpname,$origsql,1)),6); $createindexsql = array(); $i = 0; $defs = preg_split("/[,]+/",$alterdefs,-1,PREG_SPLIT_NO_EMPTY); $prevword = $table; $oldcols = preg_split("/[,]+/",substr(trim($createtemptableSQL),strpos(trim($createtemptableSQL),'(')+1),-1,PREG_SPLIT_NO_EMPTY); $newcols = array(); for($i=0;$ihandle,$createtesttableSQL); if($this->error){ return false; } $droptempsql = 'DROP TABLE '.$tmpname; sqlite_query($this->handle,$droptempsql); //end block $createnewtableSQL = 'CREATE '.substr(trim(preg_replace("'".$tmpname."'",$table,$createtesttableSQL,1)),17); $newcolumns = ''; $oldcolumns = ''; reset($newcols); while(list($key,$val) = each($newcols)){ $newcolumns .= ($newcolumns?', ':'').$val; $oldcolumns .= ($oldcolumns?', ':'').$key; } $copytonewsql = 'INSERT INTO '.$table.'('.$newcolumns.') SELECT '.$oldcolumns.' FROM '.$tmpname; sqlite_query($this->handle,$createtemptableSQL); //create temp table sqlite_query($this->handle,$copytotempsql); //copy to table sqlite_query($this->handle,$dropoldsql); //drop old table sqlite_query($this->handle,$createnewtableSQL); //recreate original table sqlite_query($this->handle,$copytonewsql); //copy back to original table sqlite_query($this->handle,$droptempsql); //drop temp table } else{ trigger_error('no such table: '.$table,E_USER_WARNING); return false; } return true; } } function fetch_array($result){ $this->error = ''; if(func_num_args() > 1){ $args = func_get_args(); $arg = $args[1]; switch($arg){ case DB_ASSOC: return sqlite_fetch_array($result,SQLITE_ASSOC); break; case DB_NUM: return sqlite_fetch_array($result,SQLITE_NUM); break; default: return sqlite_fetch_array($result,SQLITE_BOTH); break; } } else return sqlite_fetch_array($result); } function close(){ $this->error = ''; sqlite_close($this->handle); return true; } function num_rows($result){ $this->error = ''; return sqlite_num_rows($result); } function catcherror($errorcode,$message){ if(substr($message,0,16)=='sqlite_query(): '){ $this->error = substr($message,16); } else{ echo $message.'
todo: optimize error handling...'; exit; } } function seek($result,$rownum){ return sqlite_seek($result,$rownum); } function insert_id(){ return sqlite_last_insert_rowid($this->handle); } } ?>