04-database_builder.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace cx_newsletter;
  3. use \wpdb;
  4. use \cx_appengine\string_builder;
  5. abstract class database_builder
  6. extends database_worker
  7. implements database_builder_interface {
  8. public function __construct(
  9. wpdb $database,
  10. table_names $tables,
  11. database_versions_manager $versions
  12. ) {
  13. parent::__construct($database, $tables);
  14. $this->versions = $versions;
  15. }
  16. protected function drop_table(string $name) : void {
  17. $query = $this->get_database()->prepare('drop table if exists '.$name);
  18. $this->get_database()->query($query);
  19. }
  20. protected function table_exists(string $name) : bool {
  21. $name = $this->get_database()->esc_like($name);
  22. $query = $this->get_database()->prepare('show tables like %s', $name);
  23. return $this->get_database()->get_var($query) === $name;
  24. }
  25. protected function add_column(
  26. string $table,
  27. string $column,
  28. string $type
  29. ) : void {
  30. $query = (
  31. 'alter table '.$table.' '.
  32. 'add column '.$column.' '.$type
  33. );
  34. $this->get_database()->query($query);
  35. }
  36. protected function add_foreign_key(
  37. string $table,
  38. string $column,
  39. string $foreign_table,
  40. string $foreign_column
  41. ) : void {
  42. $query = (
  43. 'alter table '.$table.' '.
  44. 'add foreign key ('.$column.') '.
  45. 'references '.$foreign_table.'('.$foreign_column.')'
  46. );
  47. $this->get_database()->query($query);
  48. }
  49. protected function create_table(string $name, array $structure) : void {
  50. $query = 'create table '.$name.' ';
  51. $query .= $this->string_from_structure($structure);
  52. $this->get_database()->query($query);
  53. }
  54. private function string_from_structure(array $structure) : string {
  55. $flat = [];
  56. foreach ($structure as $key => $type) {
  57. array_push($flat, $key.' '.$type);
  58. }
  59. $result = new string_builder($flat, ', ');
  60. $result->push(')');
  61. $result->push_start('(');
  62. return $result->get();
  63. }
  64. protected function get_versions() : database_versions_manager {
  65. return $this->versions;
  66. }
  67. private database_versions_manager $versions;
  68. }