/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #include "apache/das/rdb/RelationshipStatement.h" #include "apache/das/rdb/Relationship.h" namespace apache { namespace das { namespace rdb { RelationshipStatement::RelationshipStatement(const Relationship& relationship, const KeyDataList* keyDataList) { this->relationship = &relationship; this->keyDataList = keyDataList; executed = false; } void RelationshipStatement::setDASDataObject(DASDataObject& dataObject) { this->dataObject = &dataObject; } RelationshipStatement::~RelationshipStatement(void) {} bool RelationshipStatement::isUnset(void) const { return keyDataList == 0; } DASDataObject& RelationshipStatement::getDASDataObject(void) const { return *dataObject; } void RelationshipStatement::setFKList(const KeyDataList* keyDataList) { this->keyDataList = keyDataList; } void RelationshipStatement::execute(StatementPtr statement) { if (!executed) { const std::map& keyPairs = relationship->getKeyPairs(); std::string stmt; stmt.append("update ").append(relationship->getFKTableName()).append(" set"); unsigned int i = 1; for (std::map::const_iterator it = keyPairs.begin() ; it != keyPairs.end() ; it++) { stmt.append(" ").append(it->second->getFKColumnName()).append("="); if (keyDataList == 0) { stmt.append(SQL_NULL_VALUE); } else { KeyDataList::const_iterator pkIt = keyDataList->find(it->second->getPKColumnName()); if (pkIt == keyDataList->end()) { //throw exception } stmt.append(pkIt->second->toSQL()); } if (i != keyPairs.size()) { stmt.append(","); } i++; } const Column* occCol = 0; if (!dataObject->isOCCChecked()) { occCol = dataObject->getTable().getOCCColumn(); if (occCol != 0 && occCol->isManaged()) { stmt.append(occCol->getName()).append("=").append(StringWrapper::toString(dataObject->getNewOCC() + 1)); } } stmt.append(" ").append(dataObject->getWhereStmt()).append(";"); bool noData = false; ResultSetPtr rs; try { rs = statement->executeQuery(stmt); } catch (SQLException& ex) { if (ex.getODBCReturnCode() == SQL_NO_DATA) { noData = true; } else { throw; } } if (!dataObject->isOCCChecked()) { if (occCol != 0 && (noData || rs->getRowCount() == 0)) { throw DASOptimisticConcurrencyControlException(); } else { dataObject->setOCCChecked(true); } } executed = true; } } }; }; };