source: branches/work_304/core/ARSetFieldHelper.cpp @ 366

Revision 366, 5.3 KB checked in by jls17, 6 years ago (diff)
  • setfield actions with sample data in filters are documented like active links now
  • fixed an error in sample data resolving, if the sample data is read from current server (uses @)
Line 
1//Copyright (C) 2012 John Luthgers | jls17
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside is distributed in the hope that it will be useful,
10//    but WITHOUT ANY WARRANTY; without even the implied warranty of
11//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12//    GNU General Public License for more details.
13//
14//    You should have received a copy of the GNU General Public License
15//    along with ARInside.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "ARSetFieldHelper.h"
19
20CARSetFieldHelper::CARSetFieldHelper(CARInside &arInside, const CARSchema& wfConnectedSchema, const ARSetFieldsActionStruct& sFieldStruct, IfElseState ifElseMode, int numAction)
21: arIn(arInside), connectedSchema(wfConnectedSchema), setFieldsStruct(sFieldStruct), ifElse(ifElseMode)
22{
23        nAction = numAction;
24
25        serverFromFieldId = 0;
26        schemaFromFieldId = 0;
27        qualifier = NULL;
28        noMatchValue = 0;
29        multiMatchValue = 0;
30        type = SFT_CURRENT;
31
32        Parse();
33}
34
35CARSetFieldHelper::~CARSetFieldHelper(void)
36{
37}
38
39void CARSetFieldHelper::Parse()
40{
41        for(unsigned int i=0; i < setFieldsStruct.fieldList.numItems; ++i)
42        {
43                if (this->CheckAssignment(setFieldsStruct.fieldList.fieldAssignList[i].assignment))
44                        return;
45        }
46
47        type = SFT_CURRENT;
48        schemaName = this->connectedSchema.GetName();
49}
50
51bool CARSetFieldHelper::CheckAssignment(const ARAssignStruct &assignment)
52{
53        try
54        {
55                switch(assignment.assignType)
56                {
57                case AR_ASSIGN_TYPE_FIELD:
58                        {
59                                if((assignment.u.field->schema[0] == '@' ||  // AR_CURRENT_SCHEMA_TAG
60                                    assignment.u.field->schema[0] == '*') && // AR_CURRENT_SCREEN_TAG / AR_CURRENT_TRAN_TAG
61                                    assignment.u.field->schema[1] == 0)
62                                {
63                                        // if this assignment uses a field from current screen, we are not interested
64                                        return false;
65                                }
66
67                                if ((assignment.u.field->server[0] == '$' && assignment.u.field->server[1] != 0 ||
68                                           assignment.u.field->server[0] == '@' && assignment.u.field->server[1] == 0) &&
69                                           assignment.u.field->schema[0] == '$' && assignment.u.field->schema[1] != 0)
70                                {
71                                        type = SFT_SAMPLEDATA;
72                                       
73                                        this->serverFromFieldId = atoi(&assignment.u.field->server[1]);
74                                        this->schemaFromFieldId = atoi(&assignment.u.field->schema[1]);
75
76                                        this->serverName = setFieldsStruct.sampleServer;
77                                        this->schemaName = setFieldsStruct.sampleSchema;
78                                }
79                                else
80                                {
81                                        type = SFT_SERVER;
82
83                                        this->serverName = assignment.u.field->server;
84                                        this->schemaName = assignment.u.field->schema;
85                                }
86
87                                noMatchValue = assignment.u.field->noMatchOption;
88                                multiMatchValue = assignment.u.field->multiMatchOption;
89
90                                qualifier = &assignment.u.field->qualifier;
91
92                                return true;
93                        }
94                case AR_ASSIGN_TYPE_ARITH:
95                        {                       
96                                switch (assignment.u.arithOp->operation) 
97                                {
98                                case AR_ARITH_OP_ADD:                   
99                                case AR_ARITH_OP_SUBTRACT:                                             
100                                case AR_ARITH_OP_MULTIPLY:                                             
101                                case AR_ARITH_OP_DIVIDE:                                               
102                                case AR_ARITH_OP_MODULO:                                               
103                                        if (CheckAssignment(assignment.u.arithOp->operandLeft)) return true;
104                                        if (CheckAssignment(assignment.u.arithOp->operandRight)) return true;
105                                        break;
106                                case AR_ARITH_OP_NEGATE:                                               
107                                        if (CheckAssignment(assignment.u.arithOp->operandRight)) return true;
108                                        break;
109                                }
110
111                        }
112                        break;
113                case AR_ASSIGN_TYPE_FUNCTION:
114                        {
115                                for(unsigned int i=0; i< assignment.u.function->numItems; ++i)
116                                {
117                                        if (CheckAssignment(assignment.u.function->parameterList[i]))
118                                                return true;
119                                }
120                        }
121                        break;
122                case AR_ASSIGN_TYPE_SQL:
123                        {
124                                type = SFT_SQL;
125
126                                sqlCommand = assignment.u.sql->sqlCommand;
127                                serverName = assignment.u.sql->server;
128
129                                noMatchValue = assignment.u.sql->noMatchOption;
130                                multiMatchValue = assignment.u.sql->multiMatchOption;
131                                return true;
132                        }
133                case AR_ASSIGN_TYPE_FILTER_API:
134                        {
135                                // Note: serviceName can hold a fieldId which is used to read the plugin-name from.
136                                // TODO: add a reference to this field later.
137                                if (strcmp(assignment.u.filterApi->serviceName, "ARSYS.ARF.WEBSERVICE")==0)
138                                {
139                                        type = SFT_WEBSERVICE;
140                                }
141                                // TODO: add support for SFT_ATRIUM_ORCHESTRATOR
142                                else 
143                                {
144                                        type = SFT_FILTERAPI;
145                                }
146                                this->schemaName = assignment.u.filterApi->serviceName;
147                                return true;
148                        }
149                }       
150        }
151        catch(exception& e)
152        {
153                cout << "EXCEPTION in CARSetFieldHelper::CheckAssignment: " << e.what() << endl;
154        }
155        return false;
156}
157
158SetFieldType CARSetFieldHelper::GetType()
159{
160        return type;
161}
162
163const string& CARSetFieldHelper::GetServerName() const
164{
165        return serverName;
166}
167
168const string& CARSetFieldHelper::GetSchemaName() const
169{
170        return schemaName;
171}
172
173int CARSetFieldHelper::GetServerFieldId()
174{
175        return serverFromFieldId;
176}
177
178int CARSetFieldHelper::GetSchemaFieldId()
179{
180        return schemaFromFieldId;
181}
182
183int CARSetFieldHelper::GetNoMatchOption()
184{
185        return noMatchValue;
186}
187
188int CARSetFieldHelper::GetMultiMatchOption()
189{
190        return multiMatchValue;
191}
192
193ARQualifierStruct* CARSetFieldHelper::GetQualifier()
194{
195        return qualifier;
196}
197
198const string& CARSetFieldHelper::GetSqlCommand() const
199{
200        return sqlCommand;
201}
Note: See TracBrowser for help on using the repository browser.