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); } } }
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; }