1: <?php
2:
3: namespace Yajra\Oci8\Schema;
4:
5: use Illuminate\Database\Connection;
6:
7: class Sequence
8: {
9: /**
10: * @var \Illuminate\Database\Connection|\Yajra\Oci8\Oci8Connection
11: */
12: protected $connection;
13:
14: /**
15: * @param Connection $connection
16: */
17: public function __construct(Connection $connection)
18: {
19: $this->connection = $connection;
20: }
21:
22: /**
23: * function to create oracle sequence
24: *
25: * @param string $name
26: * @param integer $start
27: * @param boolean $nocache
28: * @return boolean
29: */
30: public function create($name, $start = 1, $nocache = false)
31: {
32: if (! $name) {
33: return false;
34: }
35:
36: $nocache = $nocache ? 'nocache' : '';
37:
38: return $this->connection->statement("create sequence {$name} start with {$start} {$nocache}");
39: }
40:
41: /**
42: * function to safely drop sequence db object
43: *
44: * @param string $name
45: * @return boolean
46: */
47: public function drop($name)
48: {
49: // check if a valid name and sequence exists
50: if (! $name || ! $this->exists($name)) {
51: return false;
52: }
53:
54: return $this->connection->statement("
55: declare
56: e exception;
57: pragma exception_init(e,-02289);
58: begin
59: execute immediate 'drop sequence {$name}';
60: exception
61: when e then
62: null;
63: end;");
64: }
65:
66: /**
67: * function to check if sequence exists
68: *
69: * @param string $name
70: * @return boolean
71: */
72: public function exists($name)
73: {
74: if (! $name) {
75: return false;
76: }
77:
78: return $this->connection->selectOne(
79: "select * from all_sequences where sequence_name=upper('{$name}') and sequence_owner=upper(user)"
80: );
81: }
82:
83: /**
84: * get sequence next value
85: *
86: * @param string $name
87: * @return integer
88: */
89: public function nextValue($name)
90: {
91: if (! $name) {
92: return 0;
93: }
94:
95: return $this->connection->selectOne("SELECT $name.NEXTVAL as id FROM DUAL")->id;
96: }
97:
98: /**
99: * same function as lastInsertId. added for clarity with oracle sql statement.
100: *
101: * @param string $name
102: * @return integer
103: */
104: public function currentValue($name)
105: {
106: return $this->lastInsertId($name);
107: }
108:
109: /**
110: * function to get oracle sequence last inserted id
111: *
112: * @param string $name
113: * @return integer
114: */
115: public function lastInsertId($name)
116: {
117: // check if a valid name and sequence exists
118: if (! $name || ! $this->exists($name)) {
119: return 0;
120: }
121:
122: return $this->connection->selectOne("select {$name}.currval as id from dual")->id;
123: }
124: }
125: