const string& QueueItem::getTempTarget() { if(!isSet(QueueItem::FLAG_USER_LIST) && tempTarget.empty()) { if(!SETTING(TEMP_DOWNLOAD_DIRECTORY).empty() && (File::getSize(getTarget()) == -1)) { #ifdef _WIN32 dcpp::StringMap sm; if(target.length() >= 3 && target[1] == ':' && target[2] == '\\') sm["targetdrive"] = target.substr(0, 3); else sm["targetdrive"] = Util::getConfigPath().substr(0, 3); setTempTarget(Util::formatParams(SETTING(TEMP_DOWNLOAD_DIRECTORY), sm, false) + getTempName(getTargetFileName(), getTTH())); #else //_WIN32 setTempTarget(SETTING(TEMP_DOWNLOAD_DIRECTORY) + getTempName(getTargetFileName(), getTTH())); #endif //_WIN32 } } return tempTarget; }
/* External sort for compress. */ bool pageManage::externalSort() { FILE* ofile = fopen(PATH_OF_O_ORDERKEY, "rb"), *cfile = fopen(PATH_OF_O_CUSTKEY, "rb"); if (!ofile || !cfile) return false; /* Traversing the file and load 128 pages to quick sort. */ int oDataP[MAX_ITEM*MAX_PAGE], cDataP[MAX_ITEM*MAX_PAGE]; tuple tDataP[MAX_ITEM*MAX_PAGE]; int tmpFileId = 0; while (!feof(ofile)) { FILE* tmpFile = fopen(getTempName(tmpFileId++), "wb"); if (!tmpFile) return false; int num = fread(oDataP, sizeof(int), MAX_ITEM*MAX_PAGE, ofile); fread(cDataP, sizeof(int), MAX_ITEM*MAX_PAGE, cfile); quickSort(cDataP, oDataP, num); for (int i = 0; i < num; ++i) { tDataP[i].orderkey = oDataP[i]; tDataP[i].custkey = cDataP[i]; } fwrite(tDataP, sizeof(tuple), num, tmpFile); fclose(tmpFile); } fclose(ofile); fclose(cfile); /* Merge sort. */ FILE** tmpFiles = new FILE*[tmpFileId], *ofileAfterSort = fopen(PATH_OF_ORDERKEY_AFTER_SORT, "wb"), *cfileAfterSort = fopen(PATH_OF_CUSTKEY_AFTER_SORT, "wb"); if (!ofileAfterSort || !cfileAfterSort) return false; for (int i = 0; i < tmpFileId; ++i) { tmpFiles[i] = fopen(getTempName(i), "rb"); if (!tmpFiles[i]) return false; } int numOfEOF = 0; int* len = new int[tmpFileId]; int* cur = new int[tmpFileId]; tuple** head = new tuple*[tmpFileId]; int okeyAfterSort[MAX_ITEM], ckeyAfterSort[MAX_ITEM], count = 0; for (int i = 0; i < tmpFileId; ++i) { head[i] = new tuple[MAX_ITEM]; len[i] = fread(head[i], sizeof(tuple), MAX_ITEM, tmpFiles[i]); cur[i] = 0; } while (numOfEOF != tmpFileId) { tuple minMax(0, MINMAX); int min_index = 0; for (int i = 0; i < tmpFileId; ++i) { if (feof(tmpFiles[i]) && len[i] == cur[i]) continue; if (head[i][cur[i]].custkey < minMax.custkey) { minMax = head[i][cur[i]]; min_index = i; } } if (count == MAX_ITEM) { fwrite(okeyAfterSort, sizeof(int), count, ofileAfterSort); fwrite(ckeyAfterSort, sizeof(int), count, cfileAfterSort); count = 0; } okeyAfterSort[count] = minMax.orderkey; ckeyAfterSort[count] = minMax.custkey; ++count; ++cur[min_index]; if (cur[min_index] == len[min_index] && len[min_index] != 0) { len[min_index] = fread(head[min_index], sizeof(tuple), MAX_ITEM, tmpFiles[min_index]); cur[min_index] = 0; } if (feof(tmpFiles[min_index]) && len[min_index] == cur[min_index]) ++numOfEOF; } if (count != 0) { fwrite(okeyAfterSort, sizeof(int), count, ofileAfterSort); fwrite(ckeyAfterSort, sizeof(int), count, cfileAfterSort); } for (int i = 0; i < tmpFileId; ++i) { fclose(tmpFiles[i]); remove(getTempName(i)); } fclose(ofileAfterSort); fclose(cfileAfterSort); delete []tmpFiles; for (int i = 0; i < tmpFileId; ++i) delete [](head[i]); delete []head; delete []len; delete []cur; return true; }