/**
  * Get mongo connection URI
  *
  * @param \Phalcon\Config $config
  * @return string
  */
 private function getConnectUri(\Phalcon\Config $config)
 {
     if ($config->offsetExists('user') && $config->offsetExists('password')) {
         return "mongodb://" . $config['user'] . ":" . $config['password'] . "@" . $config['host'] . ":" . $config['port'] . "/" . $config['dbname'];
     } else {
         return "mongodb://" . $config['host'] . ":" . $config['port'] . "/" . $config['dbname'];
     }
 }
 /**
  * Resolves the DB Schema
  *
  * @param \Phalcon\Config $config
  * @return null|string
  */
 public static function resolveDbSchema(Config $config)
 {
     if ($config->offsetExists('schema')) {
         return $config->get('schema');
     }
     if (self::DB_ADAPTER_POSTGRESQL == $config->get('adapter')) {
         return 'public';
     }
     if ($config->offsetExists('dbname')) {
         return $config->get('dbname');
     }
     return null;
 }
Exemple #3
0
 /**
  * Resolves the DB Schema
  *
  * @param \Phalcon\Config $config
  * @return null|string
  */
 public static function resolveDbSchema(Config $config)
 {
     if ($config->offsetExists('schema')) {
         return $config->get('schema');
     }
     if (self::DB_ADAPTER_POSTGRESQL == $config->get('adapter')) {
         return 'public';
     }
     if (self::DB_ADAPTER_SQLITE == $config->get('adapter')) {
         // SQLite only supports the current database, unless one is
         // attached. This is not the case, so don't return a schema.
         return null;
     }
     if ($config->offsetExists('dbname')) {
         return $config->get('dbname');
     }
     return null;
 }
 /**
  * Initial module configuration params
  *
  * @param \Phalcon\Config $config
  * @throws \Sonar\Exceptions\AppServiceException
  */
 public function __construct(\Phalcon\Config $config)
 {
     if (!$this->socketService) {
         if (isset($config->socket) === false) {
             throw new AppServiceException('There is no option `socket` in your configurations');
         }
         if ($config->offsetExists('debug') === true && boolval($config->debug) === true) {
             define('SONAR_VERBOSE', true);
         }
         $this->socketService = new SocketService($config);
     }
 }
 /**
  * Generate specified table migration
  *
  * @param      $version
  * @param      $table
  * @param null $exportData
  *
  * @return string
  * @throws \Phalcon\Db\Exception
  */
 public static function generate($version, $table, $exportData = null)
 {
     $oldColumn = null;
     $allFields = array();
     $numericFields = array();
     $tableDefinition = array();
     $snippet = new Snippet();
     if (self::$_databaseConfig->offsetExists('schema')) {
         $defaultSchema = self::$_databaseConfig->get('schema');
     } elseif (self::$_databaseConfig->get('adapter') == 'Postgresql') {
         $defaultSchema = 'public';
     } elseif (self::$_databaseConfig->offsetExists('dbname')) {
         $defaultSchema = self::$_databaseConfig->get('dbname');
     } else {
         $defaultSchema = null;
     }
     $description = self::$_connection->describeColumns($table, $defaultSchema);
     foreach ($description as $field) {
         /** @var \Phalcon\Db\ColumnInterface $field */
         $fieldDefinition = array();
         switch ($field->getType()) {
             case Column::TYPE_INTEGER:
                 $fieldDefinition[] = "'type' => Column::TYPE_INTEGER";
                 $numericFields[$field->getName()] = true;
                 break;
             case Column::TYPE_VARCHAR:
                 $fieldDefinition[] = "'type' => Column::TYPE_VARCHAR";
                 break;
             case Column::TYPE_CHAR:
                 $fieldDefinition[] = "'type' => Column::TYPE_CHAR";
                 break;
             case Column::TYPE_DATE:
                 $fieldDefinition[] = "'type' => Column::TYPE_DATE";
                 break;
             case Column::TYPE_DATETIME:
                 $fieldDefinition[] = "'type' => Column::TYPE_DATETIME";
                 break;
             case 17:
                 // If so, then Phalcon is support for Column::TYPE_TIMESTAMP constant
                 $fieldDefinition[] = "'type' => Column::TYPE_TIMESTAMP";
                 break;
             case Column::TYPE_DECIMAL:
                 $fieldDefinition[] = "'type' => Column::TYPE_DECIMAL";
                 $numericFields[$field->getName()] = true;
                 break;
             case Column::TYPE_TEXT:
                 $fieldDefinition[] = "'type' => Column::TYPE_TEXT";
                 break;
             case Column::TYPE_BOOLEAN:
                 $fieldDefinition[] = "'type' => Column::TYPE_BOOLEAN";
                 break;
             case Column::TYPE_FLOAT:
                 $fieldDefinition[] = "'type' => Column::TYPE_FLOAT";
                 break;
             case Column::TYPE_DOUBLE:
                 $fieldDefinition[] = "'type' => Column::TYPE_DOUBLE";
                 break;
             case Column::TYPE_TINYBLOB:
                 $fieldDefinition[] = "'type' => Column::TYPE_TINYBLOB";
                 break;
             case Column::TYPE_BLOB:
                 $fieldDefinition[] = "'type' => Column::TYPE_BLOB";
                 break;
             case Column::TYPE_MEDIUMBLOB:
                 $fieldDefinition[] = "'type' => Column::TYPE_MEDIUMBLOB";
                 break;
             case Column::TYPE_LONGBLOB:
                 $fieldDefinition[] = "'type' => Column::TYPE_LONGBLOB";
                 break;
             case Column::TYPE_JSON:
                 $fieldDefinition[] = "'type' => Column::TYPE_JSON";
                 break;
             case Column::TYPE_JSONB:
                 $fieldDefinition[] = "'type' => Column::TYPE_JSONB";
                 break;
             case Column::TYPE_BIGINTEGER:
                 $fieldDefinition[] = "'type' => Column::TYPE_BIGINTEGER";
                 break;
             default:
                 throw new DbException('Unrecognized data type ' . $field->getType() . ' at column ' . $field->getName());
         }
         if (null !== ($default = $field->getDefault())) {
             $fieldDefinition[] = "'default' => '{$default}'";
         }
         //if ($field->isPrimary()) {
         //	$fieldDefinition[] = "'primary' => true";
         //}
         if ($field->isUnsigned()) {
             $fieldDefinition[] = "'unsigned' => true";
         }
         if ($field->isNotNull()) {
             $fieldDefinition[] = "'notNull' => true";
         }
         if ($field->isAutoIncrement()) {
             $fieldDefinition[] = "'autoIncrement' => true";
         }
         if (self::$_databaseConfig->adapter == 'Postgresql' && in_array($field->getType(), [Column::TYPE_BOOLEAN, Column::TYPE_INTEGER, Column::TYPE_BIGINTEGER])) {
             // nothing
         } else {
             if ($field->getSize()) {
                 $fieldDefinition[] = "'size' => " . $field->getSize();
             } else {
                 $fieldDefinition[] = "'size' => 1";
             }
         }
         if ($field->getScale()) {
             $fieldDefinition[] = "'scale' => " . $field->getScale();
         }
         if ($oldColumn != null) {
             $fieldDefinition[] = "'after' => '" . $oldColumn . "'";
         } else {
             $fieldDefinition[] = "'first' => true";
         }
         $oldColumn = $field->getName();
         $tableDefinition[] = $snippet->getColumnDefinition($field->getName(), $fieldDefinition);
         $allFields[] = "'" . $field->getName() . "'";
     }
     $indexesDefinition = array();
     $indexes = self::$_connection->describeIndexes($table, $defaultSchema);
     foreach ($indexes as $indexName => $dbIndex) {
         $indexDefinition = array();
         foreach ($dbIndex->getColumns() as $indexColumn) {
             $indexDefinition[] = "'" . $indexColumn . "'";
         }
         $indexesDefinition[] = $snippet->getIndexDefinition($indexName, $indexDefinition);
     }
     $referencesDefinition = array();
     $references = self::$_connection->describeReferences($table, $defaultSchema);
     foreach ($references as $constraintName => $dbReference) {
         $columns = array();
         foreach ($dbReference->getColumns() as $column) {
             $columns[] = "'" . $column . "'";
         }
         $referencedColumns = array();
         foreach ($dbReference->getReferencedColumns() as $referencedColumn) {
             $referencedColumns[] = "'" . $referencedColumn . "'";
         }
         $referenceDefinition = array();
         $referenceDefinition[] = "'referencedSchema' => '" . $dbReference->getReferencedSchema() . "'";
         $referenceDefinition[] = "'referencedTable' => '" . $dbReference->getReferencedTable() . "'";
         $referenceDefinition[] = "'columns' => array(" . join(",", $columns) . ")";
         $referenceDefinition[] = "'referencedColumns' => array(" . join(",", $referencedColumns) . ")";
         $referencesDefinition[] = $snippet->getReferenceDefinition($constraintName, $referenceDefinition);
     }
     $optionsDefinition = array();
     $tableOptions = self::$_connection->tableOptions($table, $defaultSchema);
     foreach ($tableOptions as $optionName => $optionValue) {
         if (self::$_skipAI && strtoupper($optionName) == "AUTO_INCREMENT") {
             $optionValue = '';
         }
         $optionsDefinition[] = "'" . strtoupper($optionName) . "' => '" . $optionValue . "'";
     }
     $classVersion = preg_replace('/[^0-9A-Za-z]/', '', $version);
     $className = Text::camelize($table) . 'Migration_' . $classVersion;
     // morph()
     $classData = $snippet->getMigrationMorph($className, $table, $tableDefinition);
     if (count($indexesDefinition)) {
         $classData .= $snippet->getMigrationDefinition('indexes', $indexesDefinition);
     }
     if (count($referencesDefinition)) {
         $classData .= $snippet->getMigrationDefinition('references', $referencesDefinition);
     }
     if (count($optionsDefinition)) {
         $classData .= $snippet->getMigrationDefinition('options', $optionsDefinition);
     }
     $classData .= "            )\n        );\n    }\n";
     // up()
     $classData .= $snippet->getMigrationUp();
     if ($exportData == 'always') {
         $classData .= $snippet->getMigrationBatchInsert($table, $allFields);
     }
     $classData .= "\n    }\n";
     // down()
     $classData .= $snippet->getMigrationDown();
     if ($exportData == 'always') {
         $classData .= $snippet->getMigrationBatchDelete($table);
     }
     $classData .= "\n    }\n";
     // afterCreateTable()
     if ($exportData == 'oncreate') {
         $classData .= $snippet->getMigrationAfterCreateTable($table, $allFields);
     }
     // end of class
     $classData .= "\n}\n";
     // dump data
     if ($exportData == 'always' || $exportData == 'oncreate') {
         $fileHandler = fopen(self::$_migrationPath . $version . '/' . $table . '.dat', 'w');
         $cursor = self::$_connection->query('SELECT * FROM ' . $table);
         $cursor->setFetchMode(Db::FETCH_ASSOC);
         while ($row = $cursor->fetchArray()) {
             $data = array();
             foreach ($row as $key => $value) {
                 if (isset($numericFields[$key])) {
                     if ($value === '' || is_null($value)) {
                         $data[] = 'NULL';
                     } else {
                         $data[] = addslashes($value);
                     }
                 } else {
                     $data[] = "'" . addslashes($value) . "'";
                 }
                 unset($value);
             }
             fputs($fileHandler, join('|', $data) . PHP_EOL);
             unset($row);
             unset($data);
         }
         fclose($fileHandler);
     }
     return $classData;
 }
Exemple #6
0
 public function offsetExists($index)
 {
     return parent::offsetExists($index);
 }
 /**
  * 注册模块
  */
 protected function registerModules()
 {
     if ($this->config->offsetExists('modules')) {
         $this->app->registerModules($this->config->modules->toArray());
     }
 }