1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
| ///////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2015 by Charta Software B.V. //
// All rights reserved //
// //
// Version: 1.7.0.83525 //
// Web site: https://pascal.chartasoftware.com/ //
// //
// This code and information are provided "as is" without warranty of //
// any kind. Dissemination of this information or reproduction of //
// this material is strictly forbidden unless prior written permission //
// is obtained from Charta Software B.V.. //
// //
///////////////////////////////////////////////////////////////////////////
unit Sql.Variable;
interface
{$SCOPEDENUMS ON}
uses
Sql.Expression,
Sql.Statement,
Text;
type
TSqlVariableType = (System, User);
TSqlVariable = class(TObject)
private
FType: TSqlVariableType;
FIdentifier: TText;
public
constructor Create(Type_: TSqlVariableType; const Identifier: TText); virtual;
property Type_: TSqlVariableType read FType;
property Identifier: TText read FIdentifier;
end;
TSqlVariableReference = class(TSqlExpression)
public
Variable: TSqlVariable;
constructor Create(Variable: TSqlVariable); reintroduce; virtual;
function Copy(): TSqlExpression; override;
function CopyVariableReference(): TSqlVariableReference;
end;
TSqlSetVariable = class(TSqlStatement)
private
FValue: TSqlExpression;
procedure SetValue(const Value: TSqlExpression);
public
Variable: TSqlVariable;
constructor Create(Variable: TSqlVariable; Value: TSqlExpression); reintroduce; virtual;
destructor Destroy(); override;
function CopyStatement(): TSqlStatement; override;
function CopySetVariable(): TSqlSetVariable;
property Value: TSqlExpression read FValue write SetValue;
end;
implementation
{ TSqlVariable }
constructor TSqlVariable.Create(Type_: TSqlVariableType; const Identifier: TText);
begin
inherited Create();
FType := Type_;
FIdentifier := Identifier;
end;
{ TSqlVariableReference }
function TSqlVariableReference.Copy(): TSqlExpression;
begin
Result := CopyVariableReference();
end;
function TSqlVariableReference.CopyVariableReference: TSqlVariableReference;
begin
Result := TSqlVariableReference.Create(Variable);
end;
constructor TSqlVariableReference.Create(Variable: TSqlVariable);
begin
inherited Create();
Self.Variable := Variable;
end;
{ TSqlSetVariable }
function TSqlSetVariable.CopySetVariable(): TSqlSetVariable;
begin
Result := TSqlSetVariable.Create(Variable, Value.Copy);
end;
function TSqlSetVariable.CopyStatement(): TSqlStatement;
begin
Result := CopySetVariable();
end;
constructor TSqlSetVariable.Create(Variable: TSqlVariable; Value: TSqlExpression);
begin
inherited Create();
Self.Variable := Variable;
Self.Value := Value;
end;
destructor TSqlSetVariable.Destroy();
begin
Value.ReleaseReference();
inherited Destroy();
end;
procedure TSqlSetVariable.SetValue(const Value: TSqlExpression);
begin
if Value <> Self.Value then
begin
Value.AddReference();
Self.Value.ReleaseReference();
FValue := Value;
end;
end;
end.
|