private function _db_messages($basic_fix = 0)
 {
     $notices = [];
     $warnings = [];
     $errors = [];
     $json = Database::generateJson();
     if (!empty($json)) {
         // get version tables
         $migrationTables = json_decode($json);
         // get current tables
         $dbTables = new \stdClass();
         $dbTablesSelect = DB::select('Show Tables');
         $prefix = DB::getTablePrefix();
         foreach ($dbTablesSelect as $table) {
             $table = (array) $table;
             $table = reset($table);
             if (empty($prefix) || strrpos($table, $prefix) === 0) {
                 $name = substr($table, strlen($prefix));
                 $dbTables->{$name} = DB::select('SHOW COLUMNS FROM ' . $table);
             }
         }
         unset($dbTables->migrations);
         // compare
         foreach ($dbTables as $dbTableName => $dbColumns) {
             if (!empty($migrationTables->{$dbTableName})) {
                 foreach ($dbColumns as $dbColumnData) {
                     if (!empty($migrationTables->{$dbTableName}->{$dbColumnData->Field})) {
                         $update = false;
                         $migrationFieldData = $migrationTables->{$dbTableName}->{$dbColumnData->Field};
                         if ($migrationFieldData->Type !== $dbColumnData->Type) {
                             $update = true;
                             $warnings[] = 'Warning: ' . $dbTableName . '/' . $dbColumnData->Field . ' type needs changing, \'' . $dbColumnData->Type . '\' => \'' . $migrationFieldData->Type . '\'';
                         }
                         if ($migrationFieldData->Null !== $dbColumnData->Null) {
                             $update = true;
                             $warnings[] = 'Warning: ' . $dbTableName . '/' . $dbColumnData->Field . ' allow null setting needs changing, \'' . $dbColumnData->Null . '\' => \'' . $migrationFieldData->Null . '\'';
                         }
                         if ($migrationFieldData->Extra !== $dbColumnData->Extra) {
                             $update = true;
                             if (empty($migrationFieldData->Extra)) {
                                 $warnings[] = 'Warning: ' . $dbTableName . '/' . $dbColumnData->Field . ' \'' . $dbColumnData->Extra . '\' setting needs removing';
                             } else {
                                 $warnings[] = 'Warning: ' . $dbTableName . '/' . $dbColumnData->Field . ' \'' . $migrationFieldData->Extra . '\' needs setting';
                             }
                         }
                         if ($migrationFieldData->Default !== $dbColumnData->Default) {
                             if ($basic_fix == 1 && $migrationFieldData->Default === null) {
                                 DB::statement('ALTER TABLE ' . $prefix . $dbTableName . ' ALTER COLUMN `' . $dbColumnData->Field . '` DROP DEFAULT;');
                             } else {
                                 $update = true;
                             }
                             $warnings[] = 'Warning: ' . $dbTableName . '/' . $dbColumnData->Field . ' default values needs changing, ' . ($dbColumnData->Default !== null ? '\'' . $dbColumnData->Default . '\'' : 'No default') . ' => ' . ($migrationFieldData->Default !== null ? '\'' . $migrationFieldData->Default . '\'' : 'No default');
                         }
                         if ($basic_fix == 1 && $update) {
                             if (strpos($migrationFieldData->Default, 'CURRENT_TIMESTAMP') !== false) {
                                 $default = ' DEFAULT ' . $migrationFieldData->Default;
                             } elseif ($migrationFieldData->Default !== null) {
                                 $default = ' DEFAULT \'' . $migrationFieldData->Default . '\'';
                             } else {
                                 $default = '';
                             }
                             if ($migrationFieldData->Null == 'NO') {
                                 $null = ' NOT NULL';
                             } else {
                                 $null = ' NULL';
                             }
                             DB::statement('ALTER TABLE ' . $prefix . $dbTableName . ' MODIFY COLUMN `' . $dbColumnData->Field . '` ' . $migrationFieldData->Type . $null . $default . ' ' . $migrationFieldData->Extra . ';');
                         }
                         unset($migrationTables->{$dbTableName}->{$dbColumnData->Field});
                     } else {
                         $notices[] = 'Notice: Extra Field ' . $dbTableName . '/' . $dbColumnData->Field . ' found';
                     }
                 }
                 $check_empty = (array) $migrationTables->{$dbTableName};
                 if (empty($check_empty)) {
                     unset($migrationTables->{$dbTableName});
                 }
             } else {
                 $notices[] = 'Notice: Extra Table ' . $dbTableName . ' found';
             }
         }
         // missing tables and notices/warnings
         $errors = (array) $migrationTables;
     }
     if ($basic_fix == 1) {
         return ['redirect' => \redirect()->route('coaster.admin.system.validate-db')];
     }
     return ['errors' => $errors, 'warnings' => $warnings, 'notices' => $notices];
 }