Open Data Catalog v2.0.0
DatabaseTable.php
Go to the documentation of this file.
1 <?php
2 
4 
5 use Drupal\Core\Database\Connection;
6 use Dkan\Datastore\Resource;
9 use Psr\Log\LogLevel;
10 
16 class DatabaseTable extends AbstractDatabaseTable implements \JsonSerializable {
17 
18  use LoggerTrait;
19 
25  private $resource;
26 
35  public function __construct(Connection $connection, Resource $resource) {
36  // Set resource before calling the parent constructor. The parent calls
37  // getTableName which we implement and needs the resource to operate.
38  $this->resource = $resource;
39  parent::__construct($connection);
40  }
41 
45  public function getSummary() {
46  $columns = array_keys($this->getSchema()['fields']);
47  $numOfColumns = count($columns);
48  $numOfRows = $this->count();
49  return new TableSummary($numOfColumns, $columns, $numOfRows);
50  }
51 
57  public function jsonSerialize() {
58  return (object) ['resource' => $this->resource];
59  }
60 
64  public static function hydrate(string $json) {
65  $data = json_decode($json);
66  $resource = Resource::hydrate(json_encode($data->resource));
67 
68  return new DatabaseTable(\Drupal::service('database'), $resource);
69  }
70 
77  protected function getTableName() {
78  if ($this->resource) {
79  return "dkan_datastore_{$this->resource->getId()}";
80  }
81  return "dkan_datastore_does_not_exist";
82  }
83 
87  protected function prepareData(string $data, string $id = NULL): array {
88  $decoded = json_decode($data);
89  if ($decoded === NULL) {
90  $this->log(
91  'dkan_datastore_import',
92  "Error decoding id:@id, data: @data.",
93  ['@id' => $id, '@data' => $data],
94  LogLevel::ERROR
95  );
96  throw new \Exception("Import for {$id} error when decoding {$data}");
97  }
98  elseif (!is_array($decoded)) {
99  $this->log(
100  'dkan_datastore_import',
101  "Array expected while decoding id:@id, data: @data.",
102  ['@id' => $id, '@data' => $data],
103  LogLevel::ERROR
104  );
105  throw new \Exception("Import for {$id} returned an error when preparing table header: {$data}");
106  }
107  return $decoded;
108  }
109 
113  protected function primaryKey() {
114  return "record_number";
115  }
116 
120  protected function getNonSerialFields() {
121  $fields = parent::getNonSerialFields();
122  $index = array_search($this->primaryKey(), $fields);
123  if ($index !== FALSE) {
124  unset($fields[$index]);
125  }
126  return $fields;
127  }
128 
132  public function setSchema($schema) {
133  $fields = $schema['fields'];
134  $new_field = [
135  $this->primaryKey() =>
136  [
137  'type' => 'serial',
138  'unsigned' => TRUE,
139  'not null' => TRUE,
140  ],
141  ];
142  $fields = array_merge($new_field, $fields);
143 
144  $schema['fields'] = $fields;
145  $schema['primary key'] = [$this->primaryKey()];
146  parent::setSchema($schema);
147  }
148 
149 }
Drupal\dkan_common\Storage\AbstractDatabaseTable\$connection
$connection
Definition: AbstractDatabaseTable.php:20
Drupal\dkan_datastore\Storage\DatabaseTable\prepareData
prepareData(string $data, string $id=NULL)
Definition: DatabaseTable.php:87
Drupal\dkan_datastore\Storage
Definition: DatabaseTable.php:3
Drupal\dkan_datastore\Storage\DatabaseTable
Definition: DatabaseTable.php:16
Drupal\dkan_datastore\Storage\TableSummary
Definition: TableSummary.php:10
Drupal\dkan_datastore\Storage\DatabaseTable\getNonSerialFields
getNonSerialFields()
Definition: DatabaseTable.php:120
Drupal\dkan_datastore\Storage\DatabaseTable\primaryKey
primaryKey()
Definition: DatabaseTable.php:113
Drupal\dkan_datastore\Storage\DatabaseTable\setSchema
setSchema($schema)
Definition: DatabaseTable.php:132
Drupal\dkan_datastore\Storage\DatabaseTable\getTableName
getTableName()
Definition: DatabaseTable.php:77
Drupal\dkan_datastore\Storage\DatabaseTable\getSummary
getSummary()
Definition: DatabaseTable.php:45
Drupal\dkan_common\Storage\AbstractDatabaseTable
Definition: AbstractDatabaseTable.php:16
Drupal\dkan_datastore\Storage\DatabaseTable\__construct
__construct(Connection $connection, Resource $resource)
Definition: DatabaseTable.php:35
Drupal\dkan_common\Storage\AbstractDatabaseTable\count
count()
Definition: AbstractDatabaseTable.php:192
Drupal\dkan_datastore\Storage\DatabaseTable\jsonSerialize
jsonSerialize()
Definition: DatabaseTable.php:57
Drupal\dkan_datastore\Storage\DatabaseTable\hydrate
static hydrate(string $json)
Definition: DatabaseTable.php:64
Drupal\dkan_common\LoggerTrait
trait LoggerTrait
Definition: LoggerTrait.php:11