Example #1
0
 /**
  * Returns all triggers on a table.
  *
  * @param string $table_name The name of the table.
  *
  * @return \array[]
  */
 private function getTableTriggers($table_name)
 {
     AuditDataLayer::disconnect();
     AuditDataLayer::connect('localhost', 'test', 'test', self::$dataSchema);
     $triggers = AuditDataLayer::getTableTriggers(self::$dataSchema, $table_name);
     return $triggers;
 }
Example #2
0
 /**
  * Object constructor.
  *
  * @param string  $dataSchema      Data schema name.
  * @param string  $auditSchema     Audit schema name.
  * @param string  $tableName       The table name.
  * @param array[] $theAuditColumns Audit columns from config file.
  * @param bool    $fullOption      If set append table options to rows.
  */
 public function __construct($dataSchema, $auditSchema, $tableName, $theAuditColumns, $fullOption)
 {
     $this->auditColumns = $theAuditColumns;
     $this->fullOption = $fullOption;
     $this->auditTableOptions = AuditDataLayer::getTableOptions($auditSchema, $tableName);
     $this->dataTableOptions = AuditDataLayer::getTableOptions($dataSchema, $tableName);
 }
Example #3
0
 /**
  * Connects to a MySQL instance.
  *
  * @param array $settings The settings from the configuration file.
  */
 protected function connect($settings)
 {
     $host = $this->getSetting($settings, true, 'database', 'host');
     $user = $this->getSetting($settings, true, 'database', 'user');
     $password = $this->getSetting($settings, true, 'database', 'password');
     $database = $this->getSetting($settings, true, 'database', 'data_schema');
     AuditDataLayer::setIo($this->io);
     AuditDataLayer::connect($host, $user, $password, $database);
 }
 /**
  * Drops all triggers.
  */
 private function dropTriggers()
 {
     $data_schema = $this->config['database']['data_schema'];
     $triggers = AuditDataLayer::getTriggers($data_schema);
     foreach ($triggers as $trigger) {
         $this->io->logInfo('Dropping trigger <dbo>%s</dbo> from table <dbo>%s</dbo>', $trigger['trigger_name'], $trigger['table_name']);
         AuditDataLayer::dropTrigger($data_schema, $trigger['trigger_name']);
     }
 }
Example #5
0
 /**
  * Returns a SQL statement for creating the audit table.
  *
  * @return string
  */
 public function buildStatement()
 {
     $code = new MySqlCompoundSyntaxCodeStore();
     $code->append(sprintf('create table `%s`.`%s`', $this->auditSchemaName, $this->tableName));
     // Create SQL for columns.
     $code->append('(');
     $code->append($this->getColumnDefinitions());
     // Create SQL for table options.
     $tableOptions = AuditDataLayer::getTableOptions($this->dataSchemaName, $this->tableName);
     $code->append(sprintf(') engine=%s character set=%s collate=%s', $tableOptions['engine'], $tableOptions['character_set_name'], $tableOptions['table_collation']));
     return $code->getCode();
 }
Example #6
0
 /**
  * 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);
 }
Example #7
0
 /**
  * {@inheritdoc}
  */
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $this->io = new StratumStyle($input, $output);
     $this->configFileName = $input->getArgument('config file');
     $this->readConfigFile();
     // Create database connection with params from config file
     $this->connect($this->config);
     $audit = new Audit($this->config, $this->configMetadata, $this->io);
     $status = $audit->main();
     // Drop database connection
     AuditDataLayer::disconnect();
     $this->rewriteConfig();
     return $status;
 }
Example #8
0
 /**
  * Test audit table is created correctly.
  */
 public function test01()
 {
     $application = new Application();
     $application->add(new AuditCommand());
     /** @var AuditCommand $command */
     $command = $application->find('audit');
     $command->setRewriteConfigFile(false);
     $commandTester = new CommandTester($command);
     $commandTester->execute(['command' => $command->getName(), 'config file' => __DIR__ . '/config/audit.json']);
     $this->assertSame(0, $commandTester->getStatusCode());
     // Reconnect to DB.
     AuditDataLayer::connect('localhost', 'test', 'test', self::$dataSchema);
     $table1_data = AuditDataLayer::getTableOptions('test_data', 'TABLE1');
     $table1_audit = AuditDataLayer::getTableOptions('test_audit', 'TABLE1');
     $this->assertEquals($table1_data, $table1_audit, 'TABLE1');
     $table1_data = AuditDataLayer::getTableOptions('test_data', 'TABLE2');
     $table1_audit = AuditDataLayer::getTableOptions('test_audit', 'TABLE2');
     $this->assertEquals($table1_data, $table1_audit, 'TABLE2');
     $table1_data = AuditDataLayer::getTableOptions('test_data', 'TABLE3');
     $table1_audit = AuditDataLayer::getTableOptions('test_audit', 'TABLE3');
     $this->assertEquals($table1_data, $table1_audit, 'TABLE3');
 }
Example #9
0
 /**
  * Getting list of all tables from information_schema of database from config file.
  */
 public function listOfTables()
 {
     $this->dataSchemaTables = AuditDataLayer::getTablesNames($this->config['database']['data_schema']);
     $this->auditSchemaTables = AuditDataLayer::getTablesNames($this->config['database']['audit_schema']);
 }
Example #10
0
 /**
  * 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;
 }
Example #11
0
 private function runAudit()
 {
     $application = new Application();
     $application->add(new AuditCommand());
     /** @var AuditCommand $command */
     $command = $application->find('audit');
     $command->setRewriteConfigFile(false);
     $commandTester = new CommandTester($command);
     $commandTester->execute(['command' => $command->getName(), 'config file' => __DIR__ . '/config/audit.json']);
     // Reconnect to MySQL.
     StaticDataLayer::disconnect();
     StaticDataLayer::connect('localhost', 'test', 'test', self::$dataSchema);
     AuditDataLayer::connect('localhost', 'test', 'test', self::$dataSchema);
 }
Example #12
0
 /**
  * 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');
     }
 }
Example #13
0
 /**
  * Releases all table locks.
  */
 private function unlockTables()
 {
     AuditDataLayer::unlockTables();
 }