updateTableDefinitions() public static method

public static updateTableDefinitions ( &$tableDefinitions, $tableNames )
$tableDefinitions
$tableNames
Exemplo n.º 1
0
 /**
  * @param Object\ClassDefinition $class
  */
 public function createUpdateTable(Object\ClassDefinition $class)
 {
     $table = $this->getTableName($class);
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $table . "` (\n\t\t  `o_id` int(11) NOT NULL default '0',\n\t\t  `index` int(11) default '0',\n          `fieldname` varchar(255) default NULL,\n          PRIMARY KEY (`o_id`,`index`,`fieldname`(255)),\n          INDEX `o_id` (`o_id`),\n          INDEX `index` (`index`),\n          INDEX `fieldname` (`fieldname`)\n\t\t) DEFAULT CHARSET=utf8;");
     $existingColumns = $this->getValidTableColumns($table, false);
     // no caching of table definition
     $columnsToRemove = $existingColumns;
     $protectedColums = array("o_id", "index", "fieldname");
     Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, array($table));
     foreach ($this->model->getFieldDefinitions() as $value) {
         $key = $value->getName();
         if (is_array($value->getColumnType())) {
             // if a datafield requires more than one field
             foreach ($value->getColumnType() as $fkey => $fvalue) {
                 $this->addModifyColumn($table, $key . "__" . $fkey, $fvalue, "", "NULL");
                 $protectedColums[] = $key . "__" . $fkey;
             }
         } else {
             if ($value->getColumnType()) {
                 $this->addModifyColumn($table, $key, $value->getColumnType(), "", "NULL");
                 $protectedColums[] = $key;
             }
         }
         $this->addIndexToField($value, $table);
     }
     $this->removeUnusedColumns($table, $columnsToRemove, $protectedColums);
     $this->tableDefinitions = null;
 }
Exemplo n.º 2
0
 /**
  * @param Object\ClassDefinition $class
  */
 public function createUpdateTable(Object\ClassDefinition $class)
 {
     $tableStore = $this->getTableName($class, false);
     $tableQuery = $this->getTableName($class, true);
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $tableStore . "` (\n\t\t  `o_id` int(11) NOT NULL default '0',\n          `fieldname` varchar(255) default '',\n          PRIMARY KEY (`o_id`,`fieldname`),\n          INDEX `o_id` (`o_id`),\n          INDEX `fieldname` (`fieldname`)\n\t\t) DEFAULT CHARSET=utf8;");
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $tableQuery . "` (\n\t\t  `o_id` int(11) NOT NULL default '0',\n          `fieldname` varchar(255) default '',\n          PRIMARY KEY (`o_id`,`fieldname`),\n          INDEX `o_id` (`o_id`),\n          INDEX `fieldname` (`fieldname`)\n\t\t) DEFAULT CHARSET=utf8;");
     $existingColumnsStore = $this->getValidTableColumns($tableStore, false);
     // no caching of table definition
     $columnsToRemoveStore = $existingColumnsStore;
     $existingColumnsQuery = $this->getValidTableColumns($tableQuery, false);
     // no caching of table definition
     $columnsToRemoveQuery = $existingColumnsQuery;
     $protectedColumnsStore = ["o_id", "fieldname"];
     $protectedColumnsQuery = ["o_id", "fieldname"];
     Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, [$tableStore, $tableQuery]);
     foreach ($this->model->getFieldDefinitions() as $value) {
         $key = $value->getName();
         // if a datafield requires more than one column in the query table
         if (is_array($value->getQueryColumnType())) {
             foreach ($value->getQueryColumnType() as $fkey => $fvalue) {
                 $this->addModifyColumn($tableQuery, $key . "__" . $fkey, $fvalue, "", "NULL");
                 $protectedColumnsQuery[] = $key . "__" . $fkey;
             }
         }
         // if a datafield requires more than one column in the datastore table => only for non-relation types
         if (!$value->isRelationType() && is_array($value->getColumnType())) {
             foreach ($value->getColumnType() as $fkey => $fvalue) {
                 $this->addModifyColumn($tableStore, $key . "__" . $fkey, $fvalue, "", "NULL");
                 $protectedColumnsStore[] = $key . "__" . $fkey;
             }
         }
         // everything else
         if (!is_array($value->getQueryColumnType()) && !is_array($value->getColumnType())) {
             if ($value->getQueryColumnType()) {
                 $this->addModifyColumn($tableQuery, $key, $value->getQueryColumnType(), "", "NULL");
                 $protectedColumnsQuery[] = $key;
             }
             if ($value->getColumnType() && !$value->isRelationType()) {
                 $this->addModifyColumn($tableStore, $key, $value->getColumnType(), "", "NULL");
                 $protectedColumnsStore[] = $key;
             }
         }
         // add indices
         $this->addIndexToField($value, $tableStore);
         $this->addIndexToField($value, $tableQuery);
     }
     $this->removeUnusedColumns($tableStore, $columnsToRemoveStore, $protectedColumnsStore);
     $this->removeUnusedColumns($tableQuery, $columnsToRemoveQuery, $protectedColumnsQuery);
 }
Exemplo n.º 3
0
 /**
  *
  */
 public function createUpdateTable()
 {
     $table = $this->getTableName();
     $context = $this->model->getContext();
     if ($context && $context["containerType"] == "fieldcollection") {
         $this->db->query("CREATE TABLE IF NOT EXISTS `" . $table . "` (\n              `ooo_id` int(11) NOT NULL default '0',\n              `index` INT(11) NOT NULL DEFAULT '0',\n              `fieldname` VARCHAR(190) NOT NULL DEFAULT '',\n              `language` varchar(10) NOT NULL DEFAULT '',\n              PRIMARY KEY (`ooo_id`, `language`, `index`, `fieldname`),\n              INDEX `ooo_id` (`ooo_id`),\n              INDEX `index` (`index`),\n              INDEX `fieldname` (`fieldname`),\n              INDEX `language` (`language`)\n            ) DEFAULT CHARSET=utf8mb4;");
     } else {
         $this->db->query("CREATE TABLE IF NOT EXISTS `" . $table . "` (\n              `ooo_id` int(11) NOT NULL default '0',\n              `language` varchar(10) NOT NULL DEFAULT '',\n              PRIMARY KEY (`ooo_id`,`language`),\n              INDEX `ooo_id` (`ooo_id`),\n              INDEX `language` (`language`)\n            ) DEFAULT CHARSET=utf8mb4;");
     }
     $existingColumns = $this->getValidTableColumns($table, false);
     // no caching of table definition
     $columnsToRemove = $existingColumns;
     Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, [$table]);
     if ($context && $context["containerType"] == "fieldcollection") {
         $protectedColumns = ["ooo_id", "language", "index", "fieldname"];
         $containerKey = $context["containerKey"];
         $container = Object\Fieldcollection\Definition::getByKey($containerKey);
     } else {
         $protectedColumns = ["ooo_id", "language"];
         $container = $this->model->getClass();
     }
     foreach ($container->getFielddefinition("localizedfields")->getFielddefinitions() as $value) {
         if ($value->getColumnType()) {
             $key = $value->getName();
             if (is_array($value->getColumnType())) {
                 // if a datafield requires more than one field
                 foreach ($value->getColumnType() as $fkey => $fvalue) {
                     $this->addModifyColumn($table, $key . "__" . $fkey, $fvalue, "", "NULL");
                     $protectedColumns[] = $key . "__" . $fkey;
                 }
             } else {
                 if ($value->getColumnType()) {
                     $this->addModifyColumn($table, $key, $value->getColumnType(), "", "NULL");
                     $protectedColumns[] = $key;
                 }
             }
             $this->addIndexToField($value, $table);
         }
     }
     $this->removeUnusedColumns($table, $columnsToRemove, $protectedColumns);
     $validLanguages = Tool::getValidLanguages();
     if ($container instanceof Object\ClassDefinition) {
         foreach ($validLanguages as &$language) {
             $queryTable = $this->getQueryTableName();
             $queryTable .= "_" . $language;
             $this->db->query("CREATE TABLE IF NOT EXISTS `" . $queryTable . "` (\n                      `ooo_id` int(11) NOT NULL default '0',\n                      `language` varchar(10) NOT NULL DEFAULT '',\n                      PRIMARY KEY (`ooo_id`,`language`),\n                      INDEX `ooo_id` (`ooo_id`),\n                      INDEX `language` (`language`)\n                    ) DEFAULT CHARSET=utf8mb4;");
             // create object table if not exists
             $protectedColumns = ["ooo_id", "language"];
             $existingColumns = $this->getValidTableColumns($queryTable, false);
             // no caching of table definition
             $columnsToRemove = $existingColumns;
             Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, [$queryTable]);
             $fieldDefinitions = $this->model->getClass()->getFielddefinition("localizedfields")->getFielddefinitions();
             // add non existing columns in the table
             if (is_array($fieldDefinitions) && count($fieldDefinitions)) {
                 foreach ($fieldDefinitions as $value) {
                     if ($value->getQueryColumnType()) {
                         $key = $value->getName();
                         // if a datafield requires more than one column in the query table
                         if (is_array($value->getQueryColumnType())) {
                             foreach ($value->getQueryColumnType() as $fkey => $fvalue) {
                                 $this->addModifyColumn($queryTable, $key . "__" . $fkey, $fvalue, "", "NULL");
                                 $protectedColumns[] = $key . "__" . $fkey;
                             }
                         }
                         // everything else
                         if (!is_array($value->getQueryColumnType()) && $value->getQueryColumnType()) {
                             $this->addModifyColumn($queryTable, $key, $value->getQueryColumnType(), "", "NULL");
                             $protectedColumns[] = $key;
                         }
                         // add indices
                         $this->addIndexToField($value, $queryTable);
                     }
                 }
             }
             // remove unused columns in the table
             $this->removeUnusedColumns($queryTable, $columnsToRemove, $protectedColumns);
         }
         $this->createLocalizedViews();
     }
     $this->tableDefinitions = null;
 }
Exemplo n.º 4
0
Arquivo: Dao.php Projeto: sfie/pimcore
 /**
  * @throws \Exception
  * @throws \Zend_Db_Adapter_Exception
  */
 public function update()
 {
     $class = get_object_vars($this->model);
     $data = array();
     foreach ($class as $key => $value) {
         if (in_array($key, $this->getValidTableColumns("classes"))) {
             if (is_array($value) || is_object($value)) {
                 $value = Serialize::serialize($value);
             } else {
                 if (is_bool($value)) {
                     $value = (int) $value;
                 }
             }
             $data[$key] = $value;
         }
     }
     $this->db->update("classes", $data, $this->db->quoteInto("id = ?", $this->model->getId()));
     // save definition as a serialized file
     $definitionFile = PIMCORE_CLASS_DIRECTORY . "/definition_" . $this->model->getId() . ".psf";
     if (!is_writable(dirname($definitionFile)) || is_file($definitionFile) && !is_writable($definitionFile)) {
         throw new \Exception("Cannot write definition file in: " . $definitionFile . " please check write permission on this directory.");
     }
     File::put($definitionFile, Serialize::serialize($this->model->layoutDefinitions));
     $objectTable = "object_query_" . $this->model->getId();
     $objectDatastoreTable = "object_store_" . $this->model->getId();
     $objectDatastoreTableRelation = "object_relations_" . $this->model->getId();
     $objectView = "object_" . $this->model->getId();
     // create object table if not exists
     $protectedColums = array("oo_id", "oo_classId", "oo_className");
     $protectedDatastoreColumns = array("oo_id");
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $objectTable . "` (\n\t\t\t  `oo_id` int(11) NOT NULL default '0',\n\t\t\t  `oo_classId` int(11) default '" . $this->model->getId() . "',\n\t\t\t  `oo_className` varchar(255) default '" . $this->model->getName() . "',\n\t\t\t  PRIMARY KEY  (`oo_id`)\n\t\t\t) DEFAULT CHARSET=utf8;");
     // update default value of classname columns
     $this->db->query('ALTER TABLE `' . $objectTable . "` ALTER COLUMN `oo_className` SET DEFAULT '" . $this->model->getName() . "';");
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $objectDatastoreTable . "` (\n\t\t\t  `oo_id` int(11) NOT NULL default '0',\n\t\t\t  PRIMARY KEY  (`oo_id`)\n\t\t\t) DEFAULT CHARSET=utf8;");
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $objectDatastoreTableRelation . "` (\n          `src_id` int(11) NOT NULL DEFAULT '0',\n          `dest_id` int(11) NOT NULL DEFAULT '0',\n          `type` varchar(50) NOT NULL DEFAULT '',\n          `fieldname` varchar(70) NOT NULL DEFAULT '0',\n          `index` int(11) unsigned NOT NULL DEFAULT '0',\n          `ownertype` enum('object','fieldcollection','localizedfield','objectbrick') NOT NULL DEFAULT 'object',\n          `ownername` varchar(70) NOT NULL DEFAULT '',\n          `position` varchar(70) NOT NULL DEFAULT '0',\n          PRIMARY KEY (`src_id`,`dest_id`,`ownertype`,`ownername`,`fieldname`,`type`,`position`),\n          KEY `index` (`index`),\n          KEY `src_id` (`src_id`),\n          KEY `dest_id` (`dest_id`),\n          KEY `fieldname` (`fieldname`),\n          KEY `position` (`position`),\n          KEY `ownertype` (`ownertype`),\n          KEY `type` (`type`),\n          KEY `ownername` (`ownername`)\n        ) DEFAULT CHARSET=utf8;");
     $existingColumns = $this->getValidTableColumns($objectTable, false);
     // no caching of table definition
     $existingDatastoreColumns = $this->getValidTableColumns($objectDatastoreTable, false);
     // no caching of table definition
     $columnsToRemove = $existingColumns;
     $datastoreColumnsToRemove = $existingDatastoreColumns;
     Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, array($objectTable, $objectDatastoreTable));
     // add non existing columns in the table
     if (is_array($this->model->getFieldDefinitions()) && count($this->model->getFieldDefinitions())) {
         foreach ($this->model->getFieldDefinitions() as $key => $value) {
             // if a datafield requires more than one column in the query table
             if (is_array($value->getQueryColumnType())) {
                 foreach ($value->getQueryColumnType() as $fkey => $fvalue) {
                     $this->addModifyColumn($objectTable, $key . "__" . $fkey, $fvalue, "", "NULL");
                     $protectedColums[] = $key . "__" . $fkey;
                 }
             }
             // if a datafield requires more than one column in the datastore table => only for non-relation types
             if (!$value->isRelationType() && is_array($value->getColumnType())) {
                 foreach ($value->getColumnType() as $fkey => $fvalue) {
                     $this->addModifyColumn($objectDatastoreTable, $key . "__" . $fkey, $fvalue, "", "NULL");
                     $protectedDatastoreColumns[] = $key . "__" . $fkey;
                 }
             }
             // everything else
             //                if (!is_array($value->getQueryColumnType()) && !is_array($value->getColumnType())) {
             if (!is_array($value->getQueryColumnType()) && $value->getQueryColumnType()) {
                 $this->addModifyColumn($objectTable, $key, $value->getQueryColumnType(), "", "NULL");
                 $protectedColums[] = $key;
             }
             if (!is_array($value->getColumnType()) && $value->getColumnType() && !$value->isRelationType()) {
                 $this->addModifyColumn($objectDatastoreTable, $key, $value->getColumnType(), "", "NULL");
                 $protectedDatastoreColumns[] = $key;
             }
             //                }
             // add indices
             $this->addIndexToField($value, $objectTable);
             $this->addIndexToField($value, $objectDatastoreTable);
         }
     }
     // remove unused columns in the table
     $this->removeUnusedColumns($objectTable, $columnsToRemove, $protectedColums);
     $this->removeUnusedColumns($objectDatastoreTable, $datastoreColumnsToRemove, $protectedDatastoreColumns, true);
     // create view
     try {
         //$this->db->query('CREATE OR REPLACE VIEW `' . $objectView . '` AS SELECT * FROM `objects` left JOIN `' . $objectTable . '` ON `objects`.`o_id` = `' . $objectTable . '`.`oo_id` WHERE `objects`.`o_classId` = ' . $this->model->getId() . ';');
         $this->db->query('CREATE OR REPLACE VIEW `' . $objectView . '` AS SELECT * FROM `' . $objectTable . '` JOIN `objects` ON `objects`.`o_id` = `' . $objectTable . '`.`oo_id`;');
     } catch (\Exception $e) {
         \Logger::debug($e);
     }
     $this->tableDefinitions = null;
 }
Exemplo n.º 5
0
 /**
  * @throws \Exception
  * @throws \Zend_Db_Adapter_Exception
  */
 public function update()
 {
     $class = get_object_vars($this->model);
     $data = [];
     foreach ($class as $key => $value) {
         if (in_array($key, $this->getValidTableColumns("classes"))) {
             $data[$key] = $value;
         }
     }
     $this->db->update("classes", $data, $this->db->quoteInto("id = ?", $this->model->getId()));
     $objectTable = "object_query_" . $this->model->getId();
     $objectDatastoreTable = "object_store_" . $this->model->getId();
     $objectDatastoreTableRelation = "object_relations_" . $this->model->getId();
     $objectView = "object_" . $this->model->getId();
     // create object table if not exists
     $protectedColums = ["oo_id", "oo_classId", "oo_className"];
     $protectedDatastoreColumns = ["oo_id"];
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $objectTable . "` (\n\t\t\t  `oo_id` int(11) NOT NULL default '0',\n\t\t\t  `oo_classId` int(11) default '" . $this->model->getId() . "',\n\t\t\t  `oo_className` varchar(255) default '" . $this->model->getName() . "',\n\t\t\t  PRIMARY KEY  (`oo_id`)\n\t\t\t) DEFAULT CHARSET=utf8mb4;");
     // update default value of classname columns
     $this->db->query('ALTER TABLE `' . $objectTable . "` ALTER COLUMN `oo_className` SET DEFAULT '" . $this->model->getName() . "';");
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $objectDatastoreTable . "` (\n\t\t\t  `oo_id` int(11) NOT NULL default '0',\n\t\t\t  PRIMARY KEY  (`oo_id`)\n\t\t\t) DEFAULT CHARSET=utf8mb4;");
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $objectDatastoreTableRelation . "` (\n          `src_id` int(11) NOT NULL DEFAULT '0',\n          `dest_id` int(11) NOT NULL DEFAULT '0',\n          `type` varchar(50) NOT NULL DEFAULT '',\n          `fieldname` varchar(70) NOT NULL DEFAULT '0',\n          `index` int(11) unsigned NOT NULL DEFAULT '0',\n          `ownertype` enum('object','fieldcollection','localizedfield','objectbrick') NOT NULL DEFAULT 'object',\n          `ownername` varchar(70) NOT NULL DEFAULT '',\n          `position` varchar(70) NOT NULL DEFAULT '0',\n          PRIMARY KEY (`src_id`,`dest_id`,`ownertype`,`ownername`,`fieldname`,`type`,`position`),\n          KEY `index` (`index`),\n          KEY `src_id` (`src_id`),\n          KEY `dest_id` (`dest_id`),\n          KEY `fieldname` (`fieldname`),\n          KEY `position` (`position`),\n          KEY `ownertype` (`ownertype`),\n          KEY `type` (`type`),\n          KEY `ownername` (`ownername`)\n        ) DEFAULT CHARSET=utf8mb4;");
     $existingColumns = $this->getValidTableColumns($objectTable, false);
     // no caching of table definition
     $existingDatastoreColumns = $this->getValidTableColumns($objectDatastoreTable, false);
     // no caching of table definition
     $columnsToRemove = $existingColumns;
     $datastoreColumnsToRemove = $existingDatastoreColumns;
     Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, [$objectTable, $objectDatastoreTable]);
     // add non existing columns in the table
     if (is_array($this->model->getFieldDefinitions()) && count($this->model->getFieldDefinitions())) {
         foreach ($this->model->getFieldDefinitions() as $key => $value) {
             // if a datafield requires more than one column in the query table
             if (is_array($value->getQueryColumnType())) {
                 foreach ($value->getQueryColumnType() as $fkey => $fvalue) {
                     $this->addModifyColumn($objectTable, $key . "__" . $fkey, $fvalue, "", "NULL");
                     $protectedColums[] = $key . "__" . $fkey;
                 }
             }
             // if a datafield requires more than one column in the datastore table => only for non-relation types
             if (!$value->isRelationType() && is_array($value->getColumnType())) {
                 foreach ($value->getColumnType() as $fkey => $fvalue) {
                     $this->addModifyColumn($objectDatastoreTable, $key . "__" . $fkey, $fvalue, "", "NULL");
                     $protectedDatastoreColumns[] = $key . "__" . $fkey;
                 }
             }
             // everything else
             //                if (!is_array($value->getQueryColumnType()) && !is_array($value->getColumnType())) {
             if (!is_array($value->getQueryColumnType()) && $value->getQueryColumnType()) {
                 $this->addModifyColumn($objectTable, $key, $value->getQueryColumnType(), "", "NULL");
                 $protectedColums[] = $key;
             }
             if (!is_array($value->getColumnType()) && $value->getColumnType() && !$value->isRelationType()) {
                 $this->addModifyColumn($objectDatastoreTable, $key, $value->getColumnType(), "", "NULL");
                 $protectedDatastoreColumns[] = $key;
             }
             //                }
             // add indices
             $this->addIndexToField($value, $objectTable, "getQueryColumnType");
             $this->addIndexToField($value, $objectDatastoreTable, "getColumnType");
         }
     }
     // remove unused columns in the table
     $this->removeUnusedColumns($objectTable, $columnsToRemove, $protectedColums);
     $this->removeUnusedColumns($objectDatastoreTable, $datastoreColumnsToRemove, $protectedDatastoreColumns);
     // remove / cleanup unused relations
     if (is_array($datastoreColumnsToRemove)) {
         foreach ($datastoreColumnsToRemove as $value) {
             if (!in_array(strtolower($value), array_map('strtolower', $protectedDatastoreColumns))) {
                 $tableRelation = "object_relations_" . $this->model->getId();
                 $this->db->delete($tableRelation, "fieldname = " . $this->db->quote($value) . " AND ownertype = 'object'");
                 // @TODO: remove localized fields and fieldcollections
             }
         }
     }
     // create view
     try {
         //$this->db->query('CREATE OR REPLACE VIEW `' . $objectView . '` AS SELECT * FROM `objects` left JOIN `' . $objectTable . '` ON `objects`.`o_id` = `' . $objectTable . '`.`oo_id` WHERE `objects`.`o_classId` = ' . $this->model->getId() . ';');
         $this->db->query('CREATE OR REPLACE VIEW `' . $objectView . '` AS SELECT * FROM `' . $objectTable . '` JOIN `objects` ON `objects`.`o_id` = `' . $objectTable . '`.`oo_id`;');
     } catch (\Exception $e) {
         Logger::debug($e);
     }
     $this->tableDefinitions = null;
 }
Exemplo n.º 6
0
 /**
  *
  */
 public function createUpdateTable()
 {
     $table = $this->getTableName();
     $this->db->query("CREATE TABLE IF NOT EXISTS `" . $table . "` (\r\n\t\t  `ooo_id` int(11) NOT NULL default '0',\r\n\t\t  `language` varchar(10) NOT NULL DEFAULT '',\r\n\t\t  PRIMARY KEY (`ooo_id`,`language`),\r\n          INDEX `ooo_id` (`ooo_id`),\r\n          INDEX `language` (`language`)\r\n\t\t) DEFAULT CHARSET=utf8;");
     $existingColumns = $this->getValidTableColumns($table, false);
     // no caching of table definition
     $columnsToRemove = $existingColumns;
     $protectedColumns = array("ooo_id", "language");
     Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, array($table));
     foreach ($this->model->getClass()->getFielddefinition("localizedfields")->getFielddefinitions() as $value) {
         if ($value->getColumnType()) {
             $key = $value->getName();
             if (is_array($value->getColumnType())) {
                 // if a datafield requires more than one field
                 foreach ($value->getColumnType() as $fkey => $fvalue) {
                     $this->addModifyColumn($table, $key . "__" . $fkey, $fvalue, "", "NULL");
                     $protectedColumns[] = $key . "__" . $fkey;
                 }
             } else {
                 if ($value->getColumnType()) {
                     $this->addModifyColumn($table, $key, $value->getColumnType(), "", "NULL");
                     $protectedColumns[] = $key;
                 }
             }
             $this->addIndexToField($value, $table);
         }
     }
     $this->removeUnusedColumns($table, $columnsToRemove, $protectedColumns);
     $validLanguages = Tool::getValidLanguages();
     foreach ($validLanguages as &$language) {
         $queryTable = $this->getQueryTableName();
         $queryTable .= "_" . $language;
         $this->db->query("CREATE TABLE IF NOT EXISTS `" . $queryTable . "` (\r\n                  `ooo_id` int(11) NOT NULL default '0',\r\n                  `language` varchar(10) NOT NULL DEFAULT '',\r\n                  PRIMARY KEY (`ooo_id`,`language`),\r\n                  INDEX `ooo_id` (`ooo_id`),\r\n                  INDEX `language` (`language`)\r\n                ) DEFAULT CHARSET=utf8;");
         // create object table if not exists
         $protectedColumns = array("ooo_id", "language");
         $existingColumns = $this->getValidTableColumns($queryTable, false);
         // no caching of table definition
         $columnsToRemove = $existingColumns;
         Object\ClassDefinition\Service::updateTableDefinitions($this->tableDefinitions, array($queryTable));
         $fieldDefinitions = $this->model->getClass()->getFielddefinition("localizedfields")->getFielddefinitions();
         // add non existing columns in the table
         if (is_array($fieldDefinitions) && count($fieldDefinitions)) {
             foreach ($fieldDefinitions as $value) {
                 if ($value->getQueryColumnType()) {
                     $key = $value->getName();
                     // if a datafield requires more than one column in the query table
                     if (is_array($value->getQueryColumnType())) {
                         foreach ($value->getQueryColumnType() as $fkey => $fvalue) {
                             $this->addModifyColumn($queryTable, $key . "__" . $fkey, $fvalue, "", "NULL");
                             $protectedColumns[] = $key . "__" . $fkey;
                         }
                     }
                     // everything else
                     if (!is_array($value->getQueryColumnType()) && $value->getQueryColumnType()) {
                         $this->addModifyColumn($queryTable, $key, $value->getQueryColumnType(), "", "NULL");
                         $protectedColumns[] = $key;
                     }
                     // add indices
                     $this->addIndexToField($value, $queryTable);
                 }
             }
         }
         // remove unused columns in the table
         $this->removeUnusedColumns($queryTable, $columnsToRemove, $protectedColumns);
     }
     $this->createLocalizedViews();
     $this->tableDefinitions = null;
 }