Advertisement
Guest User

Untitled

a guest
Dec 20th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.13 KB | None | 0 0
  1. <?php
  2.  
  3. namespace VWA;
  4.  
  5. class Database
  6. {
  7. private $system, $host, $port, $name, $user, $pass, $pdo;
  8.  
  9. public function __construct($system, $host, $port, $name, $user, $pass)
  10. {
  11. $this->system = $system;
  12. $this->host = $host;
  13. $this->port = $port;
  14. $this->name = $name;
  15. $this->user = $user;
  16. $this->pass = $pass;
  17. $this->pdo = new \PDO($system.':host='.$host.';port='.$port.';dbname='.$name.';', $user, $pass);
  18. }
  19.  
  20. public function getPDO() { return $this->pdo; }
  21. public function getSystem() { return $this->system; }
  22.  
  23. public static function createParameterList($count)
  24. {
  25. if ($count == 0)
  26. {
  27. return '';
  28. }
  29. else if ($count == 1)
  30. {
  31. return '?';
  32. }
  33. else
  34. {
  35. $output = '?';
  36. for ($i = 1; $i < $count; $i++)
  37. {
  38. $output .= ', ?';
  39. }
  40.  
  41. return $output;
  42. }
  43. }
  44.  
  45. public function execute($query, $parameters = [])
  46. {
  47. $statement = $this->pdo->prepare($query);
  48.  
  49. if (count($parameters) > 0)
  50. {
  51. $statement->execute($parameters);
  52. }
  53. else
  54. {
  55. $statement->execute();
  56. }
  57.  
  58. echo '<br>';
  59. echo $query;
  60. echo '<br>';
  61.  
  62. return $statement;
  63. }
  64.  
  65. public function select($table, $columns, $condition = '', $parameters = [])
  66. {
  67. $query = 'SELECT ';
  68.  
  69. $first = true;
  70. foreach ($columns as $column)
  71. {
  72. if ($first)
  73. {
  74. $query .= $column;
  75. $first = false;
  76. }
  77. else
  78. {
  79. $query .= ', '.$column;
  80. }
  81. }
  82.  
  83. $query .= ' FROM '.$table;
  84.  
  85. if ($condition != '')
  86. {
  87. $query .= ' WHERE '.$condition;
  88. }
  89.  
  90. return $this->execute($query, $parameters)->fetchAll(\PDO::FETCH_ASSOC);
  91. }
  92.  
  93. public function selectUnique($table, $columns, $targetColumn, $parameter)
  94. {
  95. $result = $this->database->select('users', ['*'], $targetColumn.' = ?', [$parameter]);
  96. if (count($result) == 0)
  97. {
  98. return null;
  99. }
  100. else
  101. {
  102. return $result[0];
  103. }
  104. }
  105.  
  106. public function insert($table, $columns, $parameters = [])
  107. {
  108. return $this->insertMany($table, $columns, [$parameters]);
  109. }
  110.  
  111. public function insertMany($table, $columns, $rows = [[]])
  112. {
  113. $query = 'INSERT INTO '.$table.' (';
  114.  
  115. $first = true;
  116. foreach ($columns as $column)
  117. {
  118. if ($first)
  119. {
  120. $query .= $column;
  121. $first = false;
  122. }
  123. else
  124. {
  125. $query .= ', '.$column;
  126. }
  127. }
  128.  
  129. $query .= ') VALUES ';
  130.  
  131. $outputRow = function($row)
  132. {
  133. $output = '(';
  134. $first = true;
  135. foreach ($row as $value)
  136. {
  137. if ($first)
  138. {
  139. $output .= '?';
  140. $first = false;
  141. }
  142. else
  143. {
  144. $output .= ', ?';
  145. }
  146. }
  147.  
  148. $output .= ')';
  149.  
  150. return $output;
  151. };
  152.  
  153. $parameters = [];
  154. $first = true;
  155. foreach ($rows as $row)
  156. {
  157. if ($first)
  158. {
  159. $query .= $outputRow($row);
  160. $first = false;
  161. }
  162. else
  163. {
  164. $query .= ', '.$outputRow($row);
  165. }
  166.  
  167. foreach ($row as $value)
  168. {
  169. $parameters[] = $value;
  170. }
  171. }
  172.  
  173. echo '<br>START<br>';
  174.  
  175. echo $query;
  176. echo '<br>';
  177. print_r($parameters);
  178.  
  179. $this->execute($query, $parameters);
  180. return $this->pdo->lastInsertId();
  181. }
  182. }
  183.  
  184. class User
  185. {
  186. private $id, $name, $email, $pass;
  187.  
  188. public function __construct($id, $name, $email, $pass)
  189. {
  190. $this->id = $id;
  191. $this->name = $name;
  192. $this->email = $email;
  193. $this->pass = $pass;
  194. }
  195.  
  196. public function getID() { return $this->id; }
  197. public function getName() { return $this->name; }
  198. public function getEmail() { return $this->email; }
  199. public function getPass() { return $this->pass; }
  200. }
  201.  
  202. abstract class LoginResponse
  203. {
  204. const UnknownEmail = 0;
  205. const InvalidPass = 1;
  206. const Success = 2;
  207. }
  208.  
  209. class WebClass
  210. {
  211. private $id, $name, $fields;
  212.  
  213. public function __construct($id, $name)
  214. {
  215. $this->id = $id;
  216. $this->name = $name;
  217. $this->fields = [];
  218. }
  219.  
  220. public function getID() { return $this->id; }
  221. public function getName() { return $this->name; }
  222. public function getFields() { return $this->fields; }
  223.  
  224. public function addFields($fields)
  225. {
  226. $rows = [];
  227. foreach ($fields as $field)
  228. {
  229. $rows[] = [$this->id, $field[0], $field[1]];
  230. }
  231.  
  232. global $vwa;
  233. $lastID = $vwa->getDatabase()->insertMany('fields', ['class', 'name', 'type'], $rows);
  234.  
  235. $offset = count($fields) - 1;
  236. $i = 0;
  237. foreach ($fields as $field)
  238. {
  239. $this->fields[] = new Field($this, $lastID - $offset + $i);
  240. $i++;
  241. }
  242. }
  243.  
  244. public function addField($field)
  245. {
  246. $this->addFields([$field]);
  247. }
  248.  
  249. public function internalAddField($field)
  250. {
  251. $this->fields[] = $field;
  252. }
  253. }
  254.  
  255. class Field
  256. {
  257. private $class, $id, $name, $type;
  258.  
  259. public function __construct($class, $id, $name, $type)
  260. {
  261. $this->class = $class;
  262. $this->id = $id;
  263. $this->name = $name;
  264. $this->type = $type;
  265. }
  266.  
  267. public function getClass() { return $this->class; }
  268. public function getID() { return $this->id; }
  269. public function getName() { return $this->name; }
  270. public function getType() { return $this->type; }
  271. }
  272.  
  273. abstract class WebFieldType
  274. {
  275. const Boolean = 0;
  276. const Integer = 1;
  277. const BigInteger = 2;
  278. const Number = 3;
  279. const PreciseNumber = 4;
  280. const Text = 5;
  281. const Enumeration = 6;
  282. const Object = 7;
  283. }
  284.  
  285. class Entity
  286. {
  287. private $class, $id, $fields;
  288.  
  289. public function __construct($class, $id)
  290. {
  291. $this->class = $class;
  292. $this->id = $id;
  293. $this->fields = [];
  294. }
  295. }
  296.  
  297. abstract class DataSource
  298. {
  299. public function getUsersByID($ids) { return cachedLoad($ids, $this->userByIDCache, $this->loadUsersByID, [$this->userByEmailCache, function($user) { return $user->getEmail(); }]); }
  300. protected abstract function loadUsersByID($ids);
  301. protected $userByIDCache;
  302.  
  303. public function getUsersByEmail($emails) { return cachedLoad($emails, $this->userByEmailCache, $this->loadUsersByEmail, [$this->userByIDCache, function($user) { return $user->getID(); }]); }
  304. protected abstract function loadUsersByEmail($emails);
  305. protected $userByEmailCache;
  306.  
  307. public function getClassesByID($ids) { return cachedLoad($ids, $this->classByIDCache, $this->loadClassesByID, []); }
  308. protected abstract function loadClassesByID($ids);
  309. protected $classByIDCache;
  310.  
  311. public function createClasses($names)
  312. {
  313.  
  314. }
  315.  
  316. protected abstract function constructClasses($names);
  317.  
  318. protected function initialize()
  319. {
  320. $userByIDCache = [];
  321. $userByEmailCache = [];
  322. }
  323.  
  324. protected function cachedLoad($keys, $cache, $load, $sharedCaches)
  325. {
  326. $objects = [];
  327. $uncachedKeys = [];
  328. foreach ($keys as $key)
  329. {
  330. if (array_key_exists($key, $cache))
  331. {
  332. $objects[] = $cache[$key];
  333. }
  334. else
  335. {
  336. $uncachedKeys[] = $key;
  337. }
  338. }
  339.  
  340. if (count($uncachedKeys) > 0)
  341. {
  342. $loadedObjects = $load($uncachedKeys)
  343.  
  344. foreach ($loadedObjects as $loadedObject)
  345. {
  346. $key = $loadedObject['key'];
  347. $object = $loadedObject['object'];
  348.  
  349. foreach ($sharedCaches as $sharedCache)
  350. {
  351. $sharedCache[0][$sharedCache[1]($object)] = $object;
  352. }
  353.  
  354. $cache[$key] = $object;
  355. $objects[] = $object;
  356. }
  357. }
  358.  
  359. return $objects;
  360. }
  361. }
  362.  
  363. class TemporaryDataSource extends DataSource
  364. {
  365. public function __construct()
  366. {
  367. $this->initialize();
  368. }
  369.  
  370. protected function loadUserByID($id) { return null; }
  371.  
  372. protected function loadUserByEmail($email) { return null; }
  373.  
  374. protected function loadClassByID($id) { return null; }
  375.  
  376. protected function constructClass($name)
  377. {
  378.  
  379. }
  380. }
  381.  
  382. class DatabaseDataSource extends DataSource
  383. {
  384. private $database;
  385.  
  386. public function __construct($database)
  387. {
  388. $this->initialize();
  389. $this->database = $database;
  390. }
  391.  
  392. protected function loadUsersByID($ids)
  393. {
  394. $result = $this->database->select('users', ['name', 'email', 'pass'], 'id = IN('.createParameterList(count($ids)).')', $ids);
  395. /*if ($result == null)
  396. {
  397. return null;
  398. }
  399. else
  400. {
  401. return ['key' => $id, 'object' => new User($id, $result['name'], $result['email'], $result['pass'])];
  402. }*/
  403. }
  404.  
  405. protected function loadUsersByEmail($emails)
  406. {
  407. /*$result = $this->database->selectUnique('users', ['id', 'name', 'pass'], 'email', $email);
  408. if ($result == null)
  409. {
  410. return null;
  411. }
  412. else
  413. {
  414. return ['key' => $email, 'object' => new User($result['id'], $result['name'], $email, $result['pass'])];
  415. }*/
  416. }
  417.  
  418. protected function loadClassesByID($ids)
  419. {
  420. /*$result = $this->database->selectUnique('classes', ['name'], 'id', $id);
  421. if ($result == null)
  422. {
  423. return null;
  424. }
  425.  
  426. $class = new WebClass($result[0]['id'], $name);
  427.  
  428. $result = $this->database->select('fields', ['id', 'name', 'type'], 'class = ?', [$class->getID()]);
  429. foreach ($result as $row)
  430. {
  431. $class->internalAddField(new Field($class, $row['id'], $row['name'], $row['type']));
  432. }
  433.  
  434. return $class;*/
  435. }
  436.  
  437. protected function constructClasses($names)
  438. {
  439.  
  440. }
  441. }
  442.  
  443. class Core
  444. {
  445. private $data;
  446.  
  447. public function __construct($data)
  448. {
  449. $this->data = $data;
  450. }
  451.  
  452. public function login($email, $pass)
  453. {
  454. $user = $this->data->getUserByEmail($email);
  455. if ($user == null)
  456. {
  457. return LoginResponse::UnknownEmail;
  458. }
  459. else if (!password_verify($pass, $user->pass))
  460. {
  461. return LoginResponse::InvalidPass;
  462. }
  463. else
  464. {
  465. session_destroy();
  466. session_start();
  467. $_SESSION['user'] = $user;
  468. return LoginResponse::Success;
  469. }
  470. }
  471.  
  472. public function logout()
  473. {
  474. session_destroy();
  475. }
  476.  
  477. public function getCurrentUser()
  478. {
  479. if (!isset($_SESSION['user']))
  480. {
  481. return null;
  482. }
  483. else
  484. {
  485. return $_SESSION['user'];
  486. }
  487. }
  488.  
  489. public function addClass($name, $fields = [])
  490. {
  491. $id = $this->database->insert('classes', ['name'], [$name]);
  492. $class = new WebClass($id, $name);
  493.  
  494. if (count($fields) > 0)
  495. {
  496. $class->addFields($fields);
  497. }
  498.  
  499. return $class;
  500. }
  501.  
  502. public function getClass($name)
  503. {
  504. $result = $this->database->select('classes', ['id'], 'name = ?', [$name]);
  505. if (count($result) == 0)
  506. {
  507. return null;
  508. }
  509.  
  510. $class = new WebClass($result[0]['id'], $name);
  511.  
  512. $result = $this->database->select('fields', ['id', 'name', 'type'], 'class = ?', [$class->getID()]);
  513. foreach ($result as $row)
  514. {
  515. $class->internalAddField(new Field($class, $row['id'], $row['name'], $row['type']));
  516. }
  517.  
  518. return $class;
  519. }
  520. }
  521.  
  522. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement