diff options
author | David M <davidmj@users.sourceforge.net> | 2006-06-17 11:32:07 +0000 |
---|---|---|
committer | David M <davidmj@users.sourceforge.net> | 2006-06-17 11:32:07 +0000 |
commit | 751a154af01ac9cacdee5309d95ea115c0cecd5a (patch) | |
tree | fbd42a9e5662b93f0569eeda27be32714121c84e /phpBB/includes | |
parent | 10846d462ac9aa4790157f02e6cbf76297c29b82 (diff) | |
download | forums-751a154af01ac9cacdee5309d95ea115c0cecd5a.tar forums-751a154af01ac9cacdee5309d95ea115c0cecd5a.tar.gz forums-751a154af01ac9cacdee5309d95ea115c0cecd5a.tar.bz2 forums-751a154af01ac9cacdee5309d95ea115c0cecd5a.tar.xz forums-751a154af01ac9cacdee5309d95ea115c0cecd5a.zip |
- SQLite handling in custom profiles
- Removed an extra ';'
- Install works with SQLite again
git-svn-id: file:///svn/phpbb/trunk@6082 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/includes')
-rw-r--r-- | phpBB/includes/acp/acp_profile.php | 104 | ||||
-rw-r--r-- | phpBB/includes/db/sqlite.php | 2 |
2 files changed, 95 insertions, 11 deletions
diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php index 225180012d..0e70327585 100644 --- a/phpBB/includes/acp/acp_profile.php +++ b/phpBB/includes/acp/acp_profile.php @@ -105,7 +105,51 @@ class acp_profile $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_TABLE . " WHERE field_id = $field_id"); $db->sql_query('DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . " WHERE field_id = $field_id"); $db->sql_query('DELETE FROM ' . PROFILE_LANG_TABLE . " WHERE field_id = $field_id"); - $db->sql_query('ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " DROP $field_ident"); + + switch (SQL_LAYER) + { + case 'sqlite': + $sql = "SELECT sql + FROM sqlite_master + WHERE type = 'table' + AND name = '" . PROFILE_FIELDS_DATA_TABLE . "' + ORDER BY type DESC, name;"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + // Create a temp table and populate it, destroy the existing one + $db->sql_query(preg_replace('#CREATE\s+TABLE\s+' . PROFILE_FIELDS_DATA_TABLE . '#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql'])); + $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE); + $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE); + + preg_match('#\((.*)\)#s', $row['sql'], $matches); + + $new_table_cols = $matches[1]; + $old_table_cols = explode(',', $new_table_cols); + $column_list = array(); + foreach($old_table_cols as $declaration) + { + $entities = preg_split('#\s+#', $declaration); + if ($entities[0] !== $field_ident) + { + $column_list[] = $entities[0]; + } + } + + $columns = implode(',', $column_list); + + $new_table_cols = preg_replace('/' . $field_ident . '[^,]+,/', '', $new_table_cols); + + // create a new table and fill it up. destroy the temp one + $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');'); + $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;'); + $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp'); + break; + + default: + $db->sql_query('ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " DROP $field_ident"); + } $order = 0; @@ -937,38 +981,78 @@ class acp_profile case 'sqlite': - // We are defining the biggest common value, because of the possibility to edit the min/max values of each field. - $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident "; - switch ($field_type) { case FIELD_STRING: - $sql .= ' VARCHAR(255) '; + $type = ' VARCHAR(255) '; break; case FIELD_DATE: - $sql .= 'VARCHAR(10) '; + $type = 'VARCHAR(10) '; break; case FIELD_TEXT: - $sql .= "TEXT(65535)"; + $type = "TEXT(65535)"; // ADD {$field_ident}_bbcode_uid VARCHAR(5) NOT NULL, // ADD {$field_ident}_bbcode_bitfield INT(11) UNSIGNED"; break; case FIELD_BOOL: - $sql .= 'TINYINT(2) '; + $type = 'TINYINT(2) '; break; case FIELD_DROPDOWN: - $sql .= 'MEDIUMINT(8) '; + $type = 'MEDIUMINT(8) '; break; case FIELD_INT: - $sql .= 'BIGINT(20) '; + $type = 'BIGINT(20) '; break; } + // We are defining the biggest common value, because of the possibility to edit the min/max values of each field. + if (version_compare(sqlite_libversion(), '3.0') == -1) + { + $sql = "SELECT sql + FROM sqlite_master + WHERE type = 'table' + AND name = '" . PROFILE_FIELDS_DATA_TABLE . "' + ORDER BY type DESC, name;"; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + + // Create a temp table and populate it, destroy the existing one + $db->sql_query(preg_replace('#CREATE\s+TABLE\s+' . PROFILE_FIELDS_DATA_TABLE . '#i', 'CREATE TEMPORARY TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp', $row['sql'])); + $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . '_temp SELECT * FROM ' . PROFILE_FIELDS_DATA_TABLE); + $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE); + + preg_match('#\((.*)\)#s', $row['sql'], $matches); + + $new_table_cols = $matches[1]; + $old_table_cols = explode(',', $new_table_cols); + $column_list = array(); + foreach($old_table_cols as $declaration) + { + $entities = preg_split('#\s+#', $declaration); + $column_list[] = $entities[0]; + } + + $columns = implode(',', $column_list); + + $new_table_cols = $field_ident . ' ' . $type . ',' . $new_table_cols; + + // create a new table and fill it up. destroy the temp one + $db->sql_query('CREATE TABLE ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $new_table_cols . ');'); + $db->sql_query('INSERT INTO ' . PROFILE_FIELDS_DATA_TABLE . ' (' . $columns . ') SELECT ' . $columns . ' FROM ' . PROFILE_FIELDS_DATA_TABLE . '_temp;'); + $db->sql_query('DROP TABLE ' . PROFILE_FIELDS_DATA_TABLE . '_temp'); + } + else + { + $sql = 'ALTER TABLE ' . PROFILE_FIELDS_DATA_TABLE . " ADD $field_ident $type"; + } + + break; case 'mssql': diff --git a/phpBB/includes/db/sqlite.php b/phpBB/includes/db/sqlite.php index 2d4aefcb4b..87d9af8c7f 100644 --- a/phpBB/includes/db/sqlite.php +++ b/phpBB/includes/db/sqlite.php @@ -41,7 +41,7 @@ class dbal_sqlite extends dbal $this->dbname = $database; $error = ''; - $this->db_connect_id = ($this->persistency) ? @sqlite_popen($this->server, 0666, $error) : @sqlite_open($this->server, 0666, $error);; + $this->db_connect_id = ($this->persistency) ? @sqlite_popen($this->server, 0666, $error) : @sqlite_open($this->server, 0666, $error); if ($this->db_connect_id) { |