コード例 #1
0
ファイル: Index.php プロジェクト: TuxBoy/Demo-saf
 /**
  * Builds a Index for a column name that is a link to another class
  *
  * @param $column_name string the column name used to create the index (with or without 'id_')
  * @return Index
  */
 public static function buildLink($column_name)
 {
     if (substr($column_name, 0, 3) !== 'id_') {
         $column_name = 'id_' . $column_name;
     }
     $index = new Index();
     $index->addKey($column_name);
     return $index;
 }
コード例 #2
0
 /**
  * Builds a Table object using a Php class definition
  *
  * This takes care of excluded properties, so buildLinkTable() should be called
  * before buildClassTable().
  *
  * @param $class      Reflection_Class
  * @param $more_field Column
  * @return Table
  */
 private function buildClassTable(Reflection_Class $class, $more_field)
 {
     $table_name = Dao::current()->storeNameOf($class->name);
     $table = new Table($table_name);
     if (!in_array('id', $this->excluded_properties)) {
         $table->addColumn(Column::buildId());
     }
     if ($more_field) {
         $table->addColumn($more_field);
     }
     if ($class->isAbstract()) {
         $table->addColumn(new Column('class', 'varchar(255)'));
     } else {
         foreach ($class->accessProperties() as $property) {
             if (!in_array($property->name, $this->excluded_properties)) {
                 $type = $property->getType();
                 if (($type->isMultipleString() || !$type->isMultiple()) && !$property->isStatic()) {
                     $table->addColumn(Column::buildProperty($property));
                     if ($property->getAnnotation('link')->value == Link_Annotation::OBJECT && $property->getAnnotation('store')->value != 'string') {
                         $class_name = $property->getType()->asString();
                         $this->dependencies_context[$class_name] = $class_name;
                         $table->addForeignKey(Foreign_Key::buildProperty($table_name, $property));
                         $table->addIndex(Index::buildLink($property->getAnnotation('storage')->value));
                     }
                 }
             }
         }
     }
     return $table;
 }
コード例 #3
0
ファイル: Maintainer.php プロジェクト: TuxBoy/Demo-saf
 /**
  * Create a table in database, which has no associated class, using fields names
  *
  * @param $mysqli       mysqli
  * @param $table_name   string
  * @param $column_names string[]
  * @return boolean
  * @todo mysqli context should contain sql builder (ie Select) in order to know if this was
  *       an implicit link table. If then : only one unique index should be built
  */
 private function createImplicitTable(mysqli $mysqli, $table_name, $column_names)
 {
     $only_ids = true;
     $table = new Table($table_name);
     $ids_index = new Index();
     $ids_index->setType(Index::UNIQUE);
     $indexes = [];
     foreach ($column_names as $column_name) {
         $table->addColumn($column_name === 'id' ? Column::buildId() : Column::buildLink($column_name));
         if (substr($column_name, 0, 3) === 'id_') {
             if ($mysqli instanceof Contextual_Mysqli && is_array($mysqli->context)) {
                 $ids_index->addKey($column_name);
                 $index = Index::buildLink($column_name);
                 foreach ($mysqli->context as $context_class) {
                     $id_context_property = 'id_' . Names::classToProperty(Names::setToSingle(Dao::storeNameOf($context_class)));
                     $id_context_property_2 = 'id_' . Names::classToProperty(Names::setToSingle(Namespaces::shortClassName($context_class)));
                     if (in_array($column_name, [$id_context_property, $id_context_property_2])) {
                         $table->addForeignKey(Foreign_Key::buildLink($table_name, $column_name, $context_class));
                         break;
                     }
                 }
                 $indexes[] = $index;
             }
         } else {
             $only_ids = false;
         }
     }
     if ($only_ids) {
         $table->addIndex($ids_index);
     } else {
         foreach ($indexes as $index) {
             $table->addIndex($index);
         }
     }
     $mysqli->query((new Create_Table($table))->build());
     return true;
 }
コード例 #4
0
ファイル: Create_Table.php プロジェクト: TuxBoy/Demo-saf
 /**
  * @return string
  */
 public function build()
 {
     $columns = [];
     foreach ($this->table->getColumns() as $column) {
         $columns[] = $column->toSql();
     }
     $indexes = [];
     foreach ($this->table->getIndexes() as $index) {
         $indexes[$index->getName()] = $index->toSql();
     }
     $foreign_keys = [];
     foreach ($this->table->getForeignKeys() as $foreign_key) {
         $foreign_key_constraint = join(DOT, $foreign_key->getFields());
         $foreign_keys[$foreign_key_constraint] = $foreign_key->toSql();
         if (!isset($indexes[$foreign_key_constraint])) {
             $indexes[$foreign_key_constraint] = Index::buildLink($foreign_key_constraint)->toSql();
         }
     }
     return 'CREATE TABLE IF NOT EXISTS ' . BQ . $this->table->getName() . BQ . ' (' . ($columns ? LF . TAB : '') . join(',' . LF . TAB, $columns) . ($indexes ? ',' . LF . TAB : '') . join(',' . LF . TAB, $indexes) . ($foreign_keys ? ',' . LF . TAB : '') . join(',' . LF . TAB, $foreign_keys) . LF . ') DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci';
 }
コード例 #5
0
ファイル: Table.php プロジェクト: TuxBoy/Demo-saf
 /**
  * @param $index Index
  */
 public function addIndex(Index $index)
 {
     $this->indexes[$index->getName()] = $index;
 }