From 722a16762052131db15f04560eb95f3420ddea7f Mon Sep 17 00:00:00 2001 From: prabatuty Date: Wed, 16 Mar 2011 17:17:15 +0000 Subject: [PATCH] code reorg for Transactionw! --- include/Transaction.h | 5 ++ src/storage/Transaction.cxx | 187 ++++++++++++++++++++++++++------------------ 2 files changed, 117 insertions(+), 75 deletions(-) diff --git a/include/Transaction.h b/include/Transaction.h index ef1db3ad..a9b06597 100644 --- a/include/Transaction.h +++ b/include/Transaction.h @@ -119,6 +119,11 @@ class DllExport Transaction DbRetVal applyUndoLogs(Database *sysdb); int noOfUndoLogs(); void printDebugInfo(Database *sysdb); + + private: + DbRetVal handleVarcharUndoInsert(Database *sysdb, char *data); + DbRetVal handleVarcharUndoDelete(Database *sysdb, char *data); + DbRetVal handleVarcharUndoUpdate(Database *sysdb, char *data,void *ptrToTuple); }; class DllExport TransactionManager diff --git a/src/storage/Transaction.cxx b/src/storage/Transaction.cxx index 3d7da8d3..cb350c1e 100644 --- a/src/storage/Transaction.cxx +++ b/src/storage/Transaction.cxx @@ -310,106 +310,41 @@ DbRetVal Transaction::applyUndoLogs(Database *sysdb) { case InsertOperation: { - // logInfo->data_ will have following info encapsulated. - // tupleptr + metadataPtr + nVarchars + varchar chunk ptr + - // ptrs to varchars char *ptr = (char *)logInfo->data_; - void *ptrToTuple = (void *)*(long *)ptr; ptr += sizeof(void *); + void *ptrToTuple = (void *)*(long *)ptr; + ptr += sizeof(void *); InUse *isUsed = ((InUse*)(ptrToTuple) - 1); if (*isUsed == 0) { printError(ErrSysFatal, "Fatal: Row is already not in use"); } *isUsed = 0; - - Database db; - void *metaData = (void *)*(long *)ptr; ptr += sizeof(void *); - db.setMetaDataPtr((DatabaseMetaData *) metaData); - db.setProcSlot(sysdb->procSlot); - - int noOfVarchar = *(int *)ptr; ptr += sizeof(int); - Chunk *vcchunk = (Chunk *) *(long *)ptr; ptr += sizeof(void *); - void **ptrToVarchars = (void **) ptr; - for (int i = 0; i < noOfVarchar; i++) { - if (*(long *) ptrToVarchars[i] != 0L) { - vcchunk->free(&db, (void *)*(long *)ptrToVarchars[i]); - *(long *) ptrToVarchars[i] = 0L; - } - } + handleVarcharUndoInsert(sysdb, ptr); break; } case DeleteOperation: { - // logInfo->data_ will have following info encapsulated. - // tupleptr + tuple length + actual tuple + metadataPtr + - // nVarchars + varchar chunk ptr + ptrs to varchars + - // size and value pairs for varchars char *ptr = (char *)logInfo->data_; - void *ptrToTuple = (void *)*(long *)ptr; ptr += sizeof(void *); + void *ptrToTuple = (void *)*(long *)ptr; + ptr += sizeof(void *); InUse *isUsed = ((InUse*)(ptrToTuple) - 1); if (*isUsed == 1) { printError(ErrSysFatal, "Fatal: Row is already in use"); } *isUsed = 1; //data record will be intact as we have lock on that record - - void *metaData = (void *)*(long *)ptr; ptr += sizeof(void *); - Database db; - db.setMetaDataPtr((DatabaseMetaData *) metaData); - db.setProcSlot(sysdb->procSlot); - DbRetVal rv = OK; - int noOfVarchar = *(int *) ptr; ptr+= sizeof(int); - Chunk *vcchunk = (Chunk *) *(long *)ptr; ptr += sizeof(void *); - void **ptrToVarchars = (void **) ptr; - ptr += noOfVarchar * sizeof (void *); - char *lenValPtr = (char *) ptr; - for (int i = 0; i < noOfVarchar; i++) { - int len = *(int *) lenValPtr; lenValPtr += sizeof(int); - if (len != 0) { - void *ptr = vcchunk->allocate(&db, len, &rv); - strcpy((char *)ptr, lenValPtr); lenValPtr += len; - *(long *) ptrToVarchars[i] = (long)ptr; - } else *(long *) ptrToVarchars[i] = 0L; - } + handleVarcharUndoDelete(sysdb, ptr); break; } case UpdateOperation: { - // logInfo->data_ will have following info encapsulated. - // tupleptr + tuple length + actual tuple + metadataPtr + - // nVarchars + varchar chunk ptr + ptrs to varchars + - // size and value pairs for varchars char *ptr = (char *)logInfo->data_; - void *ptrToTuple = (void *)*(long *)ptr; ptr += sizeof(void *); InUse *isUsed = ((InUse*)(ptrToTuple) - 1); + void *ptrToTuple = (void *)*(long *)ptr; + ptr += sizeof(void *); + InUse *isUsed = ((InUse*)(ptrToTuple) - 1); if (*isUsed == 0) { printError(ErrSysFatal, "Fatal: Row is not in use during update rollback"); } - int tupleLen = *(int *) ptr; ptr += sizeof(int); - void *tuple = ptr; ptr += tupleLen; - void *metaData = (void *)*(long *)ptr; ptr += sizeof(void *); - Database db; - db.setMetaDataPtr((DatabaseMetaData *) metaData); - db.setProcSlot(sysdb->procSlot); - DbRetVal rv = OK; - int noOfVarchar = *(int *) ptr; ptr+= sizeof(int); - Chunk *vcchunk = (Chunk *) *(long *)ptr; ptr += sizeof(void *); - void **ptrToVarchars = (void **) ptr; - ptr += noOfVarchar * sizeof (void *); - char *lenValPtr = (char *) ptr; - for (int i = 0; i < noOfVarchar; i++) { - if (*(long *) ptrToVarchars[i] != 0L) { - vcchunk->free(&db, (void *)*(long *) ptrToVarchars[i]); - *(long *) ptrToVarchars[i] = 0L; - } - } - os::memcpy(ptrToTuple, tuple, tupleLen); - for (int i = 0; i < noOfVarchar; i++) { - int len = *(int *) lenValPtr; lenValPtr += sizeof(int); - if (len != 0) { - void *ptr = vcchunk->allocate(&db, len, &rv); - strcpy((char *)ptr, lenValPtr); lenValPtr += len; - *(long *) ptrToVarchars[i] = (long) ptr; - } else *(long *) ptrToVarchars[i] = 0L; - } + handleVarcharUndoUpdate(sysdb, ptr, ptrToTuple); break; } case InsertHashIndexOperation: @@ -446,3 +381,105 @@ DbRetVal Transaction::applyUndoLogs(Database *sysdb) } return OK; } +DbRetVal Transaction::handleVarcharUndoInsert(Database *sysdb, char *ptr) +{ + // ptr will have following info encapsulated. + // metadataPtr + nVarchars + varchar chunk ptr + + // ptrs to varchars + + Database db; + void *metaData = (void *)*(long *)ptr; + ptr += sizeof(void *); + db.setMetaDataPtr((DatabaseMetaData *) metaData); + db.setProcSlot(sysdb->procSlot); + + int noOfVarchar = *(int *)ptr; + ptr += sizeof(int); + Chunk *vcchunk = (Chunk *) *(long *)ptr; + ptr += sizeof(void *); + void **ptrToVarchars = (void **) ptr; + for (int i = 0; i < noOfVarchar; i++) { + if (*(long *) ptrToVarchars[i] != 0L) { + vcchunk->free(&db, (void *)*(long *)ptrToVarchars[i]); + *(long *) ptrToVarchars[i] = 0L; + } + } + return OK; +} + +DbRetVal Transaction::handleVarcharUndoDelete(Database *sysdb, char *ptr) +{ + // ptr will have following info encapsulated. + // metadataPtr + nVarchars + varchar chunk ptr + ptrs to varchars + + // size and value pairs for varchars + void *metaData = (void *)*(long *)ptr; + ptr += sizeof(void *); + Database db; + db.setMetaDataPtr((DatabaseMetaData *) metaData); + db.setProcSlot(sysdb->procSlot); + DbRetVal rv = OK; + int noOfVarchar = *(int *) ptr; + ptr+= sizeof(int); + Chunk *vcchunk = (Chunk *) *(long *)ptr; + ptr += sizeof(void *); + void **ptrToVarchars = (void **) ptr; + ptr += noOfVarchar * sizeof (void *); + char *lenValPtr = (char *) ptr; + for (int i = 0; i < noOfVarchar; i++) { + int len = *(int *) lenValPtr; + lenValPtr += sizeof(int); + if (len != 0) { + void *ptr = vcchunk->allocate(&db, len, &rv); + strcpy((char *)ptr, lenValPtr); + lenValPtr += len; + *(long *) ptrToVarchars[i] = (long)ptr; + } else { + *(long *) ptrToVarchars[i] = 0L; + } + } + return rv; +} +DbRetVal Transaction::handleVarcharUndoUpdate(Database *sysdb, char *ptr, void *ptrToTuple) +{ + // logInfo->data_ will have following info encapsulated. + // tupleptr + tuple length + actual tuple + metadataPtr + + // nVarchars + varchar chunk ptr + ptrs to varchars + + // size and value pairs for varchars + + int tupleLen = *(int *) ptr; + ptr += sizeof(int); + void *tuple = ptr; + ptr += tupleLen; + void *metaData = (void *)*(long *)ptr; + ptr += sizeof(void *); + Database db; + db.setMetaDataPtr((DatabaseMetaData *) metaData); + db.setProcSlot(sysdb->procSlot); + DbRetVal rv = OK; + int noOfVarchar = *(int *) ptr; + ptr+= sizeof(int); + Chunk *vcchunk = (Chunk *) *(long *)ptr; + ptr += sizeof(void *); + void **ptrToVarchars = (void **) ptr; + ptr += noOfVarchar * sizeof (void *); + char *lenValPtr = (char *) ptr; + for (int i = 0; i < noOfVarchar; i++) { + if (*(long *) ptrToVarchars[i] != 0L) { + vcchunk->free(&db, (void *)*(long *) ptrToVarchars[i]); + *(long *) ptrToVarchars[i] = 0L; + } + } + os::memcpy(ptrToTuple, tuple, tupleLen); + for (int i = 0; i < noOfVarchar; i++) { + int len = *(int *) lenValPtr; lenValPtr += sizeof(int); + if (len != 0) { + void *ptr = vcchunk->allocate(&db, len, &rv); + strcpy((char *)ptr, lenValPtr); + lenValPtr += len; + *(long *) ptrToVarchars[i] = (long) ptr; + } else { + *(long *) ptrToVarchars[i] = 0L; + } + } + return rv; +} -- 2.11.4.GIT