Guest User

Untitled

a guest
May 28th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.39 KB | None | 0 0
  1. <?
  2. /*
  3. abstract class dbDriver {
  4. abstract function getField($id);
  5. abstract function getNumFields();
  6. abstract function gettingRows();
  7. abstract function getFieldCount();
  8. abstract function getFieldTable($id);
  9.  
  10. abstract function query($sql);
  11. abstract function getErrors();
  12. abstract function escape($value);
  13. }
  14. */
  15.  
  16. class Query extends App {
  17.  
  18. private $_mode;
  19. private $_whereData = array();
  20. private $_selectData;
  21. private $_joinData;
  22. private $_setData;
  23. private $_joins;
  24. private $_joinOns;
  25. static public $_fromValue;
  26. private $_whereValue;
  27. private $_limit;
  28. private $_orderBy;
  29. private $_updateValue;
  30. private $_insert;
  31. private $_selectFunction;
  32.  
  33. static protected $_driver;
  34. static $last = '';
  35.  
  36. public function __construct() {
  37. //$this->getLibrary('Config');
  38. }
  39.  
  40. public function connect($config=null) {
  41. if(!isset($config)) {
  42. $config = $this->lib->Config->get('Site', 'database');
  43. }
  44. if(is_string($config)) {
  45. $config = $this->lib->Config->get('Databases', $config);
  46. }
  47. //@todo enable support for multiple drivers at one time
  48. self::$_driver = $this->getLibrary('Databases/Drivers/' . $config['driver'] . '.php');
  49. self::$_driver->connect($config);
  50. }
  51.  
  52. function insert($values) {
  53. $this->_insert = $values;
  54. //D::show($this->_insert, 'Incert');
  55. return $this;
  56. }
  57.  
  58. function into($tableName) {
  59. $this->_mode='insert';
  60. return $this->from($tableName);
  61. }
  62.  
  63. public function select($cols='*') {
  64. $this->_mode = 'select';
  65. self::$_fromValue = null;
  66. $this->_whereData = array();
  67. $this->_selectData = null;
  68. $this->_joinData = null;
  69. $this->_setData = null;
  70. $this->_joins = null;
  71. $this->_joinOns = null;
  72. $this->_whereValue = null;
  73. $this->_limit = null;
  74. $this->_orderBy = null;
  75. $this->_updateValue = null;
  76. $this->_insert = null;
  77. $this->_selectFunction = null;
  78. if(is_string($cols)) {
  79. $this->_selectData = func_get_args();
  80. } else {
  81. $this->_selectData = (array)$cols;
  82. }
  83. return $this;
  84. }
  85.  
  86. function from($val) {
  87. /*
  88. join(', ',
  89. f_keyMap(
  90. function($v, $k) {
  91. if(is_string($k)) {
  92. return $v . ' AS ' $v;
  93. }
  94. return $v;
  95. },
  96. $val
  97. )
  98. );
  99. */
  100.  
  101. if(is_array($val)) {
  102. Query::$_fromValue = f_keyMap(
  103. function($v, $k) {
  104. if(is_string($k)) {
  105. return $v . ' AS ' . $k;
  106. }
  107. return $v;
  108. },
  109. $val
  110. );
  111. } else {
  112. Query::$_fromValue = $val;
  113. }
  114.  
  115. //Query::$_fromValue = f_flatten(func_get_args());
  116.  
  117.  
  118.  
  119. return $this;
  120. }
  121. public function where() {
  122. $this->_whereValue = func_get_args();
  123. // D::log($this->_whereValue, 'where val');
  124. return $this;
  125. }
  126.  
  127. public function update($value) {
  128. $this->_mode = 'update';
  129. Query::$_fromValue = f_flatten(func_get_args());
  130. return $this;
  131. }
  132. function delete() {
  133. $this->_mode = 'delete';
  134. return $this;
  135. }
  136.  
  137. function set($value) {
  138. $this->_setValue = $value;
  139. return $this;
  140.  
  141. }
  142.  
  143. function count() {
  144. $this->_selectFunction = 'count';
  145. return $this;
  146. }
  147.  
  148. function join($values) {
  149. // D::log($values, 'Join Values');
  150. if(!array_key_exists(0, $values)) {
  151. $values = array($values);
  152. }
  153. $this->_joins = $values;
  154. return $this;
  155. }
  156.  
  157. public function orderBy($value=null) {
  158. $this->_orderBy = $value;
  159. return $this;
  160. }
  161.  
  162. public function limit() {
  163. $this->_limit = f_flatten(func_get_args());
  164. return $this;
  165. }
  166.  
  167. function _buildSelect() {
  168. if(isset($this->_selectFunction)) {
  169. return $this->_selectFunction .'(*)';
  170. }
  171. return join(', ', f_keyMap(
  172. function($v, $k) {
  173. if(is_string($k)) {
  174. if(is_array($v)) {
  175. return $k . '(' . join(',', $v) . ')';
  176. }
  177. return $k . ' AS \'' . $v . '\'';
  178. }
  179. return $v;
  180. },
  181. $this->_selectData
  182. ));
  183. }
  184.  
  185. static function _buildWhere($group, $groupOperator='AND', $escape=true) {
  186. $keys = array_keys($group);
  187. if(is_int(f_last($keys)) && is_string(f_last($group))) {
  188. $operator = f_last($group);
  189. $group = f_chop($group);
  190. } else {
  191. $operator = '=';
  192. }
  193. if(is_int(f_first($keys)) && is_string(f_first($group))) {
  194. $groupOperator = f_first($group);
  195. $group = f_rest($group);
  196. }
  197. $builtArray = f_keyMap(
  198. function($value, $key) use($groupOperator, $operator, $escape) {
  199. if(is_int($key) && is_array($value)) {
  200. //Group? @todo double check to make sure OR is working
  201. $bWhere = Query::_buildWhere($value, $groupOperator, $escape);
  202. if(!empty($bWhere)) {
  203. return '(' . "\n" . $bWhere . ')';
  204. } else {
  205. return null;
  206. }
  207. }
  208. if(is_string($key)) {
  209. static $escapeFunc = 'Query::nullEscape';
  210. if(!$escape) {
  211. $escapeFunc = 'nothing';
  212. }
  213. //column
  214. if(is_array($value)) {
  215. //IN or group
  216. return Query::escape($key) . ' IN (' . join(', ', array_map($escapeFunc, $value)) . ')';
  217. } else {
  218. $value = call_user_func($escapeFunc, $value);
  219. if($value === 'null') {
  220. if($operator == '=') {
  221. $operator = 'IS';
  222. } else {
  223. $operator = 'IS NOT';
  224. }
  225.  
  226. }
  227. return Query::escape($key) . ' ' . $operator . ' ' . $value;
  228. }
  229. }
  230. },
  231. $group
  232. );
  233. // D::log($builtArray, 'built array');
  234.  
  235. if(!empty($builtArray)) {
  236. return join(' ' . $groupOperator . ' ', array_filter($builtArray));
  237. }
  238. }
  239.  
  240. function _buildOrderBy() {
  241. if(isset($this->_orderBy)) {
  242. return "\n" . ' ORDER BY ' . join(' , ', f_keyMap(
  243. function($v, $k) {
  244. return Query::escape($k) . ' ' . Query::escape($v);
  245. },
  246. $this->_orderBy
  247. ));
  248. }
  249. }
  250.  
  251. function _buildJoins() {
  252. if(!empty($this->_joins)) {
  253. return join(' ', f_map(
  254. function($join) {
  255. return join(' ', f_keyMap(
  256. function($joinSets, $jTable) {
  257. //$jTableName = f_last(explode(' ', $jTable));
  258. return "\n" . ' LEFT JOIN ' . $jTable . ' ON ' . Query::_buildWhere($joinSets, 'AND', false);
  259. },
  260. $join
  261. ));
  262. },
  263. $this->_joins
  264. ));
  265. }
  266. }
  267.  
  268. function _buildLimit() {
  269. if(!empty($this->_limit)) {
  270. return "\n" . ' LIMIT ' . join(', ', $this->_limit);
  271. }
  272. }
  273.  
  274. function _buildSet($values, $separator='=') {
  275. return join(
  276. ', ',
  277. f_keyMap(
  278. function($v, $k) use ($separator) {
  279. return Query::escape($k) . ' ' . $separator . Query::nullEscape($v);
  280. },
  281. $values
  282. )
  283. );
  284. }
  285. function _buildWhereString($values) {
  286. if(empty($values)) {
  287. return '';
  288. }
  289. $whereContent = $this->_buildWhere($values);
  290. if(!empty($whereContent)) {
  291. // D::log($whereContent, 'where content');
  292. return "\n" . ' WHERE ' . $whereContent;
  293. }
  294. }
  295. function _build() {
  296. //puts all the stuff together in a magic happy fashion.
  297. $sqlString = '';
  298. switch ($this->_mode) {
  299. case 'select':
  300. //adds in our select values
  301.  
  302. $sqlString = 'SELECT ' . $this->_buildSelect() . "\n" . ' FROM ' . join(', ', (array)Query::$_fromValue) . $this->_buildJoins() . "\n" . $this->_buildWhereString($this->_whereValue) . $this->_buildOrderBy() . $this->_buildLimit();
  303. break;
  304. case 'update':
  305. $sqlString = 'UPDATE ' . f_first(Query::$_fromValue) . "\n" . ' SET ' . $this->_buildSet($this->_setValue) . $this->_buildWhereString($this->_whereValue);
  306. break;
  307. case 'insert':
  308. /*
  309. f_reduce(
  310. function($a, $b) {
  311. return array_merge(array_keys((array)$b), array_keys((array)$a));
  312. },
  313. $this->_insert
  314. );
  315. */
  316. if(!is_array(f_first($this->_insert) )) {
  317. $this->_insert = array($this->_insert);
  318. }
  319. $cols = array_map(function($v) {return '[' . $v . ']';}, array_keys(array_reduce($this->_insert, 'array_merge_recursive', array())));
  320.  
  321.  
  322. $sqlString = 'INSERT INTO ' . f_first(Query::$_fromValue) . ' (' . join(', ', $cols) . ') VALUES ' . join(', ', f_map(
  323. function($v) use($cols) {
  324. return '(' . join(',', f_map(
  325. function ($i) use ($v) {
  326. $i = substr($i, 1, -1);
  327. if(isset($v[$i])) {
  328. return Query::nullEscape($v[$i]);
  329. } else {
  330. return 'null';
  331. }
  332. },
  333. $cols
  334. )) . ')';
  335. },
  336. D::log($this->_insert, 'raw incert')
  337. ));
  338. break;
  339. case 'delete':
  340. $sqlString = 'DELETE FROM ' . join(', ', Query::$_fromValue) . $this->_buildWhereString($this->_whereValue);
  341. break;
  342. }
  343. $this->sql = $sqlString;
  344. D::log($this->sql, 'SQL Build');
  345. return $this->sql;
  346. }
  347.  
  348. public function go() {
  349. self::$last = $this->_build();
  350. if(!self::$_driver->query(self::$last)) {
  351. return false;
  352. }
  353. return $this;
  354.  
  355. if(!isset($sql)) {
  356. $sql = $this->_build();
  357. }
  358. $this->whereGroups = null;
  359. // echo "\nSQL:\n" . $sql . "\n";
  360. // D::log($sql, 'Sql call');
  361. // $this->clear();
  362. return Databases::f('query', array($sql, 'raw'));
  363. }
  364.  
  365. public function results($type='object') {
  366. if(!isset($sql)) {
  367. $sql = $this->_build();
  368. }
  369.  
  370. // $this->clear();
  371. /* echo "\nSQL:\n" . $sql . "\n"; */
  372. return Databases::f('query', array($sql, $type));
  373. }
  374.  
  375. public function getDriver() {
  376. return self::$_driver;
  377. }
  378. public static function nullEscape($var) {
  379. if(!isset($var)) {
  380. return 'null';
  381. }
  382. if(is_bool($var) || is_int($var)) {
  383. return $var;
  384. }
  385. return "'" . self::escape($var) . "'";
  386. }
  387.  
  388. public static function escape($var) {
  389. //Databases::f('query', array($sql, $type));
  390. //@todo change this.
  391. if(is_bool($var) || is_int($var)) {
  392. return $var;
  393. }
  394. return mysql_escape_string($var);
  395. }
  396.  
  397.  
  398. /*
  399. ->where()
  400. $this->select('*')->where(array('item' => 5)) //SELECT * FROM table WHERE item = '5'
  401. $this->select('*')->where(array('item' => 5, 'thing' => 'what')) //SELECT * FROM table WHERE item = '5' AND thing = 'what'
  402. $this->select('*')->where(array('OR', 'item' => 5, 'thing' => 'what')) //SELECT * FROM table WHERE item = '5' OR thing = 'what'
  403. $this->select('*')->where(array('item' => 5, 'thing' => 'what', '!=')) //SELECT * FROM table WHERE item != '5' OR thing != 'what'
  404. $this->select('*')->where(array('item' => array('what', 'who')) //SELECT * FROM table WHERE item IN ('what', 'who')
  405.  
  406. ->join()
  407. $this->select('*')->from('Club_RnD.dbo.Posts')->join('Club_RnD.dbo.Comments', array('Club_RnD.dbo.Posts.comments' => 'Club_RnD.dbo.Comments.id'))
  408. //SELECT * FROM Club_RnD.dbo.Posts LEFT JOIN Club_RnD.dbo.Comments ON Club_RnD.dbo.Posts.comments = Club_RnD.dbo.Comments.id
  409. //would a binary try be better for table.collumn name?
  410. //$this->query->select('*')->from('Posts')->join('Club_RnD.dbo.Comments', array('Club_RnD.dbo.Posts.comments' => 'Club_RnD.dbo.Comments.id'));
  411.  
  412. ->select()
  413. $this->select('*') //SELECT *
  414. $this->select('colName', 'otherCol') //SELECT colName, otherCol
  415. $this->select(array('colName', 'otherCol')) //SELECT colName, otherCol
  416.  
  417. ->delete()
  418. $this->delete() //DELETE FROM tableName
  419.  
  420. ->set()
  421. $this->set(array('key' => 'value') //SET key = 'value'
  422. */
  423. }
Add Comment
Please, Sign In to add comment