SqlSchema.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. namespace KarmaFW\Database\Sql;
  3. // TODO: a transformer en une classe trait de SqlDb
  4. class SqlSchema
  5. {
  6. protected $db;
  7. public function __construct($db)
  8. {
  9. $this->db = $db;
  10. }
  11. /* DATABASES */
  12. public function useDatabase($database_name) /* : bool */
  13. {
  14. $sql = "use " . $database_name;
  15. $ret = $this->db->createQuery()->execute($sql);
  16. return ($ret->getStatus() == 'success');
  17. }
  18. public function dropDatabase($database_name, $if_exists=false) /* : bool */
  19. {
  20. if ($if_exists) {
  21. $sql = "drop database if exists " . $database_name;
  22. } else {
  23. $sql = "drop database " . $database_name;
  24. }
  25. $ret = $this->db->createQuery()->execute($sql);
  26. return ($ret->getStatus() == 'success');
  27. }
  28. public function createDatabase($database_name, $if_not_exists=false) /* : bool */
  29. {
  30. if ($if_not_exists) {
  31. $sql = "create database if not exists " . $database_name;
  32. } else {
  33. $sql = "create database " . $database_name;
  34. }
  35. $ret = $this->db->createQuery()->execute($sql);
  36. return ($ret->getStatus() == 'success');
  37. }
  38. public function listDatabases($database=null) /* : array */
  39. {
  40. $sql = "show databases";
  41. if (! empty($database)) {
  42. $sql .= " like '%" . str_replace("'", "\\'", $database) . "%'";
  43. }
  44. $rs = $this->db->createQuery()->execute($sql);
  45. $rows = $rs->fetchAll();
  46. $databases = array_map(function ($row) {return array_values($row)[0];}, $rows);
  47. return $databases;
  48. }
  49. /* TABLES */
  50. public function createTable($table_name, array $columns, array $indexes=[], $if_not_exists=false) /* : bool */
  51. {
  52. if ($if_not_exists) {
  53. $sql = "create table if not exists " . $table_name . " (" . PHP_EOL;
  54. } else {
  55. $sql = "create table " . $table_name . " (" . PHP_EOL;
  56. }
  57. $sql_table_columns = [];
  58. foreach ($columns as $column_name => $column_type) {
  59. $sql_table_columns[] = "`" . $column_name . "` " . $column_type;
  60. }
  61. foreach ($indexes as $index_def) {
  62. $sql_table_columns[] = $index_def;
  63. }
  64. $sql .= implode(',' . PHP_EOL, $sql_table_columns) . PHP_EOL;
  65. $sql .= ")";
  66. $query = $this->db->createQuery();
  67. $ret = $query->execute($sql);
  68. //pre($query);
  69. return ($ret->getStatus() == 'success');
  70. }
  71. public function dropTable($table_name, $if_exists=false) /* : bool */
  72. {
  73. if ($if_exists) {
  74. $sql = "drop table if exists " . $table_name;
  75. } else {
  76. $sql = "drop table " . $table_name;
  77. }
  78. $ret = $this->db->createQuery()->execute($sql);
  79. return ($ret->getStatus() == 'success');
  80. }
  81. public function listTables($table=null, $database=null) /* : array */
  82. {
  83. $sql = "show tables";
  84. if (! empty($database)) {
  85. $sql .= " from `" . $database . "`";
  86. }
  87. if (! empty($table)) {
  88. $sql .= " like '%" . str_replace("'", "\\'", $table) . "%'";
  89. }
  90. $rs = $this->db->execute($sql);
  91. $rows = $rs->fetchAll();
  92. $tables = array_map(function ($row) {return array_values($row)[0];}, $rows);
  93. return $tables;
  94. }
  95. public function tableExists($table=null, $database=null) /* : array */
  96. {
  97. $sql = "show tables";
  98. if (! empty($database)) {
  99. $sql .= " from `" . $database . "`";
  100. }
  101. if (! empty($table)) {
  102. $sql .= " like '" . str_replace("'", "\\'", $table) . "'";
  103. }
  104. $rs = $this->db->execute($sql);
  105. $tables = $rs->fetchAll();
  106. return ! empty($tables);
  107. }
  108. /* COLUMNS */
  109. public function listTableColumns($table, $column=null) /* : array */
  110. {
  111. $sql = "show columns from " . $table;
  112. if (! empty($column)) {
  113. $sql .= " like '%" . str_replace("'", "\\'", $column) . "%'";
  114. }
  115. $rs = $this->db->execute($sql);
  116. $rows = $rs->fetchAll();
  117. $columns = arrayAddKeyFromColumn($rows, 'Field');
  118. return $columns;
  119. }
  120. public function listTableIndexes($table) /* : array */
  121. {
  122. $sql = "show indexes from " . $table;
  123. $rs = $this->db->execute($sql);
  124. $rows = $rs->fetchAll();
  125. //$indexes = arrayAddKeyFromColumn($rows, 'Field');
  126. return $rows;
  127. }
  128. }