diff -urN mantisbt-1.2.19/admin/install.php mantisbt/admin/install.php --- mantisbt-1.2.19/admin/install.php Sun Jan 25 15:00:30 2015 +++ mantisbt/admin/install.php Sat Feb 07 09:00:00 2015 @@ -253,7 +253,9 @@ print_test( 'Setting Database Username', '' !== $f_db_username, true, 'database username is blank' ); print_test( 'Setting Database Password', '' !== $f_db_password, false, 'database password is blank' ); - print_test( 'Setting Database Name', '' !== $f_database_name, true, 'database name is blank' ); + if( $f_db_type != 'sqlitepdo' ) { + print_test( 'Setting Database Name', '' !== $f_database_name, true, 'database name is blank' ); + } if( $f_db_type == 'db2' ) { print_test( 'Setting Database Schema', !is_blank( $f_db_schema ), true, 'must have a schema name for AS400 in the form of DBNAME/SCHEMA' ); @@ -425,6 +427,7 @@ 'pgsql' => 'PostgreSQL', 'oci8' => 'Oracle', 'db2' => 'IBM DB2', + 'sqlitepdo' => 'SQLite', ); // mssql is not supported with PHP >= 5.3 @@ -673,6 +676,13 @@ while(( $i <= $lastid ) && !$g_failed ) { if( !$f_log_queries ) { echo ''; + } + + if($f_db_type == 'sqlitepdo'){ + //If the schema has an AUTOINCREMENT field, avoid to use PRIMARY fields in other places. + if($upgrade[$i][0]=='CreateTableSQL' && $upgrade[$i][1][0]==db_get_table( 'mantis_tag_table' )){ + $upgrade[$i][1][1] = preg_replace('!NOTNULL PRIMARY DEFAULT!', 'NOTNULL UNIQUE DEFAULT', $upgrade[$i][1][1]); + } } $dict = NewDataDictionary( $g_db ); diff -urN mantisbt-1.2.19/core/database_api.php mantisbt/core/database_api.php --- mantisbt-1.2.19/core/database_api.php Sun Jan 25 15:00:30 2015 +++ mantisbt/core/database_api.php Sat Feb 07 09:00:00 2015 @@ -164,6 +164,9 @@ case 'odbc_mssql': $t_support = function_exists( 'odbc_connect' ); break; + case 'sqlitepdo': + $t_support = class_exists( 'PDO' ); + break; default: $t_support = false; } @@ -459,6 +462,10 @@ $t_array = $p_result->fields; $p_result->MoveNext(); return $t_array; + } else if($p_result->databaseType=='array'){ + $t_array = each($p_result->_array); + if($t_array===false)return false; + return $t_array[1]; } else { $t_row = $p_result->GetRowAssoc( false ); static $t_array_result; @@ -726,6 +733,9 @@ case 'postgres7': case 'pgsql': return pg_escape_string( $p_string ); + case 'sqlitepdo': + $t_escaped = $g_db->_connectionID->quote($p_string); + return utf8_substr( $t_escaped, 1, utf8_strlen( $t_escaped ) - 2 ); default: error_parameters( 'db_type', $t_db_type ); trigger_error( ERROR_CONFIG_OPT_INVALID, ERROR ); diff -urN mantisbt-1.2.19/core/profile_api.php mantisbt/core/profile_api.php --- mantisbt-1.2.19/core/profile_api.php Sun Jan 25 15:00:30 2015 +++ mantisbt/core/profile_api.php Sat Feb 07 09:00:00 2015 @@ -289,7 +289,7 @@ FROM $t_user_profile_table up, $t_bug_table b WHERE $t_project_where AND up.id = b.profile_id - ORDER BY platform, os, os_build"; + ORDER BY up.platform, up.os, up.os_build"; $result = db_query_bound( $query ); $t_rows = array(); diff -urN mantisbt-1.2.19/library/adodb/adodb.inc.php mantisbt/library/adodb/adodb.inc.php --- mantisbt-1.2.19/library/adodb/adodb.inc.php Sun Jan 25 15:00:34 2015 +++ mantisbt/library/adodb/adodb.inc.php Sat Feb 07 09:00:00 2015 @@ -4294,6 +4294,7 @@ case 'odbtp': if (strncmp('odbtp_',$drivername,6)==0) return substr($drivername,6); case 'odbc' : if (strncmp('odbc_',$drivername,5)==0) return substr($drivername,5); case 'ado' : if (strncmp('ado_',$drivername,4)==0) return substr($drivername,4); + case 'pdo': return 'sqlitepdo'; case 'native': break; default: return $provider; diff -urN mantisbt-1.2.19/library/adodb/datadict/datadict-sqlitepdo.inc.php mantisbt/library/adodb/datadict/datadict-sqlitepdo.inc.php --- mantisbt-1.2.19/library/adodb/datadict/datadict-sqlitepdo.inc.php Thu Jan 01 09:00:00 1970 +++ mantisbt/library/adodb/datadict/datadict-sqlitepdo.inc.php Sat Feb 07 09:00:00 2015 @@ -0,0 +1,141 @@ +MetaColumns($tabname); + $newcols = array(); + $cpycols = array(); + $newpkeys = array(); + + foreach($mcs as $fo) { + if(isset($dropnames[$fo->name]))continue; + // + if($chgtype[$fo->name]){ + $sqln = $chgtype[$fo->name]; + } else { + $sqln = $fo->type; + if($fo->max_length) $sqln .= "({$fo->max_length})"; + if($fo->default_value!==NULL) $sqln .= " DEFAULT {$fo->default_value}"; + if($fo->not_null) $sqln .= ' NOT NULL'; + //ignore scale(sqlite:always 0) $fo->scale + } + if($renames[$fo->name]){ + $rname = $renames[$fo->name]; + $newcols[] = $rname.' '.$sqln; + $cpycols[] = "{$fo->name} AS {$rname}"; + if($fo->primary_key) $newpkeys[] = $rname; + } else { + $newcols[] = $fo->name.' '.$sqln; + $cpycols[] = $fo->name; + if($fo->primary_key) $newpkeys[] = $fo->name; + } + } + + $newcolstr = implode(', ',$newcols); + if(count($newpkeys)) $newcolstr.=', PRIMARY KEY('.implode(', ', $newpkeys).')'; + $cpycolstr = implode(', ',$cpycols); + + $tempname = $tabname.'_tmp'; + $aSql[] = 'BEGIN TRANSACTION'; // we use a transaction, to make sure not to loose the content of the table + $aSql[] = "CREATE TABLE {$tempname}({$newcolstr})"; + $aSql[] = "INSERT INTO {$tempname} SELECT {$cpycolstr} FROM {$tabname}"; + $aSql[] = "DROP TABLE {$tabname}"; + $aSql[] = "ALTER TABLE {$tempname} RENAME TO {$tabname}"; + // recreate the indexes, if they not contain one of the droped columns + $dropflds = array_flip($dropnames); + $midx = $this->MetaIndexes($tabname); + if(is_array($midx) && count($midx))foreach($midx as $idx_name => $idx_data) { + if(!count($dropflds) || !count(array_intersect($dropflds,$idx_data['columns']))){ + $aSql = array_merge($aSql,$this->CreateIndexSQL($idx_name,$tabname,$idx_data['columns'], + $idx_data['unique'] ? array('UNIQUE') : False)); + } + } + $aSql[] = 'COMMIT'; + return $aSql; + } + + function AlterColumnSQL($tabname, $flds) + { + $t_newflds = $this->_GenFields($flds,true); + $t_flds = preg_split('![ \t]+!', current($t_newflds[0]), 2); + $chgtype = array($t_flds[0]=>$t_flds[1]); + + $sqls = $this->_regen_table($tabname,null,$chgtype); + return $sqls; + } + + function DropColumnSQL($tabname, $flds) + { + $dropnames = array_flip(explode(',',$flds)); + $sqls = $this->_regen_table($tabname,$dropnames); + return $sqls; + } + + function RenameColumnSQL($tabname,$oldcolumn,$newcolumn,$flds='') + { + if($flds!=''){ + $t_newflds = $this->_GenFields($flds,true); + $t_flds = preg_split('![ \t]+!', current($t_newflds[0]), 2); + $chgtype = array($t_flds[0]=>$t_flds[1]); + } else { + $chgtype = null; + } + $renames=array($oldcolumn=>$newcolumn); + $sqls = $this->_regen_table($tabname,null,$chgtype,$renames); + return $sqls; + } +} diff -urN mantisbt-1.2.19/library/adodb/drivers/adodb-pdo.inc.php mantisbt/library/adodb/drivers/adodb-pdo.inc.php --- mantisbt-1.2.19/library/adodb/drivers/adodb-pdo.inc.php Sun Jan 25 15:00:34 2015 +++ mantisbt/library/adodb/drivers/adodb-pdo.inc.php Sat Feb 07 09:00:00 2015 @@ -218,6 +218,13 @@ { return $this->_driver->MetaColumns($table,$normalize); } + function MetaIndexes($table, $primary = false, $owner = false) + { + if(method_exists($this->_driver,'MetaIndexes')) + return $this->_driver->MetaIndexes($table, $primary, $owner); + else + return parent::MetaIndexes($table, $primary, $owner); + } function InParameter(&$stmt,&$var,$name,$maxLen=4000,$type=false) { diff -urN mantisbt-1.2.19/library/adodb/drivers/adodb-pdo_sqlite.inc.php mantisbt/library/adodb/drivers/adodb-pdo_sqlite.inc.php --- mantisbt-1.2.19/library/adodb/drivers/adodb-pdo_sqlite.inc.php Sun Jan 25 15:00:34 2015 +++ mantisbt/library/adodb/drivers/adodb-pdo_sqlite.inc.php Sat Feb 07 09:00:00 2015 @@ -199,5 +199,61 @@ } return $ret; } + + + function __adodb_save_fetchmode() + { + global $ADODB_FETCH_MODE; + + $r = array('g_fm'=>$ADODB_FETCH_MODE); + $ADODB_FETCH_MODE = ADODB_FETCH_ASSOC; + if($this->pdoDriver->fetchMode !== false) $r['fm'] = $this->pdoDriver->SetFetchMode(false); + + return $r; + } + function __adodb_restore_fetchmode($p_fm) + { + global $ADODB_FETCH_MODE; + + if(isset($p_fm['fm'])) $this->pdoDriver->SetFetchMode($p_fm['fm']); + $ADODB_FETCH_MODE = $p_fm['g_fm']; + } + + function MetaIndexes($table, $primary = false, $owner = false) + { + if($primary !== false) return false; + if($owner !== false) return false; + + $fm = $this->__adodb_save_fetchmode(); + + $r = false; + $res = $this->pdoDriver->Execute("PRAGMA index_list('{$table}')"); + if(is_object($res)) { + $excpfix='sqlite_autoindex_'; + $excpfix_len=strlen($excpfix); + + $r = array(); + while($rr = $res->FetchRow()){ + if(substr($rr['name'],0,$excpfix_len)==$excpfix)continue; + $r[$rr['name']]['unique'] = $rr['unique']-0 ? true: false; + $r[$rr['name']]['columns'] = array(); + } + $res->Close(); + + foreach($r as $idxname=>$idxinfo){ + $res = $this->pdoDriver->Execute("PRAGMA index_info('{$idxname}')"); + if(!is_object($res))continue; + + while($rr = $res->FetchRow()){ + $r[$idxname]['columns'][$rr['seqno']] = $rr['name']; + } + $res->Close(); + } + } + + $this->__adodb_restore_fetchmode($fm); + + return $r; + } } -?> \ No newline at end of file + diff -urN mantisbt-1.2.19/library/adodb/drivers/adodb-sqlitepdo.inc.php mantisbt/library/adodb/drivers/adodb-sqlitepdo.inc.php --- mantisbt-1.2.19/library/adodb/drivers/adodb-sqlitepdo.inc.php Thu Jan 01 09:00:00 1970 +++ mantisbt/library/adodb/drivers/adodb-sqlitepdo.inc.php Sat Feb 07 09:00:00 2015 @@ -0,0 +1,19 @@ +