Cerys Lewis
7 months ago
6 changed files with 202 additions and 0 deletions
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\DeegraphPHP\Exceptions; |
||||
|
|
||||
|
use Exception; |
||||
|
|
||||
|
class QueryBuilderConflictingFieldAlreadyExistsException extends Exception |
||||
|
{ |
||||
|
public function __construct( |
||||
|
string $message = "You have tried to set a field which would nullify a field you've previously set.", |
||||
|
int $code = 422 |
||||
|
) { |
||||
|
parent::__construct($message, $code); |
||||
|
$this->message = "$message"; |
||||
|
$this->code = $code; |
||||
|
} |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\DeegraphPHP\Exceptions; |
||||
|
|
||||
|
use Exception; |
||||
|
|
||||
|
class QueryBuilderInvalidInputException extends Exception |
||||
|
{ |
||||
|
public function __construct( |
||||
|
string $message = "The value you have entered doesn't pass regex validation.", |
||||
|
int $code = 422 |
||||
|
) { |
||||
|
parent::__construct($message, $code); |
||||
|
$this->message = "$message"; |
||||
|
$this->code = $code; |
||||
|
} |
||||
|
} |
@ -0,0 +1,17 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\DeegraphPHP\Exceptions; |
||||
|
|
||||
|
use Exception; |
||||
|
|
||||
|
class QueryBuilderRequiredFieldIsNotSetException extends Exception |
||||
|
{ |
||||
|
public function __construct( |
||||
|
string $message = "A field that is required for this operation has not been set.", |
||||
|
int $code = 422 |
||||
|
) { |
||||
|
parent::__construct($message, $code); |
||||
|
$this->message = "$message"; |
||||
|
$this->code = $code; |
||||
|
} |
||||
|
} |
@ -0,0 +1,15 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\DeegraphPHP\QueryBuilder; |
||||
|
|
||||
|
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders\Insert; |
||||
|
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders\Put; |
||||
|
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders\Select; |
||||
|
|
||||
|
class QueryBuilder |
||||
|
{ |
||||
|
public function Put(): Put |
||||
|
{ |
||||
|
return new Put(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\DeegraphPHP\QueryBuilder; |
||||
|
|
||||
|
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderConflictingFieldAlreadyExistsException; |
||||
|
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderException; |
||||
|
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderInvalidInputException; |
||||
|
|
||||
|
trait QueryBuilderTrait |
||||
|
{ |
||||
|
protected function Validate(string $target, string $pattern): string |
||||
|
{ |
||||
|
if (!preg_match(pattern: $pattern, subject: $target)) |
||||
|
throw new QueryBuilderInvalidInputException(); |
||||
|
return $target; |
||||
|
} |
||||
|
|
||||
|
protected function EnsureNotSet(string $target): void |
||||
|
{ |
||||
|
if ($target != "") |
||||
|
throw new QueryBuilderConflictingFieldAlreadyExistsException(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,113 @@ |
|||||
|
<?php |
||||
|
|
||||
|
namespace Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilders; |
||||
|
|
||||
|
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderConflictingFieldAlreadyExistsException; |
||||
|
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderInvalidInputException; |
||||
|
use Darksparrow\DeegraphPHP\Exceptions\QueryBuilderRequiredFieldIsNotSetException; |
||||
|
use Darksparrow\DeegraphPHP\QueryBuilder\QueryBuilderTrait; |
||||
|
|
||||
|
final class Put |
||||
|
{ |
||||
|
use QueryBuilderTrait; |
||||
|
|
||||
|
protected string $PutWhat = ""; |
||||
|
protected string $PutAt = ""; |
||||
|
protected string $PutInto = ""; |
||||
|
protected bool $Safe = false; |
||||
|
|
||||
|
|
||||
|
public function __construct() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @throws QueryBuilderRequiredFieldIsNotSetException |
||||
|
*/ |
||||
|
public function __toString(): string |
||||
|
{ |
||||
|
$builder = "PUT"; |
||||
|
if($this->PutWhat != "") $builder .= " $this->PutWhat"; |
||||
|
|
||||
|
if($this->PutAt != "") $builder .= " $this->PutAt"; |
||||
|
elseif ($this->PutInto != "") $builder .= " $this->PutInto"; |
||||
|
else throw new QueryBuilderRequiredFieldIsNotSetException(); |
||||
|
|
||||
|
if($this->Safe) $builder .= " SAFE"; |
||||
|
return $builder; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* @throws QueryBuilderInvalidInputException |
||||
|
*/ |
||||
|
public function Schema(string $uri): Put |
||||
|
{ |
||||
|
$this->PutWhat = self::Validate( |
||||
|
target: "SCHEMA \"$uri\"", |
||||
|
pattern: "/SCHEMA \".+\"/" |
||||
|
); |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @throws QueryBuilderInvalidInputException |
||||
|
*/ |
||||
|
public function URI(string $uri): Put |
||||
|
{ |
||||
|
$this->PutWhat = self::Validate( |
||||
|
target: "URI \"$uri\"", |
||||
|
pattern: "/URI \".+\"/" |
||||
|
); |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* @throws QueryBuilderInvalidInputException |
||||
|
*/ |
||||
|
public function DataURI(string $mimeType, string $data): Put |
||||
|
{ |
||||
|
$this->PutWhat = self::Validate( |
||||
|
target: "URI \"data:$mimeType;$data\"", |
||||
|
pattern: "/URI \"data:[a-zA-Z0-9]/[a-zA-Z0-9];.+\"/" |
||||
|
); |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* @throws QueryBuilderInvalidInputException |
||||
|
* @throws QueryBuilderConflictingFieldAlreadyExistsException |
||||
|
*/ |
||||
|
public function At(string $node, string $uwu): Put |
||||
|
{ |
||||
|
self::EnsureNotSet($this->PutInto); |
||||
|
$this->PutAt = self::Validate( |
||||
|
target: 'AT {' . $node . '}/' . $uwu, |
||||
|
pattern: "/AT {[a-zA-Z0-9\-]+}\/[a-zA-Z0-9]+/" |
||||
|
); |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* @throws QueryBuilderInvalidInputException |
||||
|
* @throws QueryBuilderConflictingFieldAlreadyExistsException |
||||
|
*/ |
||||
|
public function Into(string $relativePath, string $propertyName): Put |
||||
|
{ |
||||
|
self::EnsureNotSet($this->PutAt); |
||||
|
$this->PutInto = self::Validate( |
||||
|
target: "INTO \"$relativePath\" AS \"$propertyName\"", |
||||
|
pattern: "/INTO \"[a-zA-Z0-9\-]+\" AS \"[a-zA-Z0-9]+\"/" |
||||
|
); |
||||
|
return $this; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public function Safe(): Put |
||||
|
{ |
||||
|
$this->Safe = true; |
||||
|
return $this; |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue