Beispiel #1
0
void parse_cmd_line(const deque<wstring>& params, list<wstring>& source_dirs, list<wstring>& include_dirs) {
  source_dirs.assign(1, wstring());
  for (auto param = params.cbegin(); param != params.cend(); ++param) {
    if (substr_match(*param, 0, L"-I")) {
      wstring inc_dir = param->substr(2);
      CHECK_CMD(!inc_dir.empty());
      fix_slashes(inc_dir);
      include_dirs.push_back(inc_dir);
    }
    else {
      wstring src_dir = *param;
      fix_slashes(src_dir);
      source_dirs.push_back(src_dir);
    }
  }
}
Beispiel #2
0
void parse_cmd_line(const deque<wstring>& params, deque<FileNamePair>& files, wstring& header_file) {
  CHECK_CMD(params.size());
  unsigned idx = 0;
  CHECK_CMD(params[idx] == L"-in");
  idx++;
  files.clear();
  FileNamePair fnp;
  while ((idx < params.size()) && (params[idx] != L"-out")) {
    fnp.in = params[idx];
    files.push_back(fnp);
    idx++;
  }
  CHECK_CMD(files.size());
  CHECK_CMD(idx != params.size());
  idx++;
  CHECK_CMD(idx != params.size());
  header_file = params[idx];
  idx++;
  for (unsigned i = 0; i < files.size(); i++) {
    CHECK_CMD(idx != params.size());
    files[i].out = params[idx];
    idx++;
  }
}
bool ReplicatedKeyspaceDB::Execute(
Transaction* transaction, uint64_t paxosID, uint64_t commandID)
{
#define CHECK_CMD()												\
	if (storedPaxosID > paxosID ||								\
	(storedPaxosID == paxosID && storedCommandID >= commandID))	\
		return true;

	bool		ret;
	unsigned	nread;
	int64_t		num;
	uint64_t	storedPaxosID, storedCommandID;
	ByteString	userValue;
	ValBuffer	tmp;
	ByteString	key;
	
	ret = true;
	switch (msg.type)
	{
	case KEYSPACE_SET:
		WriteValue(wdata, paxosID, commandID, msg.value);
		ret &= table->Set(transaction, msg.key, wdata);
		wdata.Set(msg.value);
		break;

	case KEYSPACE_TEST_AND_SET:
		ret &= table->Get(transaction, msg.key, wdata);
		if (!ret) break;
		ReadValue(wdata, storedPaxosID, storedCommandID, userValue);
		CHECK_CMD();
		wdata.Set(userValue);
		if (wdata == msg.test)
		{
			WriteValue(wdata, paxosID, commandID, msg.value);
			ret &= table->Set(transaction, msg.key, wdata);
			if (ret)
				wdata.Set(msg.value);
		}
		break;

	case KEYSPACE_ADD:
		// read number:
		ret &= table->Get(transaction, msg.key, wdata);
		if (!ret) break;
		ReadValue(wdata, storedPaxosID, storedCommandID, userValue);
		CHECK_CMD();
		// parse number:
		num = strntoint64(userValue.buffer, userValue.length, &nread);
		if (nread == (unsigned) userValue.length)
		{
			num = num + msg.num;
			// print number:
			wdata.length = snwritef(wdata.buffer, wdata.size, "%U:%U:%I",
								   paxosID, commandID, num);
			// write number:
			ret &= table->Set(transaction, msg.key, wdata);
			// data is returned to the user
			wdata.length = snwritef(wdata.buffer, wdata.size, "%I", num);
		}
		else
			ret = false;
		break;
		
	case KEYSPACE_RENAME:
		ret &= table->Get(transaction, msg.key, wdata);
		if (!ret) break;
		ReadValue(wdata, storedPaxosID, storedCommandID, userValue);
		CHECK_CMD();
		tmp.Set(userValue);
		WriteValue(wdata, paxosID, commandID, tmp);
		ret &= table->Set(transaction, msg.newKey, wdata);
		if (!ret) break;
		ret &= table->Delete(transaction, msg.key);
		break;

	case KEYSPACE_DELETE:
		ret &= table->Delete(transaction, msg.key);
		break;
		
	case KEYSPACE_REMOVE:
		ret &= table->Get(transaction, msg.key, tmp);
		if (!ret) break;
		ReadValue(tmp, storedPaxosID, storedCommandID, userValue);
		CHECK_CMD();
		wdata.Set(userValue);
		ret &= table->Delete(transaction, msg.key);
		break;

	case KEYSPACE_PRUNE:
		ret &= table->Prune(transaction, msg.prefix);
		break;

	case KEYSPACE_SET_EXPIRY:
		Log_Trace("Setting expiry for key: %.*s", msg.key.length, msg.key.buffer);
		// remove old expiry
		if (msg.prevExpiryTime > 0)
		{
			WriteExpiryTime(kdata, msg.prevExpiryTime, msg.key);
			table->Delete(transaction, kdata);			
		}
		// write !!t:<expirytime>:<key> => NULL
		WriteExpiryTime(kdata, msg.nextExpiryTime, msg.key);
		rdata.Clear();
		table->Set(transaction, kdata, rdata);
		// write !!k:<key> => <expiryTime>
		WriteExpiryKey(kdata, msg.key);
		table->Set(transaction, kdata, msg.nextExpiryTime);
		ret = true;
		break;

	case KEYSPACE_EXPIRE:
		Log_Trace("Expiring key: %.*s", msg.key.length, msg.key.buffer);
		// delete !!k:<key> => <expiryTime>
		WriteExpiryKey(kdata, msg.key);
		table->Delete(transaction, kdata);
		// delete !!t:<expirytime>:<key> => NULL
		WriteExpiryTime(kdata, msg.prevExpiryTime, msg.key);
		table->Delete(transaction, kdata);
		// delete actual key
		table->Delete(transaction, msg.key); // (*)
		expiryAdded = false;
		ret = true;
		break;

	case KEYSPACE_REMOVE_EXPIRY:
		// same as above except (*) is missing
		Log_Trace("Removing expiry for key: %.*s", msg.key.length, msg.key.buffer);
		// delete !!k:<key> => <expiryTime>
		WriteExpiryKey(kdata, msg.key);
		table->Delete(transaction, kdata);
		// delete !!t:<expirytime>:<key> => NULL
		WriteExpiryTime(kdata, msg.prevExpiryTime, msg.key);
		table->Delete(transaction, kdata);
		ret = true;
		break;

	case KEYSPACE_CLEAR_EXPIRIES:
		Log_Trace("Clearing all expiries");
		kdata.Writef("!!");
		table->Prune(transaction, kdata, true);
		ret = true;
		break;

	default:
		ASSERT_FAIL();
	}
	
	return ret;
}