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 @@
+ |