sqlite.class.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <?php
  2. /**
  3. * The control file of sqlite class of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
  6. * @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author liuyongkai <liuyongkai@easycorp.ltd>
  8. * @package sqlite
  9. * @link http://www.zentao.net
  10. */
  11. class sqlite
  12. {
  13. /**
  14. * 全局$app对象。
  15. * The global app object.
  16. *
  17. * @var object
  18. * @access public
  19. */
  20. public $app;
  21. /**
  22. * 全局$config对象。
  23. * The global config object.
  24. *
  25. * @var object
  26. * @access public
  27. */
  28. public $config;
  29. /**
  30. * 全局$mysql对象。
  31. * The global mysql object.
  32. *
  33. * @var object
  34. * @access public
  35. */
  36. public $mysql;
  37. /**
  38. * 全局$sqlite对象。
  39. * The global sqlite object.
  40. *
  41. * @var object
  42. * @access public
  43. */
  44. public $dbh = null;
  45. /**
  46. * __construct.
  47. *
  48. * @access public
  49. * @return void
  50. */
  51. public function __construct($params)
  52. {
  53. global $app, $config, $dbh;
  54. $this->app = $app;
  55. $this->mysql = $dbh;
  56. $this->config = $config;
  57. $file = empty($params) || !isset($params->file) ? '' : $params->file;
  58. $this->connectSqlite($file);
  59. }
  60. /**
  61. * 使用PDO连接SQLite数据库。
  62. * Connect to sqlite database by PDO.
  63. *
  64. * @param string $sqliteFile
  65. * @access public
  66. * @return object
  67. */
  68. public function connectSqlite($sqliteFile = '')
  69. {
  70. $tmpRoot = $this->app->getTmpRoot();
  71. if(empty($sqliteFile) || !is_file($sqliteFile)) $sqliteFile = $tmpRoot . 'sqlite.db';
  72. $sqliteFile = realpath($sqliteFile);
  73. if(strpos($sqliteFile, $tmpRoot) !== 0) return helper::end("The sqlite file '$sqliteFile' is not in the tmp root '$tmpRoot'");
  74. if(!is_file($sqliteFile)) return helper::end("The sqlite file '$sqliteFile' is not exists");
  75. $dbh = new PDO("sqlite:$sqliteFile");
  76. $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
  77. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  78. $this->dbh = $dbh;
  79. return $this;
  80. }
  81. /**
  82. * 将MySQL数据类型转化为SQLite数据类型。
  83. * Convert MySQL attr to SQLite attr.
  84. *
  85. * @param string $sql
  86. * @access public
  87. * @return string
  88. */
  89. public function formatAttr($sql)
  90. {
  91. $sql = str_replace('`', '', $sql);
  92. $sql = preg_replace('/\s*int\s*\(\d+\)\s*NOT NULL AUTO_INCREMENT/i', ' INTEGER PRIMARY KEY AUTOINCREMENT', $sql);
  93. $sql = preg_replace('/\s*int\s*\(\d+\)\s*AUTO_INCREMENT/i', ' INTEGER PRIMARY KEY AUTOINCREMENT', $sql);
  94. $sql = preg_replace('/\s*tinyint\(\d+\)/i', ' INTEGER', $sql);
  95. $sql = preg_replace('/\s*smallint\(\d+\)/i', ' INTEGER', $sql);
  96. $sql = preg_replace('/\s*mediumint\(\d+\)/i', ' INTEGER', $sql);
  97. $sql = preg_replace('/\s*int\(\d+\)/i', ' INTEGER', $sql);
  98. $sql = preg_replace('/\s*bigint\(\d+\)/i', ' INTEGER', $sql);
  99. $sql = preg_replace('/\s*float/i', ' REAL', $sql);
  100. $sql = preg_replace('/\s*double/i', ' REAL', $sql);
  101. $sql = preg_replace('/\s*decimal/i', ' REAL', $sql);
  102. $sql = preg_replace('/\s*datetime/i', ' TEXT', $sql);
  103. $sql = preg_replace('/\s*timestamp/i', ' TEXT', $sql);
  104. $sql = preg_replace('/\s*time/i', ' TEXT', $sql);
  105. $sql = preg_replace('/\s*date/i', ' TEXT', $sql);
  106. $sql = preg_replace('/\s*enum\([^)]*\)/i', ' TEXT', $sql);
  107. $sql = preg_replace('/\s*set\([^)]*\)/i', ' TEXT', $sql);
  108. $sql = preg_replace('/\s*year/i', ' INTEGER', $sql);
  109. $sql = preg_replace('/\s*bit/i', ' INTEGER', $sql);
  110. $sql = preg_replace('/\s*UNSIGNED/i', '', $sql);
  111. $sql = preg_replace('/\s*DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP/i', '', $sql);
  112. return $sql;
  113. }
  114. /**
  115. * 处理SQL语句。
  116. * Format sql.
  117. *
  118. * @param string $sql
  119. * @access public
  120. * @return string
  121. */
  122. public function formatSQL($sql)
  123. {
  124. // $sql = $this->formatAttr($sql);
  125. return $sql;
  126. }
  127. /**
  128. * 尝试从SQLite中执行查询语句,如果抛出异常,则从MySQL中执行查询语句。
  129. * Query sql by SQLite, if throw exception, query sql by MySQL.
  130. *
  131. * @param string $sql
  132. * @access public
  133. * @return PDOStatement|false
  134. */
  135. public function query($sql)
  136. {
  137. try
  138. {
  139. return $this->dbh->query($this->formatSQL($sql));
  140. }
  141. catch(PDOException $e)
  142. {
  143. return $this->mysql->query($sql);
  144. }
  145. }
  146. /**
  147. * 执行查询语句。
  148. * Query sql without format.
  149. *
  150. * @param string $sql
  151. * @access public
  152. * @return PDOStatement|false
  153. */
  154. public function rawQuery($sql)
  155. {
  156. $stmt = $this->dbh->prepare($sql);
  157. $stmt->execute();
  158. return $stmt;
  159. }
  160. /**
  161. * 执行SQL语句,返回受影响的行数。
  162. * Execute sql.
  163. *
  164. * @param string $sql
  165. * @access public
  166. * @return int|false
  167. */
  168. public function exec($sql)
  169. {
  170. return $this->dbh->exec($sql);
  171. }
  172. /**
  173. * 开始事务。
  174. * Begin transaction.
  175. *
  176. * @access public
  177. * @return bool
  178. */
  179. public function beginTransaction()
  180. {
  181. return $this->dbh->beginTransaction();
  182. }
  183. /**
  184. * 回滚事务。
  185. * Roll back if transaction failed.
  186. *
  187. * @access public
  188. * @return bool
  189. */
  190. public function rollBack()
  191. {
  192. return $this->dbh->rollBack();
  193. }
  194. /**
  195. * 提交事务。
  196. * Commit transaction.
  197. *
  198. * @access public
  199. * @return bool
  200. */
  201. public function commit()
  202. {
  203. return $this->dbh->commit();
  204. }
  205. }