From 98cc5c0fe6a7d2b8cc3f1a391c28e17d99276a7c Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Thu, 28 Nov 2013 04:52:50 +0400 Subject: [PATCH] Property classes and mysql-schema --- .../PersonalAddressBook/Classes/Contact.php | 110 ++++++++++++++++++ .../PersonalAddressBook/Classes/Property.php | 110 ++++++++++++++++++ .../Enumerations/PropertyType.php | 38 ++++++ .../MySqlPersonalAddressBook.php | 15 +-- .../PersonalAddressBook/mysql-schema.sql | 94 +++++++++++++++ 5 files changed, 353 insertions(+), 14 deletions(-) create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Contact.php create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Property.php create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Enumerations/PropertyType.php create mode 100644 rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/mysql-schema.sql diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Contact.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Contact.php new file mode 100644 index 000000000..32e5bea0d --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Contact.php @@ -0,0 +1,110 @@ +Clear(); + } + + public function Clear() + { + $this->IdContact = 0; + $this->IdUser = 0; + $this->DisplayName = ''; + $this->DisplayEmail = ''; + $this->DisplayInList = ''; + $this->IsAuto = false; + $this->IsShare = false; + $this->Changed = \time(); + $this->Tags = array(); + $this->Properties = array(); + } + + public function InitBeforeWrite() + { + $sDisplayName = ''; + $sDisplayEmail = ''; + + foreach ($this->Properties as /* @var $oProperty \RainLoop\Providers\PersonalAddressBook\Classes\Property */ $oProperty) + { + if ($oProperty) + { + $oProperty->InitBeforeWrite(); + + if ('' === $sDisplayName && \RainLoop\Providers\PersonalAddressBook\Enumerations\PropertyType::FULLNAME === $oProperty->Type) + { + $sDisplayName = $oProperty->Value; + } + + if ('' === $sDisplayEmail && $oProperty->IsEmail()) + { + $sDisplayEmail = $oProperty->Value; + } + } + } + + $this->DisplayName = $sDisplayName; + $this->DisplayEmail = $sDisplayEmail; + $this->DisplayInList = 0 < \strlen($this->DisplayName) ? $this->DisplayName : (!empty($this->DisplayEmail) ? $this->DisplayEmail : ''); + + $this->Changed = \time(); + } +} diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Property.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Property.php new file mode 100644 index 000000000..59e5d43ee --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Classes/Property.php @@ -0,0 +1,110 @@ +Clear(); + } + + public function Clear() + { + $this->IdContact = 0; + $this->IdUser = 0; + + $this->Type = PropertyType::UNKNOWN; + $this->TypeCustom = ''; + + $this->Value = ''; + $this->ValueClear = ''; + + $this->Frec = 0; + } + + /** + * @return bool + */ + public function IsEmail() + { + return \in_array($this->Type, array( + PropertyType::EMAIl_PERSONAL, PropertyType::EMAIl_BUSSINES, PropertyType::EMAIl_OTHER + )); + } + + /** + * @return bool + */ + public function IsPhone() + { + return \in_array($this->Type, array( + PropertyType::PHONE_PERSONAL, PropertyType::PHONE_BUSSINES, PropertyType::PHONE_OTHER, + PropertyType::MOBILE_PERSONAL, PropertyType::MOBILE_BUSSINES, PropertyType::MOBILE_OTHER, + PropertyType::FAX_BUSSINES, PropertyType::FAX_OTHER + )); + } + + public function InitBeforeWrite() + { + // trimer + $this->Value = \trim($this->Value); + $this->ValueClear = \trim($this->ValueClear); + $this->TypeCustom = \trim($this->TypeCustom); + + if (0 < \strlen($this->Value)) + { + // lower + if ($this->IsEmail()) + { + $this->Value = \strtolower($this->Value); + } + + // phones clear value for searching + if ($this->IsPhone()) + { + $sPhone = $this->Value; + $sPhone = \preg_replace('^[+]+', '', $sPhone); + $sPhone = \preg_replace('[^\d]', '', $sPhone); + $this->ValueClear = $sPhone; + } + } + } +} diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Enumerations/PropertyType.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Enumerations/PropertyType.php new file mode 100644 index 000000000..6b4812506 --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/Enumerations/PropertyType.php @@ -0,0 +1,38 @@ +setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - - if (!@\file_exists($sVersionFile) || - (string) @file_get_contents($sVersionFile) !== (string) \RainLoop\Providers\Contacts\Classes\Db::Version()) - { - $this->syncTables($oPdo, $sVersionFile); - } - - $oPdo->sqliteCreateFunction('SIMPLESEARCH', function ($sEmailValue, $sNameValue, $sMask) { - return \preg_match('/'.\preg_quote($sMask, '/').'/ui', - $sEmailValue.' '.$sNameValue) ? 1 : 0; - }); - } } catch (\Exception $oException) { - throw $oException; +// throw $oException; $oPdo = false; } diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/mysql-schema.sql b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/mysql-schema.sql new file mode 100644 index 000000000..6e6b8856c --- /dev/null +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Providers/PersonalAddressBook/mysql-schema.sql @@ -0,0 +1,94 @@ +-- RainLoop Webmail initial contacts database structure + +/*!40014 SET FOREIGN_KEY_CHECKS=0 */; + +-- Table structure for table `rainloop_system` +CREATE TABLE IF NOT EXISTS `rainloop_system` ( + `name` varchar(50) NOT NULL, + `value_int` int(10) UNSIGNED NOT NULL DEFAULT '0', + `value_str` varchar(255) NOT NULL DEFAULT '' +) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; + +-- Table structure for table `rainloop_pab_users` +CREATE TABLE IF NOT EXISTS `rainloop_pab_users` ( + `id_user` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `email` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL, + + UNIQUE `email_unique` (`email`), + PRIMARY KEY(`id_user`) +) /*!40000 ENGINE=INNODB */; + +-- Table structure for table `rainloop_pab_contacts` +CREATE TABLE IF NOT EXISTS `rainloop_pab_contacts` ( + `id_contact` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `id_user` int(10) UNSIGNED NOT NULL, + `display_name` varchar(255) NOT NULL DEFAULT '', + `display_email` varchar(255) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL DEFAULT '', + `display_in_list` varchar(255) NOT NULL DEFAULT '', + `is_auto` tinyint(1) NOT NULL DEFAULT '0', + `is_share` tinyint(1) NOT NULL DEFAULT '0', + `changed` int(10) UNSIGNED NOT NULL DEFAULT '0', + + CONSTRAINT `id_user_fk_rainloop_pab_contacts` FOREIGN KEY (`id_user`) + REFERENCES `rainloop_pab_users` (`id_user`) ON DELETE CASCADE ON UPDATE CASCADE, + PRIMARY KEY(`id_contact`) +) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; + +-- Table structure for table `rainloop_pab_prop` +CREATE TABLE IF NOT EXISTS `rainloop_pab_prop` ( + `id_contact` int(10) UNSIGNED NOT NULL, + `id_user` int(10) UNSIGNED NOT NULL, + `type` int(10) UNSIGNED NOT NULL, + `type_custom` varchar(50) /*!40101 CHARACTER SET ascii COLLATE ascii_general_ci */ NOT NULL DEFAULT '', + `value` varchar(255) NOT NULL DEFAULT '', + `value_custom` varchar(255) NOT NULL DEFAULT '', + `frec` int(10) UNSIGNED NOT NULL DEFAULT '0', + + CONSTRAINT `id_contact_fk_rainloop_pab_prop` FOREIGN KEY (`id_contact`) + REFERENCES `rainloop_pab_contacts` (`id_contact`) ON DELETE CASCADE ON UPDATE CASCADE +) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; + +-- Table structure for table `rainloop_pab_tags` +CREATE TABLE IF NOT EXISTS `rainloop_pab_tags` ( + `id_user` int(10) UNSIGNED NOT NULL, + `id_contact` int(10) UNSIGNED NOT NULL, + `name` varchar(255) NOT NULL, + + UNIQUE `id_user_name_unique` (`id_user`, `name`), + CONSTRAINT `id_contact_fk_rainloop_pab_tags` FOREIGN KEY (`id_contact`) + REFERENCES `rainloop_pab_contacts` (`id_contact`) ON DELETE CASCADE ON UPDATE CASCADE +) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; + +-- RainLoop Webmail update contacts database structure + +DELIMITER $$ + +DROP PROCEDURE IF EXISTS rainloop_pab_upgrade_database $$ + +CREATE PROCEDURE rainloop_pab_upgrade_database() +BEGIN + DECLARE new_version INT DEFAULT 1; + DECLARE current_version INT DEFAULT 0; + SELECT IFNULL(MAX(`value_int`), 0) INTO current_version FROM `rainloop_system` WHERE `name` = 'rainloop-pab-db-version'; + + IF current_version < 1 THEN + ALTER TABLE `rainloop_pab_prop` ADD INDEX `id_user_id_contact_index` (`id_user`, `id_contact`); + END IF; + +-- TODO +-- +-- IF current_version < 2 THEN +-- ALTER TABLE `rainloop_pab_prop` ADD INDEX `id_user_id_contact_index` (`id_user`, `id_contact`); +-- END IF; + + DELETE FROM `rainloop_system` WHERE `name` = 'rainloop-pab-db-version' AND `value_int` <= new_version; + INSERT INTO `rainloop_system` (`name`, `value_int`) VALUES ('rainloop-pab-db-version', new_version); +END$$ + +CALL rainloop_pab_upgrade_database() $$ + +DROP PROCEDURE IF EXISTS rainloop_pab_upgrade_database $$ + +DELIMITER ; + +/*!40014 SET FOREIGN_KEY_CHECKS=1 */;