From d548af2717755fe0b47cc0cee1dc5342a4a8e656 Mon Sep 17 00:00:00 2001 From: Toby Wicks Date: Wed, 26 Mar 2014 22:25:29 +1030 Subject: [PATCH] Added support for advanced SQL expressions. Closes #1. --- ISQLExpression.cls | 25 ++++++++++++++ SQLArithmeticExpression.cls | 68 +++++++++++++++++++++++++++++++++++++ SQLBitwiseExpression.cls | 63 ++++++++++++++++++++++++++++++++++ SQLComparisonExpression.cls | 41 ++++++++++++++++++++++ SQLConditions.cls | 37 ++++++++++++++++++-- SQLFieldExpression.cls | 34 +++++++++++++++++++ SQLValueExpression.cls | 37 ++++++++++++++++++++ dbo.vbp | 6 ++++ 8 files changed, 308 insertions(+), 3 deletions(-) create mode 100755 ISQLExpression.cls create mode 100755 SQLArithmeticExpression.cls create mode 100755 SQLBitwiseExpression.cls create mode 100755 SQLComparisonExpression.cls create mode 100755 SQLFieldExpression.cls create mode 100755 SQLValueExpression.cls diff --git a/ISQLExpression.cls b/ISQLExpression.cls new file mode 100755 index 0000000..11e1718 --- /dev/null +++ b/ISQLExpression.cls @@ -0,0 +1,25 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "ISQLExpression" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = True +' ___________________________________________________ +' +' © Hi-Integrity Systems 2014. All rights reserved. +' www.hisystems.com.au - Toby Wicks +' ___________________________________________________ +' + +Option Explicit + +Public Property Get SQL(ByVal eValue As ConnectionTypeEnum) As String + +End Property diff --git a/SQLArithmeticExpression.cls b/SQLArithmeticExpression.cls new file mode 100755 index 0000000..c201c64 --- /dev/null +++ b/SQLArithmeticExpression.cls @@ -0,0 +1,68 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "SQLArithmeticExpression" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = True +' ___________________________________________________ +' +' © Hi-Integrity Systems 2014. All rights reserved. +' www.hisystems.com.au - Toby Wicks +' ___________________________________________________ +' + +Option Explicit + +Implements ISQLExpression + +Public Enum SQLArithmeticOperatorEnum + dboArithmeticAdd + dboArithmeticSubtract + dboArithmeticMultiply + dboArithmeticDivide + dboArithmeticModulus +End Enum + +Public Left As ISQLExpression +Public Right As ISQLExpression +Public Operator As SQLArithmeticOperatorEnum + +Private Sub Class_Initialize() + + Set Left = New SQLValueExpression + Set Right = New SQLValueExpression + Operator = dboArithmeticAdd + +End Sub + +Private Property Get ISQLExpression_SQL(ByVal eConnection As ConnectionTypeEnum) As String + + ISQLExpression_SQL = "(" & Left.SQL(eConnection) & " " & OperatorToString(Operator) & " " & Right.SQL(eConnection) & ")" + +End Property + +Private Function OperatorToString(ByVal eOperator As SQLArithmeticOperatorEnum) As String + + Select Case eOperator + Case dboArithmeticAdd + OperatorToString = "+" + Case dboArithmeticDivide + OperatorToString = "/" + Case dboArithmeticModulus + OperatorToString = "%" + Case dboArithmeticMultiply + OperatorToString = "*" + Case dboArithmeticSubtract + OperatorToString = "-" + Case Else + RaiseError dboErrorInvalidArgument + End Select + +End Function diff --git a/SQLBitwiseExpression.cls b/SQLBitwiseExpression.cls new file mode 100755 index 0000000..b4416cd --- /dev/null +++ b/SQLBitwiseExpression.cls @@ -0,0 +1,63 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "SQLBitwiseExpression" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = True +' ___________________________________________________ +' +' © Hi-Integrity Systems 2014. All rights reserved. +' www.hisystems.com.au - Toby Wicks +' ___________________________________________________ +' + +Option Explicit + +Implements ISQLExpression + +Public Enum SQLBitwiseOperatorEnum + dboBitwiseAnd + dboBitwiseOr + dboBitwiseXor +End Enum + +Public Left As ISQLExpression +Public Right As ISQLExpression +Public Operator As SQLBitwiseOperatorEnum + +Private Sub Class_Initialize() + + Set Left = New SQLValueExpression + Set Right = New SQLValueExpression + Operator = dboArithmeticAdd + +End Sub + +Private Property Get ISQLExpression_SQL(ByVal eConnection As ConnectionTypeEnum) As String + + ISQLExpression_SQL = "(" & Left.SQL(eConnection) & " " & OperatorToString(Operator) & " " & Right.SQL(eConnection) & ")" + +End Property + +Private Function OperatorToString(ByVal eOperator As SQLBitwiseOperatorEnum) As String + + Select Case eOperator + Case dboBitwiseAnd + OperatorToString = "&" + Case dboBitwiseOr + OperatorToString = "|" + Case dboBitwiseXor + OperatorToString = "^" + Case Else + RaiseError dboErrorInvalidArgument + End Select + +End Function + diff --git a/SQLComparisonExpression.cls b/SQLComparisonExpression.cls new file mode 100755 index 0000000..dc3a18e --- /dev/null +++ b/SQLComparisonExpression.cls @@ -0,0 +1,41 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "SQLComparisonExpression" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = True +' ___________________________________________________ +' +' © Hi-Integrity Systems 2014. All rights reserved. +' www.hisystems.com.au - Toby Wicks +' ___________________________________________________ +' + +Option Explicit + +Implements ISQLExpression + +Public Left As ISQLExpression +Public Compare As SQLComparisonOperatorEnum +Public Right As ISQLExpression + +Private Sub Class_Initialize() + + Compare = dboComparisonEqualTo + +End Sub + +Private Property Get ISQLExpression_SQL(ByVal eConnectionType As ConnectionTypeEnum) As String + + ISQLExpression_SQL = "(" & Left.SQL(eConnectionType) & " " & SQLConvertCompare(Compare) & " " & Right.SQL(eConnectionType) & ")" + +End Property + + diff --git a/SQLConditions.cls b/SQLConditions.cls index 266a46a..a93b22d 100755 --- a/SQLConditions.cls +++ b/SQLConditions.cls @@ -35,13 +35,40 @@ Public Function Add( _ Set Add.Table = objTable Add.FieldName = strFieldName - Add.compare = eCompare + Add.Compare = eCompare If Not IsMissing(vValue) Then Add.Value = vValue pcolSQLConditions.Add Add End Function +Public Sub AddExpression(ByVal objExpression As ISQLExpression) + + If objExpression Is Nothing Then + RaiseError dboErrorObjectIsNothing + End If + + EnsurePreviousLogicalOperatorExists + pcolSQLConditions.Add objExpression + +End Sub + +Public Sub AddCompareExpression( _ + ByVal objLeft As ISQLExpression, _ + ByVal eCompare As SQLComparisonOperatorEnum, _ + ByVal objRightExpression As ISQLExpression) + + Dim objCompareExpression As SQLComparisonExpression + Set objCompareExpression = New SQLComparisonExpression + + Set objCompareExpression.Left = objLeft + objCompareExpression.Compare = eCompare + Set objCompareExpression.Right = objRightExpression + + AddExpression objCompareExpression + +End Sub + Public Sub AddCondition( _ ByVal objCondition As SQLCondition) @@ -91,7 +118,7 @@ Public Function AddSelect( _ Set AddSelect = New SQLConditionSelect Set AddSelect.SelectSet = objSelect - AddSelect.compare = eCompare + AddSelect.Compare = eCompare If Not IsMissing(vValue) Then AddSelect.Value = vValue pcolSQLConditions.Add AddSelect @@ -112,7 +139,7 @@ Public Function AddFieldCompare( _ With AddFieldCompare Set .Table1 = objTable1 .FieldName1 = strFieldName1 - .compare = eCompare + .Compare = eCompare Set .Table2 = objTable2 .FieldName2 = strFieldName2 End With @@ -163,6 +190,7 @@ Friend Property Get SQL(ByVal eConnectionType As ConnectionTypeEnum) As String Dim objSelectIn As SQLConditionInSelect Dim objSelect As SQLConditionSelect Dim objFields As SQLConditionFieldCompare + Dim objExpression As ISQLExpression With pcolSQLConditions For intIndex = 1 To .Count @@ -184,6 +212,9 @@ Friend Property Get SQL(ByVal eConnectionType As ConnectionTypeEnum) As String ElseIf TypeOf .Item(intIndex) Is SQLConditionInSelect Then Set objSelectIn = .Item(intIndex) strSQL = strSQL & objSelectIn.SQL(eConnectionType) + ElseIf TypeOf .Item(intIndex) Is ISQLExpression Then + Set objExpression = .Item(intIndex) + strSQL = strSQL & objExpression.SQL(eConnectionType) End If Next End With diff --git a/SQLFieldExpression.cls b/SQLFieldExpression.cls new file mode 100755 index 0000000..085a02b --- /dev/null +++ b/SQLFieldExpression.cls @@ -0,0 +1,34 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "SQLFieldExpression" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = True +' ___________________________________________________ +' +' © Hi-Integrity Systems 2014. All rights reserved. +' www.hisystems.com.au - Toby Wicks +' ___________________________________________________ +' + +Option Explicit + +Implements ISQLExpression + +Public Table As SQLSelectTable +Public FieldName As String + +Private Property Get ISQLExpression_SQL(ByVal eConnectionType As ConnectionTypeEnum) As String + + ISQLExpression_SQL = SQLFieldNameAndTablePrefix(Table, FieldName, eConnectionType) + +End Property + + diff --git a/SQLValueExpression.cls b/SQLValueExpression.cls new file mode 100755 index 0000000..69580fe --- /dev/null +++ b/SQLValueExpression.cls @@ -0,0 +1,37 @@ +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True + Persistable = 0 'NotPersistable + DataBindingBehavior = 0 'vbNone + DataSourceBehavior = 0 'vbNone + MTSTransactionMode = 0 'NotAnMTSObject +END +Attribute VB_Name = "SQLValueExpression" +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = False +Attribute VB_Exposed = True +' ___________________________________________________ +' +' © Hi-Integrity Systems 2014. All rights reserved. +' www.hisystems.com.au - Toby Wicks +' ___________________________________________________ +' + +Option Explicit + +Implements ISQLExpression + +Public Value As Variant + +Private Sub Class_Initialize() + + Value = Null + +End Sub + +Private Property Get ISQLExpression_SQL(ByVal eConnectionType As ConnectionTypeEnum) As String + + ISQLExpression_SQL = SQLConvertValue(Value, eConnectionType) + +End Property diff --git a/dbo.vbp b/dbo.vbp index bc23893..9b82a09 100755 --- a/dbo.vbp +++ b/dbo.vbp @@ -52,6 +52,12 @@ Class=SQLCommitTransaction; SQLCommitTransaction.cls Class=SQLBeginTransaction; SQLBeginTransaction.cls Class=SQLRollbackTransaction; SQLRollbackTransaction.cls Class=DatabaseObjectLockController; DatabaseObjectLockController.cls +Class=SQLArithmeticExpression; SQLArithmeticExpression.cls +Class=ISQLExpression; ISQLExpression.cls +Class=SQLBitwiseExpression; SQLBitwiseExpression.cls +Class=SQLFieldExpression; SQLFieldExpression.cls +Class=SQLValueExpression; SQLValueExpression.cls +Class=SQLComparisonExpression; SQLComparisonExpression.cls Startup="(None)" HelpFile="" Title="DatabaseObjectsLibrary"