示例#1
0
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;
}
示例#2
0
/* 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;
}