SqlDb.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <?php
  2. namespace KarmaFW\Database\Sql;
  3. class SqlDb
  4. {
  5. protected $driver = null;
  6. protected $last_query = null;
  7. protected $schema = null;
  8. protected $tools = null;
  9. public $throwOnSqlError = 1;
  10. public $throwOnConnectionError = true;
  11. public function __construct($dsn=null, $driver_class=null)
  12. {
  13. $this->schema = new SqlSchema($this);
  14. $this->tools = new SqlTools($this);
  15. $credentials = $this->parseDSN($dsn);
  16. if (empty($driver_class)) {
  17. $driver_name = $credentials['driver'];
  18. $driver_class = $this->getDriverClass($driver_name);
  19. }
  20. if (empty($driver_class)) {
  21. throw new \Exception("No SQL driver specified. Please define DB_DSN with something like 'mysql://root:pass@localhost/my_app'", 1);
  22. }
  23. $this->driver = new $driver_class($this, $credentials);
  24. if (! empty($credentials['charset'])) {
  25. $charset = $credentials['charset'];
  26. $this->execute("set names " . $charset);
  27. }
  28. }
  29. public function __debugInfo() {
  30. return [
  31. 'driver:protected' => get_class($this->driver) ." Object",
  32. ];
  33. }
  34. /* #### */
  35. protected function getDriverClass($driver_name)
  36. {
  37. $available_drivers = [
  38. 'mysql' => \KarmaFW\Database\Sql\Drivers\Mysqli\MySqliDriver::class,
  39. 'sqlite' => \KarmaFW\Database\Sql\Drivers\Mysqli\SqliteDriver::class,
  40. ];
  41. return (! empty($driver_name) && isset($available_drivers[$driver_name])) ? $available_drivers[$driver_name] : null;
  42. }
  43. public function getDriver()
  44. {
  45. return $this->driver;
  46. }
  47. public function setLastQuery(SqlQuery $last_query)
  48. {
  49. return $this->last_query = $last_query;
  50. }
  51. public function getLastQuery()
  52. {
  53. return $this->last_query;
  54. }
  55. public function createQuery($sql=null)
  56. {
  57. return new SqlQuery($this, $sql);
  58. }
  59. public function getTable($table_name) /* : SqlTable */
  60. {
  61. return new SqlTable($table_name, $this);
  62. }
  63. public function createOrmItem($table_name, $primary_key_values=[]) /* : SqlOrmModel */
  64. {
  65. return new SqlOrmModel($table_name, $primary_key_values, $this);
  66. }
  67. /* CONNECTION */
  68. public function connect()
  69. {
  70. return $this->getDriver()->connect();
  71. }
  72. public function disconnect()
  73. {
  74. return $this->getDriver()->disconnect();
  75. }
  76. public function isConnected()
  77. {
  78. return $this->getDriver()->isConnected();
  79. }
  80. /* #### */
  81. public function execute($sql, $params=[])
  82. {
  83. return $this->createQuery()->execute($sql, $params);
  84. }
  85. public function query($sql, $params=[])
  86. {
  87. // Alias of executeSelectAll
  88. return $this->executeSelectAll($sql, $params);
  89. }
  90. public function executeSelect($sql, $params=[])
  91. {
  92. // Alias of executeSelectAll
  93. return $this->executeSelectAll($sql, $params);
  94. }
  95. public function executeSelectAll($sql, $params=[])
  96. {
  97. return $this->createQuery()->executeSelectAll($sql, $params);
  98. }
  99. public function executeSelectAllWithFoundRows($query, $params=[])
  100. {
  101. return $this->createQuery()->executeSelectAllWithFoundRows($query, $params);
  102. }
  103. public function executeSelectAllPagination($query, $nb_per_page=10, $page_idx=1, $params=[])
  104. {
  105. return $this->createQuery()->executeSelectAllPagination($query, $nb_per_page, $page_idx, $params);
  106. }
  107. public function executeSelectOne($sql, $params=[])
  108. {
  109. return $this->createQuery()->executeSelectOne($sql, $params);
  110. }
  111. public function executeSelectValue($sql, $column_name, $params=[])
  112. {
  113. return $this->createQuery()->executeSelectValue($sql, $column_name, $params);
  114. }
  115. public function executeInsert($sql, $params=[])
  116. {
  117. return $this->createQuery()->executeInsert($sql, $params);
  118. }
  119. public function executeUpdate($sql, $params=[])
  120. {
  121. return $this->createQuery()->executeUpdate($sql, $params);
  122. }
  123. public function executeDelete($sql, $params=[])
  124. {
  125. return $this->createQuery()->executeDelete($sql, $params);
  126. }
  127. public function getInsertId()
  128. {
  129. return $this->getDriver()->getInsertId();
  130. }
  131. public function getAffectedRowsCount()
  132. {
  133. return $this->getDriver()->getAffectedRowsCount();
  134. }
  135. /* SCHEMA */
  136. // DATABASE
  137. public function useDatabase($database_name)
  138. {
  139. return $this->schema->useDatabase($database_name);
  140. }
  141. public function dropDatabase($database_name, $if_exists=false)
  142. {
  143. return $this->schema->dropDatabase($database_name, $if_exists);
  144. }
  145. public function createDatabase($database_name, $if_not_exists=false)
  146. {
  147. return $this->schema->createDatabase($database_name, $if_not_exists);
  148. }
  149. public function listDatabases($database_name=null)
  150. {
  151. return $this->schema->listDatabases($database_name);
  152. }
  153. // TABLE
  154. public function createTable($table_name, array $columns, array $indexes=[], $if_not_exists=false)
  155. {
  156. return $this->schema->createTable($table_name, $columns, $indexes, $if_not_exists);
  157. }
  158. public function dropTable($table_name, $if_exists=false)
  159. {
  160. return $this->schema->dropTable($table_name, $if_exists);
  161. }
  162. public function listTables($table_name=null, $database_name=null)
  163. {
  164. return $this->schema->listTables($table_name, $database_name);
  165. }
  166. /*
  167. public function getTable($table_name)
  168. {
  169. return $this->schema->getTable($table_name);
  170. }
  171. */
  172. // COLUMN
  173. public function listTableColumns($table_name, $column_name=null)
  174. {
  175. return $this->schema->listTableColumns($table_name, $column_name);
  176. }
  177. public function listTableIndexes($table_name)
  178. {
  179. return $this->schema->listTableIndexes($table_name);
  180. }
  181. /* TOOLS */
  182. public function escape($var)
  183. {
  184. return $this->tools->escape($var);
  185. }
  186. public function buildSqlWhere($var)
  187. {
  188. return $this->tools->buildSqlWhere($var);
  189. }
  190. public function buildSqlUpdateValues($var)
  191. {
  192. return $this->tools->buildSqlUpdateValues($var);
  193. }
  194. public function buildSqlInsertValues($var)
  195. {
  196. return $this->tools->buildSqlInsertValues($var);
  197. }
  198. public function buildSqlWhereSearch($q='', $search_fields=[], $min_str_length=1, $max_words=10, $all_words_required=false)
  199. {
  200. return $this->tools->buildSqlWhereSearch($q, $search_fields, $min_str_length, $max_words, $all_words_required);
  201. }
  202. public function parseDSN($var)
  203. {
  204. return $this->tools->parseDSN($var);
  205. }
  206. }