From 4f833531dd5aa05e56ab00dd95eda4ce8419564d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 20 Jul 2009 19:04:48 -0400 Subject: [PATCH 01/12] start a module for schema management --- lib/schema.php | 124 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 lib/schema.php diff --git a/lib/schema.php b/lib/schema.php new file mode 100644 index 0000000000..db2f49a789 --- /dev/null +++ b/lib/schema.php @@ -0,0 +1,124 @@ +. + * + * @category Database + * @package Laconica + * @author Evan Prodromou + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Class representing the database schema + * + * A class representing the database schema. Can be used to + * manipulate the schema -- especially for plugins and upgrade + * utilities. + * + * @category Database + * @package Laconica + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class Schema +{ + protected $db = null; + + static function get() + { + + } + + public function getTableDef($name) + { + } + + public function getColumnDef($table, $column) + { + } + + public function getIndexDef($table, $index) + { + } + + public function createTable($name, $columns, $indices=null) + { + } + + public function dropTable($name) + { + } + + public function createIndex($name, $table, $columns) + { + } + + public function dropIndex($name, $table) + { + } + + public function addColumn($table, $columndef) + { + } + + public function modifyColumn($table, $column, $columndef) + { + } + + public function dropColumn($table, $column) + { + } + + public function ensureTable($name, $columns, $indices) + { + $def = $this->tableDef($name); + if (empty($def)) { + return $this->createTable($name, $columns, $indices); + } + } +} + +class TableDef +{ + public $name; + public $columns; +} + +class ColumnDef +{ + public $name; + public $type; + public $size; +} + +class IndexDef +{ + public $name; + public $table; + public $columns; +} From f31653ca5bc06db4d1a2a2dc8a1943f2d99f735a Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 24 Aug 2009 11:22:40 -0400 Subject: [PATCH 02/12] make table def method of schema code work --- lib/schema.php | 58 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/lib/schema.php b/lib/schema.php index db2f49a789..624765eb2e 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -47,15 +47,65 @@ if (!defined('LACONICA')) { class Schema { - protected $db = null; + static $_single = null; + protected $conn = null; + + protected function __construct() + { + // XXX: there should be an easier way to do this. + $user = new User(); + $this->conn = $user->getDatabaseConnection(); + $user->free(); + unset($user); + } static function get() { - + if (empty(self::$_single)) { + self::$_single = new Schema(); + } + return self::$_single; } public function getTableDef($name) { + $res =& $this->conn->query('DESCRIBE ' . $name); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + $td = new TableDef(); + + $td->name = $name; + $td->columns = array(); + + $row = array(); + + while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) { + + $cd = new ColumnDef(); + + $cd->name = $row['Field']; + + $packed = $row['Type']; + + if (preg_match('/^(\w+)\((\d+)\)$/', $packed, $match)) { + $cd->type = $match[1]; + $cd->size = $match[2]; + } else { + $cd->type = $packed; + } + + $cd->nullable = ($row['Null'] == 'YES') ? true : false; + $cd->key = $row['Key']; + $cd->default = $row['Default']; + $cd->extra = $row['Extra']; + + $td->columns[] = $cd; + } + + return $td; } public function getColumnDef($table, $column) @@ -114,6 +164,10 @@ class ColumnDef public $name; public $type; public $size; + public $nullable; + public $key; + public $default; + public $extra; } class IndexDef From bd8a2dbfd68289a4f025964647320f8ef5e857aa Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 24 Aug 2009 11:23:02 -0400 Subject: [PATCH 03/12] test script for schema code --- scripts/showtable.php | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 scripts/showtable.php diff --git a/scripts/showtable.php b/scripts/showtable.php new file mode 100644 index 0000000000..30f0bb5a90 --- /dev/null +++ b/scripts/showtable.php @@ -0,0 +1,41 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$helptext = << +Shows the structure of a table + +END_OF_SHOWTABLE_HELP; + +require_once INSTALLDIR.'/scripts/commandline.inc'; + +if (count($args) != 1) { + show_help(); +} + +$name = $args[0]; + +$schema = Schema::get(); + +$td = $schema->getTableDef($name); + +print_r($td); From e206324f245145a0e8c9ec0535cba1d62344ebf7 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 23 Sep 2009 09:20:04 -0400 Subject: [PATCH 04/12] statusize schema-related modules --- lib/schema.php | 18 +++++++++--------- scripts/showtable.php | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/schema.php b/lib/schema.php index 624765eb2e..d3b30aeeb5 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -1,6 +1,6 @@ . * * @category Database - * @package Laconica - * @author Evan Prodromou - * @copyright 2009 Control Yourself, Inc. + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ -if (!defined('LACONICA')) { +if (!defined('STATUSNET')) { exit(1); } @@ -39,10 +39,10 @@ if (!defined('LACONICA')) { * utilities. * * @category Database - * @package Laconica - * @author Evan Prodromou + * @package StatusNet + * @author Evan Prodromou * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://laconi.ca/ + * @link http://status.net/ */ class Schema diff --git a/scripts/showtable.php b/scripts/showtable.php index 30f0bb5a90..eb18a98e20 100644 --- a/scripts/showtable.php +++ b/scripts/showtable.php @@ -1,8 +1,8 @@ #!/usr/bin/env php Date: Wed, 23 Sep 2009 22:24:35 -0400 Subject: [PATCH 05/12] use schema tool to create a table --- lib/schema.php | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/lib/schema.php b/lib/schema.php index d3b30aeeb5..f490756905 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -110,18 +110,87 @@ class Schema public function getColumnDef($table, $column) { + $td = $this->getTableDef($table); + + foreach ($td->columns as $cd) { + if ($cd->name == $column) { + return $cd; + } + } + + return null; } public function getIndexDef($table, $index) { + return null; } public function createTable($name, $columns, $indices=null) { + $uniques = array(); + $primary = array(); + $indices = array(); + + $sql = "CREATE TABLE $name (\n"; + + for ($i = 0; $i < count($columns); $i++) { + + $cd =& $columns[$i]; + + if ($i > 0) { + $sql .= ",\n"; + } + + $sql .= $this->_columnSql($cd); + + switch ($cd->key) { + case 'UNI': + $uniques[] = $cd->name; + break; + case 'PRI': + $primary[] = $cd->name; + break; + case 'MUL': + $indices[] = $cd->name; + break; + } + } + + if (count($primary) > 0) { // it really should be... + $sql .= ",\nconstraint primary key (" . implode(',', $primary) . ")"; + } + + foreach ($uniques as $u) { + $sql .= ",\nunique index {$name}_{$u}_idx ($u)"; + } + + foreach ($indices as $i) { + $sql .= ",\nindex {$name}_{$i}_idx ($i)"; + } + + $sql .= "); "; + + common_debug($sql); + + $res =& $this->conn->query($sql); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; } public function dropTable($name) { + $res =& $this->conn->query("DROP TABLE $name"); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; } public function createIndex($name, $table, $columns) @@ -151,6 +220,25 @@ class Schema return $this->createTable($name, $columns, $indices); } } + + function _columnSql($cd) + { + $sql = "{$cd->name} "; + + if (!empty($cd->size)) { + $sql .= "{$cd->type}({$cd->size}) "; + } else { + $sql .= "{$cd->type} "; + } + + if (!empty($cd->default)) { + $sql .= "default {$cd->default} "; + } else { + $sql .= ($cd->nullable) ? "null " : "not null "; + } + + return $sql; + } } class TableDef @@ -168,6 +256,17 @@ class ColumnDef public $key; public $default; public $extra; + + function __construct($name, $type, $size=null, $nullable=null, + $key=null, $default=null, $extra=null) { + $this->name = $name; + $this->type = $type; + $this->size = $size; + $this->nullable = $nullable; + $this->key = $key; + $this->default = $default; + $this->extra = $extra; + } } class IndexDef From c5be2962ad6fa4f78a4892005bc6a342de89c5d0 Mon Sep 17 00:00:00 2001 From: Toby Inkster Date: Wed, 30 Sep 2009 13:12:17 +0100 Subject: [PATCH 06/12] FOAF for Groups. --- actions/foafgroup.php | 173 ++++++++++++++++++++++++++++++++++++++++++ actions/showgroup.php | 7 +- lib/router.php | 4 + 3 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 actions/foafgroup.php diff --git a/actions/foafgroup.php b/actions/foafgroup.php new file mode 100644 index 0000000000..f5fd7fe885 --- /dev/null +++ b/actions/foafgroup.php @@ -0,0 +1,173 @@ +. + * + * @category Mail + * @package StatusNet + * @author Evan Prodromou + * @author Toby Inkster + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class FoafGroupAction extends Action +{ + function isReadOnly($args) + { + return true; + } + + function prepare($args) + { + parent::prepare($args); + + $nickname_arg = $this->arg('nickname'); + + if (empty($nickname_arg)) { + $this->clientError(_('No such group.'), 404); + return false; + } + + $this->nickname = common_canonical_nickname($nickname_arg); + + // Permanent redirect on non-canonical nickname + + if ($nickname_arg != $this->nickname) { + common_redirect(common_local_url('foafgroup', + array('nickname' => $this->nickname)), + 301); + return false; + } + + $this->group = User_group::staticGet('nickname', $this->nickname); + + if (!$this->group) { + $this->clientError(_('No such group.'), 404); + return false; + } + + common_set_returnto($this->selfUrl()); + + return true; + } + + function handle($args) + { + parent::handle($args); + + header('Content-Type: application/rdf+xml'); + + $this->startXML(); + $this->elementStart('rdf:RDF', array('xmlns:rdf' => + 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', + 'xmlns:dcterms' => + 'http://purl.org/dc/terms/', + 'xmlns:sioc' => + 'http://rdfs.org/sioc/ns#', + 'xmlns:foaf' => + 'http://xmlns.com/foaf/0.1/', + 'xmlns:statusnet' => + 'http://status.net/ont/', + 'xmlns' => 'http://xmlns.com/foaf/0.1/')); + + $this->showPpd(common_local_url('foafgroup', array('nickname' => $this->nickname)), $this->group->permalink()); + + $this->elementStart('Group', array('rdf:about' => + $this->group->permalink())); + if ($this->group->fullname) { + $this->element('name', null, $this->group->fullname); + } + if ($this->group->description) { + $this->element('dcterms:description', null, $this->group->description); + } + if ($this->group->nickname) { + $this->element('dcterms:identifier', null, $this->group->nickname); + $this->element('nick', null, $this->group->nickname); + } + foreach ($this->group->getAliases() as $alias) { + $this->element('nick', null, $alias); + } + if ($this->group->homeUrl()) { + $this->element('weblog', array('rdf:resource' => $this->group->homeUrl())); + } + if ($this->group->homepage) { + $this->element('page', array('rdf:resource' => $this->group->homepage)); + } + if ($this->group->homepage_logo) { + $this->element('depiction', array('rdf:resource' => $this->group->homepage_logo)); + } + + $members = $this->group->getMembers(); + $member_details = array(); + while ($members->fetch()) { + $member_uri = common_local_url('userbyid', array('id'=>$members->id)); + $member_details[$member_uri] = array( + 'nickname' => $members->nickname + ); + $this->element('member', array('rdf:resource' => $member_uri)); + } + + $admins = $this->group->getAdmins(); + while ($admins->fetch()) { + $admin_uri = common_local_url('userbyid', array('id'=>$admins->id)); + $member_details[$admin_uri]['is_admin'] = true; + $this->element('statusnet:groupAdmin', array('rdf:resource' => $admin_uri)); + } + + $this->elementEnd('Group'); + + ksort($member_details); + foreach ($member_details as $uri => $details) { + if ($details['is_admin']) + { + $this->elementStart('Agent', array('rdf:about' => $uri)); + $this->element('nick', null, $details['nickname']); + $this->elementStart('holdsAccount'); + $this->elementStart('sioc:User', array('rdf:about'=>$uri.'#acct')); + $this->elementStart('sioc:has_function'); + $this->elementStart('statusnet:GroupAdminRole'); + $this->element('sioc:scope', array('rdf:resource' => $this->group->permalink())); + $this->elementEnd('statusnet:GroupAdminRole'); + $this->elementEnd('sioc:has_function'); + $this->elementEnd('sioc:User'); + $this->elementEnd('holdsAccount'); + $this->elementEnd('Agent'); + } + else + { + $this->element('Agent', array( + 'foaf:nick' => $details['nickname'], + 'rdf:about' => $uri, + )); + } + } + + $this->elementEnd('rdf:RDF'); + $this->endXML(); + } + + function showPpd($foaf_url, $person_uri) + { + $this->elementStart('Document', array('rdf:about' => $foaf_url)); + $this->element('primaryTopic', array('rdf:resource' => $person_uri)); + $this->elementEnd('Document'); + } + +} \ No newline at end of file diff --git a/actions/showgroup.php b/actions/showgroup.php index ff99497621..a67765ce58 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -345,7 +345,12 @@ class ShowgroupAction extends GroupDesignAction 'method' => 'timeline', 'argument' => $this->group->nickname.'.atom')), sprintf(_('Notice feed for %s group (Atom)'), - $this->group->nickname))); + $this->group->nickname)), + new Feed(Feed::FOAF, + common_local_url('foafgroup', + array('nickname' => $this->group->nickname)), + sprintf(_('FOAF for %s group'), + $this->group->nickname))); } /** diff --git a/lib/router.php b/lib/router.php index c18f273ed0..91f886bce1 100644 --- a/lib/router.php +++ b/lib/router.php @@ -241,6 +241,10 @@ class Router array('nickname' => '[a-zA-Z0-9]+')); } + $m->connect('group/:nickname/foaf', + array('action' => 'foafgroup'), + array('nickname' => '[a-zA-Z0-9]+')); + $m->connect('group/:nickname/blocked', array('action' => 'blockedfromgroup'), array('nickname' => '[a-zA-Z0-9]+')); From cc776478e2ea8fc861fd3b4e8e878f7d6020c34e Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Thu, 1 Oct 2009 10:07:09 +0000 Subject: [PATCH 07/12] Revert "Outputting UTF-8 charset in document header irrespective of mimetype." This reverts commit 353f58c23149159306131b0819de713da6b69464. Even though outputting UTF-8 by default at all times is a good thing, it shouldn't be forced in startHTML(). --- lib/htmloutputter.php | 2 +- lib/util.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 64be745beb..c70f965376 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -106,7 +106,7 @@ class HTMLOutputter extends XMLOutputter } } - header('Content-Type: '.$type.'; charset=UTF-8'); + header('Content-Type: '.$type); $this->extraHeaders(); if (preg_match("/.*\/.*xml/", $type)) { diff --git a/lib/util.php b/lib/util.php index 44a3772200..d249b154fc 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1165,7 +1165,7 @@ function common_negotiate_type($cprefs, $sprefs) } if ('text/html' === $besttype) { - return "text/html"; + return "text/html; charset=utf-8"; } return $besttype; } From acc78972383c2346b5729192ab00c90c48c5b2a6 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Thu, 1 Oct 2009 12:27:02 +0000 Subject: [PATCH 08/12] Added hook for Aside container --- EVENTS.txt | 6 ++++++ lib/action.php | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/EVENTS.txt b/EVENTS.txt index 74923dcc0a..e0d4bbd061 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -87,6 +87,12 @@ StartShowContentBlock: Showing before the content container EndShowContentBlock: Showing after the content container - $action: the current action +StartShowAside: Showing before the Aside container +- $action: the current action + +EndShowAside: Showing after the Aside container +- $action: the current action + StartNoticeSave: before inserting a notice (good place for content filters) - $notice: notice being saved (no ID or URI) diff --git a/lib/action.php b/lib/action.php index 02793f0694..71ceffe20d 100644 --- a/lib/action.php +++ b/lib/action.php @@ -525,7 +525,10 @@ class Action extends HTMLOutputter // lawsuit $this->showContentBlock(); Event::handle('EndShowContentBlock', array($this)); } - $this->showAside(); + if (Event::handle('StartShowAside', array($this))) { + $this->showAside(); + Event::handle('EndShowAside', array($this)); + } $this->elementEnd('div'); } From b980f5e45b613d60e968e84b304ef9db260f24c2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 1 Oct 2009 15:00:54 -0400 Subject: [PATCH 09/12] add some more methods to Schema --- lib/schema.php | 203 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 184 insertions(+), 19 deletions(-) diff --git a/lib/schema.php b/lib/schema.php index f490756905..056c2093d6 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -193,32 +193,161 @@ class Schema return true; } - public function createIndex($name, $table, $columns) + public function createIndex($table, $columnNames, $name = null) { + if (!is_array($columnNames)) { + $columnNames = array($columnNames); + } + + if (empty($name)) { + $name = "$table_".implode("_", $columnNames)."_idx"; + } + + $res =& $this->conn->query("ALTER TABLE $table ADD INDEX $name (".implode(",", $columnNames).")"); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; } - public function dropIndex($name, $table) + public function dropIndex($table, $name) { + $res =& $this->conn->query("ALTER TABLE $table DROP INDEX $name"); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; } public function addColumn($table, $columndef) { - } + $sql = "ALTER TABLE $table ADD COLUMN " . $this->_columnSql($columndef); - public function modifyColumn($table, $column, $columndef) - { - } + $res =& $this->conn->query($sql); - public function dropColumn($table, $column) - { - } - - public function ensureTable($name, $columns, $indices) - { - $def = $this->tableDef($name); - if (empty($def)) { - return $this->createTable($name, $columns, $indices); + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); } + + return true; + } + + public function modifyColumn($table, $columndef) + { + $sql = "ALTER TABLE $table MODIFY COLUMN " . $this->_columnSql($columndef); + + $res =& $this->conn->query($sql); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; + } + + public function dropColumn($table, $columnName) + { + $sql = "ALTER TABLE $table DROP COLUMN $columnName"; + + $res =& $this->conn->query($sql); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; + } + + public function ensureTable($tableName, $columns, $indices=null) + { + // XXX: DB engine portability -> toilet + + try { + $td = $this->getTableDef($tableName); + } catch (Exception $e) { + if (preg_match('/no such table/', $e->getMessage())) { + return $this->createTable($tableName, $columns, $indices); + } else { + throw $e; + } + } + + $cur = $this->_names($td->columns); + $new = $this->_names($columns); + + $toadd = array_diff($new, $cur); + $todrop = array_diff($cur, $new); + + $same = array_intersect($new, $cur); + + foreach ($same as $m) { + $curCol = $this->_byName($td->columns, $m); + $newCol = $this->_byName($columns, $m); + + if (!$newCol->equals($curCol)) { + $tomod[] = $newCol->name; + } + } + + if (count($toadd) + count($todrop) + count($tomod) == 0) { + // nothing to do + return true; + } + + // For efficiency, we want this all in one + // query, instead of using our methods. + + $phrase = array(); + + foreach ($toadd as $columnName) { + $cd = $this->_byName($columns, $columnName); + $phrase[] = 'ADD COLUMN ' . $this->_columnSql($cd); + } + + foreach ($todrop as $columnName) { + $phrase[] = 'DROP COLUMN ' . $columnName; + } + + foreach ($tomod as $columnName) { + $cd = $this->_byName($columns, $columnName); + $phrase[] = 'MODIFY COLUMN ' . $this->_columnSql($cd); + } + + $sql = 'ALTER TABLE ' . $tableName . ' ' . implode(', ', $phrase); + + $res =& $this->conn->query($sql); + + if (PEAR::isError($res)) { + throw new Exception($res->getMessage()); + } + + return true; + } + + function _names($cds) + { + $names = array(); + + foreach ($cds as $cd) { + $names[] = $cd->name; + } + + return $names; + } + + function _byName($cds, $name) + { + foreach ($cds as $cd) { + if ($cd->name == $name) { + return $cd; + } + } + + return null; } function _columnSql($cd) @@ -257,16 +386,52 @@ class ColumnDef public $default; public $extra; - function __construct($name, $type, $size=null, $nullable=null, + function __construct($name, $type, $size=null, $nullable=true, $key=null, $default=null, $extra=null) { - $this->name = $name; - $this->type = $type; - $this->size = $size; + $this->name = strtolower($name); + $this->type = strtolower($type); + $this->size = $size+0; $this->nullable = $nullable; $this->key = $key; $this->default = $default; $this->extra = $extra; } + + function equals($other) + { + return ($this->name == $other->name && + $this->_typeMatch($other) && + $this->_defaultMatch($other) && + $this->_nullMatch($other) && + $this->key == $other->key); + } + + function _typeMatch($other) + { + switch ($this->type) { + case 'integer': + case 'int': + return ($other->type == 'integer' || + $other->type == 'int'); + break; + default: + return ($this->type == $other->type && + $this->size == $other->size); + } + } + + function _defaultMatch($other) + { + return ((is_null($this->default) && is_null($other->default)) || + ($this->default == $other->default)); + } + + function _nullMatch($other) + { + return ((!is_null($this->default) && !is_null($other->default) && + $this->default == $other->default) || + ($this->nullable == $other->nullable)); + } } class IndexDef From d103522ff364098ed26305b31d1cb62f87de1318 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 1 Oct 2009 15:11:12 -0400 Subject: [PATCH 10/12] check the schema --- EVENTS.txt | 2 ++ README | 8 ++++++++ lib/common.php | 6 ++++++ lib/default.php | 3 ++- scripts/checkschema.php | 30 ++++++++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 scripts/checkschema.php diff --git a/EVENTS.txt b/EVENTS.txt index e0d4bbd061..fbb2f36a7b 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -283,3 +283,5 @@ StartShowHeadElements: Right after the tag EndShowHeadElements: Right before the tag; put