From: Ole John Aske Date: May 5 2011 7:43am Subject: bzr commit into mysql-5.1-telco-7.0 branch (ole.john.aske:4357) List-Archive: http://lists.mysql.com/commits/136715 Message-Id: <20110505074316.9F4AA222@fimafeng09.norway.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4038493310566936218==" --===============4038493310566936218== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///net/fimafeng09/export/home/tmp/oleja/mysql/mysql-5.1-telco-7.0/ based on revid:jonas@stripped 4357 Ole John Aske 2011-05-05 Small refactoring of NdbQueryBuilder's construction of pushed operations (SPJ API) Partly a followup to: mysql.com/commits/135407 To simplify error handling code when building NdbQueryOperationDef's, the allocated operation is added to NdbQueryBuilders'Vector m_operations' earlier. In case of a failure during query build, the operation will then be released together with all other resources allocated so far through this NdbQueryBuilder. This removed the need for manually delete the allocated operation in case of failures. modified: storage/ndb/src/ndbapi/NdbQueryBuilder.cpp storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp === modified file 'storage/ndb/src/ndbapi/NdbQueryBuilder.cpp' --- a/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp 2011-05-04 11:45:33 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryBuilder.cpp 2011-05-05 07:43:12 +0000 @@ -857,13 +857,9 @@ NdbQueryBuilder::readTuple(const NdbDict ident, m_impl.m_operations.size(), error); - returnErrIf(op==0, Err_MemoryAlloc); - if (unlikely(error != 0)) - { - m_impl.setErrorCode(error); - delete op; - return NULL; - } + + returnErrIf(m_impl.takeOwnership(op)!=0, Err_MemoryAlloc); + returnErrIf(error!=0, error); // C'tor returned error, bailout Uint32 keyindex = 0; for (i=0; im_keyInfoPos); int error = op->m_keys[col->m_keyInfoPos]->bindOperand(*col,*op); - if (unlikely(error)) - { m_impl.setErrorCode(error); - delete op; - return NULL; - } + returnErrIf(error!=0, error); keyindex++; if (keyindex >= static_cast(keyfields)) @@ -885,17 +877,7 @@ NdbQueryBuilder::readTuple(const NdbDict } } - if (likely(m_impl.m_operations.push_back(op) == 0)) - { - return &op->m_interface; - } - else - { - assert(errno == ENOMEM); - delete op; - m_impl.setErrorCode(Err_MemoryAlloc); - return NULL; - } + return &op->m_interface; } @@ -944,13 +926,9 @@ NdbQueryBuilder::readTuple(const NdbDict ident, m_impl.m_operations.size(), error); - returnErrIf(op==0, Err_MemoryAlloc); - if (unlikely(error != 0)) - { - m_impl.setErrorCode(error); - delete op; - return NULL; - } + + returnErrIf(m_impl.takeOwnership(op)!=0, Err_MemoryAlloc); + returnErrIf(error!=0, error); // C'tor returned error, bailout // Bind to Column and check type compatibility for (i=0; igetImpl().bindOperand(col,*op); - if (unlikely(error)) - { m_impl.setErrorCode(error); - delete op; - return NULL; - } + returnErrIf(error!=0, error); } - if (likely(m_impl.m_operations.push_back(op) == 0)) - { - return &op->m_interface; - } - else - { - assert(errno == ENOMEM); - delete op; - m_impl.setErrorCode(Err_MemoryAlloc); - return NULL; - } + return &op->m_interface; } @@ -996,21 +960,9 @@ NdbQueryBuilder::scanTable(const NdbDict ident, m_impl.m_operations.size(), error); - returnErrIf(op==0, Err_MemoryAlloc); - if (unlikely(error != 0)) - { - m_impl.setErrorCode(error); - delete op; - return NULL; - } - if (unlikely(m_impl.m_operations.push_back(op) != 0)) - { - assert(errno == ENOMEM); - delete op; - m_impl.setErrorCode(Err_MemoryAlloc); - return NULL; - } + returnErrIf(m_impl.takeOwnership(op)!=0, Err_MemoryAlloc); + returnErrIf(error!=0, error); // C'tor returned error, bailout error = op->markScanAncestors(); returnErrIf(error!=0, error); @@ -1053,20 +1005,13 @@ NdbQueryBuilder::scanIndex(const NdbDict ident, m_impl.m_operations.size(), error); - returnErrIf(op==0, Err_MemoryAlloc); - if (unlikely(error != 0)) - { - m_impl.setErrorCode(error); - delete op; - return NULL; - } - if (unlikely(op->m_bound.lowKeys > indexImpl.getNoOfColumns() || - op->m_bound.highKeys > indexImpl.getNoOfColumns())) - { m_impl.setErrorCode(QRY_TOO_MANY_KEY_VALUES); - delete op; - return NULL; - } + returnErrIf(m_impl.takeOwnership(op)!=0, Err_MemoryAlloc); + returnErrIf(error!=0, error); // C'tor returned error, bailout + + returnErrIf(op->m_bound.lowKeys > indexImpl.getNoOfColumns() || + op->m_bound.highKeys > indexImpl.getNoOfColumns(), + QRY_TOO_MANY_KEY_VALUES); // Bind lowKeys, and if applicable, highKeys to the column being refered Uint32 i; @@ -1078,11 +1023,7 @@ NdbQueryBuilder::scanIndex(const NdbDict ? op->m_bound.low[i]->bindOperand(col,*op) || op->m_bound.high[i]->bindOperand(col,*op) : op->m_bound.low[i]->bindOperand(col,*op); - if (unlikely(error)) - { m_impl.setErrorCode(error); - delete op; - return NULL; - } + returnErrIf(error!=0, error); } // Bind any remaining highKeys past '#lowKeys' @@ -1090,31 +1031,13 @@ NdbQueryBuilder::scanIndex(const NdbDict { const NdbColumnImpl& col = NdbColumnImpl::getImpl(*indexImpl.getColumn(i)); error = op->m_bound.high[i]->bindOperand(col,*op); - if (unlikely(error)) - { m_impl.setErrorCode(error); - delete op; - return NULL; - } + returnErrIf(error!=0, error); } error = op->markScanAncestors(); - if (unlikely(error)) - { m_impl.setErrorCode(error); - delete op; - return NULL; - } + returnErrIf(error!=0, error); - if (likely(m_impl.m_operations.push_back(op) == 0)) - { - return &op->m_interface; - } - else - { - assert(errno == ENOMEM); - delete op; - m_impl.setErrorCode(Err_MemoryAlloc); - return NULL; - } + return &op->m_interface; } const NdbQueryDef* @@ -1220,27 +1143,43 @@ NdbQueryBuilderImpl::prepare() return def; } - -NdbQueryOperand* -NdbQueryBuilderImpl::addOperand(NdbQueryOperandImpl* operand) +inline int +NdbQueryBuilderImpl::takeOwnership(NdbQueryOperandImpl* operand) { if (unlikely(operand == NULL)) { - setErrorCode(Err_MemoryAlloc); - return NULL; + return Err_MemoryAlloc; } + else if (unlikely(m_operands.push_back(operand) != 0)) + { + assert(errno == ENOMEM); + delete operand; + return Err_MemoryAlloc; + } + return 0; +} - if (likely(m_operands.push_back(operand) == 0)) +inline int +NdbQueryBuilderImpl::takeOwnership(NdbQueryOperationDefImpl* operation) +{ + if (unlikely(operation == NULL)) { - return &operand->getInterface(); + return Err_MemoryAlloc; } - else + else if (unlikely(m_operations.push_back(operation) != 0)) { assert(errno == ENOMEM); - delete operand; - setErrorCode(Err_MemoryAlloc); - return NULL; + delete operation; + return Err_MemoryAlloc; } + return 0; +} + +NdbQueryOperand* +NdbQueryBuilderImpl::addOperand(NdbQueryOperandImpl* operand) +{ + returnErrIf(takeOwnership(operand)!=0, Err_MemoryAlloc); + return &operand->getInterface(); } /////////////////////////////////// === modified file 'storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp' --- a/storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp 2011-05-04 11:45:33 +0000 +++ b/storage/ndb/src/ndbapi/NdbQueryBuilderImpl.hpp 2011-05-05 07:43:12 +0000 @@ -663,6 +663,17 @@ private: */ NdbQueryOperand* addOperand(NdbQueryOperandImpl* operand); + /** + * Take ownership of specified object: From now on it is the + * responsibility of this NdbQueryBuilderImpl to manage the + * lifetime of the object. If takeOwnership() fails, the + * specified object is deleted before it returns. + * @param[in] operand to take ownership for (may be NULL). + * @return 0 if ok, else there has been an 'Err_MemoryAlloc' + */ + int takeOwnership(NdbQueryOperandImpl*); + int takeOwnership(NdbQueryOperationDefImpl*); + bool contains(const NdbQueryOperationDefImpl*); NdbQueryBuilder m_interface; --===============4038493310566936218== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/ole.john.aske@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: ole.john.aske@stripped\ # sr143qdhqjyc26fp # target_branch: file:///net/fimafeng09/export/home/tmp/oleja/mysql\ # /mysql-5.1-telco-7.0/ # testament_sha1: 185a66be0c07bfc73e19b2d534b6458d6010f9ac # timestamp: 2011-05-05 09:43:16 +0200 # base_revision_id: jonas@stripped # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWdbmZWoAA+XfgFAQcff//38/ /yq////+YAjfO9t73A9V1UGy7dHR0BoCgubUJUIak/U9TU8RHomaBHqBpkDEYEGQGj1DTBKIAjEm 1Mo0QGg0AAAAAAAA1TCn6SNAA0AGgAAAAAAAASJEaU8hDT1PVPKPUek9TIeoDQGjRoBk0Gg0HDTT BDIaaZGTCAaaAMJo0yYAEDQSRBAEyCYCaaNBMptITE/Uym9KfpQxNqNG2pAFs05z9sYbG54zR6tZ ByI7n6fqV699Vn0KRhiQavXIa/Qy6qLCs3WRTRHcM3OybcEAiuGMWsHahGLCywckFMzSQhiCSV5p 0KXSpySkmY2GU6DsIAWfxQcHMAlRCGk+hpJVn4RK7o5QoBaGo5TuDENtgVd4y/VIwzZ8tN7GjRqZ oBVpcp1OO8SFbkmeiKZCCYcEkwQYJXS4I7YjBcjhloRXkFmUL6ZQEINLBAFZoo8Xk4FflR39f9Ij MaAr27GNSbmrDYRcqBEOL541kOcy/pkq0NI1wXB4eHOES5SefZHKLmapO+onwqgo69UDzGdn/dy+ 4ptlqlTmQDhmpWWydcGkSCyrUPTOFkdcbJybFp5ZXhrYTIdBy7eXGssNrls+cIMIsDuyu1uH4hRE xcJ6CaB2DaPEIQ4Qd4RDMHX+WHMzfePWGY+JFt/55lFj0I6EQB7w1DDHc74WImGV0HMZO88QxO87 ULnJHiXddVKKlp3dW/qAoOrNjnphcdWGeu5I4k0wDNQq4FrRSHgQDXrDWiLGnOV5bSpK9pPegGwL 2doSedS/oZRBC/Rg4EYI5lRAdkKAFgPa8AIe4PEeKGVp0QLKgyDT04i09loVNJtTY3KrvS8TVBqg NiTXWNGqRcDMhNeTclO0CBVRfPNmjWp/HfllnDv6AJmBvxyYONVi2PRuXIFCpqVNeDcFE1hw6Xa2 gHddJAHUeVRIG0BjbKBndGmBtsV/UFhY0DCqNA4VE6aAFiUsRN0NS8JBDXaKKTkBFRuMKuRJzUKP TFsSKKebPTcBQkXBQnGxnNGUbWq7IYa6zcs5mI0TTeLGGUdjGiyDYxBBltSNczbq+Bi5g2BRwcRB 97GpFiWC83m7lVx1M72ZSC7zouZvjFYbMtMg0Sg61S4EzB9mFKRz1yo2LeGRjiBjjuKpeO+XL4Jt aJZtr1mtXGZg3N8Q2YOU1XJU1LTytQy7INY+T7UtJH7+QMRKWZEcMTBmg29TKCtKQNEeTFODpOxt ZaOlIy7eJ0rCFNqqQOt1KxFM5ZHbRmY22cszi1hWOG/7lo+B1hosxZNYWjKYlQG/kOd3T0i7lYkS Pn4P3iGxJJmZvlECIdRgEqCJ8/9SSXvmI53mAN20b6SSnmrj98fm9KyLm3Cv7jEQWKbNDTGK7xKT 23TUTN6i5IIkED+V87hCPuKBlGKcb0KHZFTM5cP3z7xDm0kZyeoglBL2jrrnINBlPsIi8frPxVZi cfGf5fEoeiptRBtpYYJIvnJEmE0z56iHnpoqf6WBOMoiM7PWW2YAYd9NiwI+aR8ywimtEm87jT78 wxsNhI2AHE0A5sP7KBoGNOBb4KoqDso8AbtQiYsIgeQbjFoBjrsMnjdYGo8y5ZCK3GmoOjWVZvbT qbRYoaRoXux6Ulx5ZSViybKjYdzEm8UK15xmzrlM4YaNwaKgcqDaQ52oQxv8BJwKTBzZv6TSZ0TZ KZ6gdKhCga2qnkun0peBxgNrKh4kDo7YNSejyu0VgLHyuZqeRvKF4F5ckR1q94CLSpLUYbY8KhsR maUwoQ1R1qdNOpzk4l5W8VZJW1gosTx1dKKglvyowqyB0LaHxERnnHWdMDlBoYOFbheApQDGJ5Fz IGQnxBRKPBINVtrHE6Fzg3GIILC9HxKKQ60zH5saHSW7byN/YsZfgUo8cAfUFBRXlV4pnmdxSe4N rqTH1+ADYlUw6w9FkQdnsNXClbufQ3EdhYEQMkH9GVcATnlYCjxAj/QNIg5EDTu7yx9PN+CG3nZV mQ96zj92koIBqEnFu07UrFkLwwvPXKk5aaMXpIEQpXs47pWpWjMMDMswlSM3ghm1rMdB5VoSLl5Q OwZ03TAaQxGcPQXo4TgP0NwZFx5DIvYYGS6QuRJwgNaJd7GRIwSHCKN+mjqFwnnTb/kIgq+p70KY a3e5PMgXrhGQaSaSvGq7TpBk2LfJzMoWK6g3ucCsxL0ic17hUDJgYZ/orbQm0mKuThUqpSAkkMBJ JQedA67CCVhJDriHv+DNEIjFQVVdgKKO+sHJk5mJBz7RpBgsHTpmCx17F18Tm6m9rcG+BguhCjhB KX/PekfcR5zYbEw/uw/YstQGZVMJWLyddcp9Qa30p7AyI1SibIZIqxN7gQJD4EhpSbVsLeEUcKPt NusJ7noGrMTptIKAiwIDIgU1FN2lxggRTEppe0YBgYOgkIPaTr7tKvs+ou/qBMClEMwXK7rcHd0D MhMiQDJ9CScGEOIIyiApFg8qNbUJScWZjzE30d0lkodVI2MV1VunElcNs9aM8kkY/5QKsBHwGssr g6Ewg8ud9dSr5pKq5mmcV6ItsTzVUJjfkMKi84ZK8ljBXYbKDzwYohYyUhl1SY0bdCwGA2YtkHEW WBg/m2GmQrfaDRj5o88IVMFVecHHpFISYpa+ATDeydBqpcKYZI3kVkZIi6mjUD3pNYD1zgD1JJOM J8XOJMMe/9ExgxvXtkzdDiySmXXpJalMOkGyLFGpfYfeSNKY+oQ0yhYEyCLg18zye+AOJLxgb4Mk UPCizqqWQNZ/ogYf8XckU4UJDW5mVqA= --===============4038493310566936218==--