/** * Object constructor. * * @param string $dataSchema Data database schema. * @param string $auditSchema Audit database schema. * @param string $tableName Table name. * @param array[] $auditColumns Audit columns from config file. */ public function __construct($dataSchema, $auditSchema, $tableName, $auditColumns) { $this->dataSchema = $dataSchema; $this->auditSchema = $auditSchema; $this->tableName = $tableName; $this->auditColumns = $auditColumns; $dataColumns = new TableColumnsMetadata(AuditDataLayer::getTableColumns($this->dataSchema, $this->tableName)); $auditColumns = AuditDataLayer::getTableColumns($this->auditSchema, $this->tableName); $auditColumns = $this->addNotNull($auditColumns); $auditColumns = new TableColumnsMetadata($auditColumns); $this->createDiffArray($dataColumns, $auditColumns); }
/** * Processed known tables. * * @return int The exit status. */ private function knownTables() { $status = 0; foreach ($this->dataSchemaTables as $table) { if ($this->config['tables'][$table['table_name']]['audit']) { if (isset($this->configMetadata['table_columns'][$table['table_name']])) { $tableColumns = $this->configMetadata['table_columns'][$table['table_name']]; } else { $tableColumns = []; } $configTable = new TableMetadata($table['table_name'], $this->config['database']['data_schema'], $tableColumns); $currentTable = new AuditTable($this->io, $configTable, $this->config['database']['audit_schema'], $this->auditColumnsMetadata, $this->config['tables'][$table['table_name']]['alias'], $this->config['tables'][$table['table_name']]['skip']); // Ensure an audit table exists. if (StaticDataLayer::searchInRowSet('table_name', $table['table_name'], $this->auditSchemaTables) === null) { $currentTable->createAuditTable(); } // Drop and create audit triggers and add new columns to the audit table. $ok = $currentTable->main($this->config['additional_sql']); if ($ok) { $columns = new TableColumnsMetadata(AuditDataLayer::getTableColumns($this->config['database']['data_schema'], $table['table_name'])); $this->setConfigTableColumns($table['table_name'], $columns); } else { $status += 1; } } } return $status; }
/** * Resolves the canonical column types of the audit table columns. */ private function resolveCanonicalAuditColumns() { if (empty($this->config['audit_columns'])) { $this->auditColumnsMetadata = new TableColumnsMetadata(); } else { $schema = $this->config['database']['audit_schema']; $tableName = '_TMP_' . uniqid(); AuditDataLayer::createTemporaryTable($schema, $tableName, $this->config['audit_columns']); $columns = AuditDataLayer::getTableColumns($schema, $tableName); AuditDataLayer::dropTemporaryTable($schema, $tableName); foreach ($this->config['audit_columns'] as $audit_column) { $key = StaticDataLayer::searchInRowSet('column_name', $audit_column['column_name'], $columns); if (isset($audit_column['value_type'])) { $columns[$key]['value_type'] = $audit_column['value_type']; } if (isset($audit_column['expression'])) { $columns[$key]['expression'] = $audit_column['expression']; } } $this->auditColumnsMetadata = new TableColumnsMetadata($columns, 'AuditColumnMetadata'); } }
/** * Selects metadata of all columns of table. * * @param string $schemaName The name of the table schema. * @param string $tableName The name of the table. * * @return \array[] */ private function getTableColumns($schemaName, $tableName) { $tables = AuditDataLayer::getTableColumns($schemaName, $tableName); return $tables; }
/** * Compare columns from table in data_schema with columns in config file. * * @return array<string,TableColumnsMetadata> */ private function getTableColumnInfo() { $columnActual = new TableColumnsMetadata(AuditDataLayer::getTableColumns($this->auditSchemaName, $this->configTable->getTableName())); $columnsConfig = TableColumnsMetadata::combine($this->auditColumns, $this->configTable->getColumns()); $columnsTarget = TableColumnsMetadata::combine($this->auditColumns, $this->dataTableColumnsDatabase); $newColumns = TableColumnsMetadata::notInOtherSet($columnsTarget, $columnActual); $obsoleteColumns = TableColumnsMetadata::notInOtherSet($columnsConfig, $columnsTarget); $alteredColumns = $this->getAlteredColumns(); $this->logColumnInfo($newColumns, $obsoleteColumns, $alteredColumns); return ['new_columns' => $newColumns, 'obsolete_columns' => $obsoleteColumns, 'altered_columns' => $alteredColumns]; }