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 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
|
// **********************************************************************
//
// Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
#include <DeptI.h>
#include <Util.h>
#include <sqlca.h>
EXEC SQL WHENEVER SQLERROR DO handleSqlError(sqlca, ctx);
EXEC SQL WHENEVER NOT FOUND DO handleNotFound(current, ctx);
using namespace std;
DeptI::DeptI(const CurrentSqlContext& currentCtx, const string& empCategory) :
_currentCtx(currentCtx),
_empCategory(empCategory)
{
}
void
DeptI::ice_ping(const Ice::Current& current) const
{
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
sql_context ctx = _currentCtx;
int deptno = decodeName(current.id.name);
int count = 0;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL SELECT COUNT(*) INTO :count FROM DEPT WHERE DEPTNO = :deptno;
EXEC SQL COMMIT;
if(count == 0)
{
throw Ice::ObjectNotExistException(__FILE__, __LINE__);
}
}
HR::EmpPrx
DeptI::createEmp(int key, const HR::EmpDesc& desc, const Ice::Current& current)
{
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
sql_context ctx = _currentCtx;
int deptno = decodeName(current.id.name);
int empno = key;
const char* ename = desc.ename.c_str();
const char* job = desc.job.c_str();
int mgr = 0;
short mgrInd = 0;
const char* hiredate = desc.hiredate.c_str();
const char* sal = desc.sal.c_str();
const char* comm = desc.comm.c_str();
//
// We ignore desc.dept
//
EXEC SQL END DECLARE SECTION;
if(desc.mgr == 0)
{
//
// mgr is NULL
//
mgrInd = -1;
}
else
{
mgr = decodeName(desc.mgr->ice_getIdentity().name);
}
EXEC SQL CONTEXT USE :ctx;
EXEC SQL INSERT INTO EMP(empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES(:empno, :ename, :job, :mgr:mgrInd, :hiredate, :sal, :comm, :deptno);
EXEC SQL COMMIT;
Ice::Identity empId;
empId.name = encodeName(empno);
empId.category = _empCategory;
return HR::EmpPrx::uncheckedCast(current.adapter->createProxy(empId));
}
HR::DeptDesc
DeptI::getDesc(const Ice::Current& current)
{
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
int deptno = decodeName(current.id.name);
sql_context ctx = _currentCtx;
char dname[15];
char loc[14];
short dnameInd;
short locInd;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL SELECT DNAME, LOC INTO :dname:dnameInd, :loc:locInd FROM DEPT WHERE DEPTNO = :deptno;
EXEC SQL COMMIT;
HR::DeptDesc result;
result.deptno = deptno;
if(dnameInd >= 0)
{
//
// Should log a warning if > 0!
//
result.dname = dname;
}
//
// else null
//
if(locInd >= 0)
{
//
// Should log a warning if > 0!
//
result.loc = loc;
}
//
// else null
//
return result;
}
void
DeptI::updateField(const string& field, const string& newValue, const Ice::Current& current)
{
const string updateDeptStr =
"UPDATE DEPT SET " + field + " = '" + newValue + "' WHERE DEPTNO = " + current.id.name;
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
const char* updateDept = updateDeptStr.c_str();
sql_context ctx = _currentCtx;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL EXECUTE IMMEDIATE :updateDept;
EXEC SQL COMMIT;
}
void
DeptI::remove(const Ice::Current& current)
{
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
int deptno = decodeName(current.id.name);
sql_context ctx = _currentCtx;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL DELETE FROM DEPT WHERE DEPTNO = :deptno;
EXEC SQL COMMIT;
}
//
// Cursor-based functions
//
EXEC SQL WHENEVER NOT FOUND DO break;
HR::EmpPrxSeq
DeptI::findAll(const Ice::Current& current)
{
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
int deptno = decodeName(current.id.name);
sql_context ctx = _currentCtx;
int empno;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL DECLARE empCursor1 CURSOR FOR SELECT EMPNO FROM EMP WHERE DEPTNO = :deptno;
EXEC SQL OPEN empCursor1;
HR::EmpPrxSeq result;
for(;;)
{
EXEC SQL FETCH empCursor1 INTO :empno;
Ice::Identity empId;
empId.category = _empCategory;
empId.name = encodeName(empno);
result.push_back(HR::EmpPrx::uncheckedCast(current.adapter->createProxy(empId)));
}
EXEC SQL CLOSE empCursor1;
EXEC SQL COMMIT;
return result;
}
HR::EmpPrxSeq
DeptI::findByName(const string& name, const Ice::Current& current)
{
sqlca sqlca;
EXEC SQL BEGIN DECLARE SECTION;
int deptno = decodeName(current.id.name);
const char* ename = name.c_str();
sql_context ctx = _currentCtx;
int empno;
EXEC SQL END DECLARE SECTION;
EXEC SQL CONTEXT USE :ctx;
EXEC SQL DECLARE empCursor2 CURSOR FOR SELECT EMPNO FROM EMP WHERE DEPTNO = :deptno AND ENAME = :ename;
EXEC SQL OPEN empCursor2;
HR::EmpPrxSeq result;
for(;;)
{
EXEC SQL FETCH empCursor2 INTO :empno;
Ice::Identity empId;
empId.category = _empCategory;
empId.name = encodeName(empno);
result.push_back(HR::EmpPrx::uncheckedCast(current.adapter->createProxy(empId)));
}
EXEC SQL CLOSE empCursor2;
EXEC SQL COMMIT;
return result;
}
|