· 5 years ago · May 22, 2020, 08:38 PM
1<?php
2declare(strict_types=1);
3
4namespace emperialspe\skyblock;
5
6use emperialspe\skyblock\tasks\BulkDatabaseQueryTask;
7use emperialspe\skyblock\tasks\DatabaseQueryTask;
8use PDO;
9use PDOException;
10use pocketmine\Server;
11use function is_array;
12
13class Database{
14
15 /** @var PDO */
16 private static $database;
17 /** @var mixed[] */
18 private static $credentials = [];
19
20 /**
21 * @param bool $new
22 * @param array $credentials
23 *
24 * @return PDO
25 */
26 public static function getDatabase(bool $new = false, array $credentials) : PDO{
27 return $new ? new PDO("mysql:host=" . $credentials["host"] . ";dbname=" . $credentials["schema"], $credentials["user"], $credentials["password"]) : self::$database;
28 }
29
30 public static function load(string $host, string $schema, string $user, string $password) : void{
31 self::$credentials = [
32 "host" => $host,
33 "schema" => $schema,
34 "user" => $user,
35 "password" => $password
36 ];
37 self::$database = $database = self::getDatabase(true, self::$credentials);
38 $database->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
39
40 // Create your tables here
41 // $database->exec("CREATE TABLE IF NOT EXISTS ...(...)");
42 }
43
44 /**
45 * @param string $query
46 * @param array $params
47 *
48 * @return mixed[]
49 */
50 public static function querySync(string $query, array $params = []) : array{
51 try{
52 $stmt = self::$database->prepare($query);
53 if($stmt->execute($params)){
54 $retval = $stmt->fetchAll();
55
56 return is_array($retval) ? $retval : [];
57 }
58 }catch(PDOException $exception){
59 EmperialsSky::getInstance()->getLogger()->error($exception->getMessage());
60
61 return [];
62 }
63
64 return [];
65 }
66
67 /**
68 * @param string $query
69 * @param array $params
70 * @param callable|null $onComplete
71 */
72 public static function queryAsync(string $query, array $params = [], ?callable $onComplete = null) : void{
73 Server::getInstance()->getAsyncPool()->submitTask(new DatabaseQueryTask($query, $params, self::$credentials, $onComplete));
74 }
75
76 /**
77 * @param array $queries
78 */
79 public static function bulkQuerySync(array $queries = []) : void{
80 foreach($queries as $query){
81 try{
82 $stmt = self::$database->prepare($query["query"] ?? "");
83 $stmt->execute($query["params"] ?? []);
84 }catch(PDOException $exception){
85 EmperialsSky::getInstance()->getLogger()->error($exception->getMessage());
86 }
87 }
88 }
89
90 /**
91 * @param array $queries
92 */
93 public static function bulkQueryAsync(array $queries = []) : void{
94 Server::getInstance()->getAsyncPool()->submitTask(new BulkDatabaseQueryTask($queries, self::$credentials));
95 }
96}