Пример #1
0
bool LSD_Reader::Save(const std::string& filename, const RPG::Save& save, const std::string &encoding) {
	LcfWriter writer(filename, encoding);
	if (!writer.IsOk()) {
		LcfReader::SetError("Couldn't find %s save file.\n", filename.c_str());
		return false;
	}
	const std::string header("LcfSaveData");
	writer.WriteInt(header.size());
	writer.Write(header);

	const_cast<RPG::Save&>(save).title.timestamp = GenerateTimestamp();

	Struct<RPG::Save>::WriteLcf(save, writer);
	return true;
}
Пример #2
0
//--------------------------------------------------------------------------------------------------
void OAuthSignRequest
(
    const Credentials_t& keys,  ///< [IN] The application's keys.
    Request_t type,             ///< [IN] The type of request to be performed.
    const std::string& url,     ///< [IN] The address and path of the request.
    ParamMap_t& params,         ///< [IN/OUT] The parameter list will be updated with the required
                                ///<          OAuth additions.
    bool excludeConsumer        ///< [IN] Should the consumer key be excluded from the params?
)
//--------------------------------------------------------------------------------------------------
{
    std::string timeStamp = GenerateTimestamp();

    params.insert({ "oauth_nonce", GenerateNonce(timeStamp) });
    params.insert({ "oauth_signature_method", "HMAC-SHA1" });
    params.insert({ "oauth_timestamp", timeStamp });
    params.insert({ "oauth_version", "1.0" });

    if (excludeConsumer == false)
    {
        params.insert({ "oauth_consumer_key", keys.consumer.publicKey });
    }

    if (keys.oAuthAccess.publicKey.size() > 0)
    {
        params.insert({ "oauth_token", keys.oAuthAccess.publicKey });
    }

    std::stringstream requestString;
    std::stringstream paramString;

    switch (type)
    {
        case Request_t::Get:
            requestString << "GET&";
            break;

        case Request_t::Post:
            requestString << "POST&";
            break;

        default:
            throw std::runtime_error("Unexpected HTTP request type.");
    }

    requestString << UrlEncode(url) << "&";

    bool first = true;
    for (auto iter : params)
    {
        if (first) { first = false; } else { paramString << "&"; }
        paramString << UrlEncode(iter.first) << "=" << UrlEncode(iter.second);
    }

    requestString << UrlEncode(paramString.str());

    for (size_t i = 0; i < requestString.str().size(); i += 20)
    {
        std::string section = requestString.str().substr(i, 20);
    }

    CHMAC_SHA1 sha1;

    std::string signingKey = UrlEncode(keys.consumer.secretKey) + "&";

    if (keys.oAuthAccess.secretKey.size() > 0)
    {
        signingKey += UrlEncode(keys.oAuthAccess.secretKey);
    }

    BYTE digest[CHMAC_SHA1::SHA1_DIGEST_LENGTH] = "";

    sha1.HMAC_SHA1((unsigned char*)requestString.str().c_str(),
                   requestString.str().size(),
                   (unsigned char*)signingKey.c_str(),
                   signingKey.size(),
                   digest);

    params.insert({ "oauth_signature", base64_encode(digest, sizeof(digest)) });
}
Пример #3
0
		bool TransactionManager::CommitTransaction(TxnContext *context, EventTuple *param, CharArray &ret_str){
			BEGIN_PHASE_MEASURE(thread_id_, COMMIT_PHASE);
			// step 1: acquire lock and validate
			uint64_t max_rw_ts = 0;
			size_t lock_count = 0;
			bool is_success = true;
			access_list_.Sort();
			for (size_t i = 0; i < access_list_.access_count_; ++i) {
				++lock_count;
				Access *access_ptr = access_list_.GetAccess(i);
				if (access_ptr->access_type_ == READ_ONLY) {
					// acquire read lock
					access_ptr->access_record_->content_.AcquireReadLock();
#if !defined(NOVALID)
					// whether someone has changed the tuple after my read
					if (access_ptr->access_record_->content_.GetTimestamp() != access_ptr->timestamp_) {
						UPDATE_CC_ABORT_COUNT(thread_id_, context->txn_type_, access_ptr->access_record_->GetTableId());
						is_success = false;
						break;
					}
#endif
					if (access_ptr->timestamp_ > max_rw_ts){
						max_rw_ts = access_ptr->timestamp_;
					}
				}
				else if (access_ptr->access_type_ == READ_WRITE) {
					// acquire write lock
					access_ptr->access_record_->content_.AcquireWriteLock();
#if !defined(NOVALID)
					// whether someone has changed the tuple after my read
					if (access_ptr->access_record_->content_.GetTimestamp() != access_ptr->timestamp_) {
						UPDATE_CC_ABORT_COUNT(thread_id_, context->txn_type_, access_ptr->access_record_->GetTableId());
						is_success = false;
						break;
					}
#endif
					if (access_ptr->timestamp_ > max_rw_ts){
						max_rw_ts = access_ptr->timestamp_;
					}
				}
				else {
					assert(access_ptr->access_type_ == DELETE_ONLY);
					access_ptr->access_record_->content_.AcquireWriteLock();
				}
			}
			// step 2: if success, then overwrite and commit
			if (is_success == true) {
				BEGIN_CC_TS_ALLOC_TIME_MEASURE(thread_id_);
				uint64_t curr_ts = ScalableTimestamp::GetTimestamp();
				END_CC_TS_ALLOC_TIME_MEASURE(thread_id_);
				uint64_t commit_ts = GenerateTimestamp(curr_ts, max_rw_ts);

				for (size_t i = 0; i < access_list_.access_count_; ++i) {
					Access *access_ptr = access_list_.GetAccess(i);
					TableRecord *access_record = access_ptr->access_record_;
					if (access_ptr->access_type_ == READ_WRITE) {
						assert(commit_ts > access_ptr->timestamp_);
						access_record->record_->CopyFrom(access_ptr->local_record_);
						COMPILER_MEMORY_FENCE;
						access_record->content_.SetTimestamp(commit_ts);
#if defined(VALUE_LOGGING)
						log_buffer_.UpdateRecord(access_record->schema_ptr_->GetTableId(), access_ptr->local_record_->data_ptr_, access_record->schema_ptr_->GetSchemaSize());
#endif
					}
					else if (access_ptr->access_type_ == DELETE_ONLY) {
						assert(max_rw_ts >= access_ptr->timestamp_);
						assert(commit_ts > access_ptr->timestamp_);
						access_record->record_->is_visible_ = false;
						COMPILER_MEMORY_FENCE;
						access_record->content_.SetTimestamp(commit_ts);
#if defined(VALUE_LOGGING)
						log_buffer_.DeleteRecord(access_record->schema_ptr_->GetTableId(), access_record->GetPrimaryKey());
#endif
					}
				}
				for (size_t i = 0; i < insertion_list_.insertion_count_; ++i) {
					Insertion *insertion_ptr = insertion_list_.GetInsertion(i);
					TableRecord *tb_record = new TableRecord(insertion_ptr->local_record_);
					tb_record->content_.AcquireWriteLock();
					tb_record->content_.SetTimestamp(commit_ts);
					insertion_ptr->insertion_record_ = tb_record;
					//storage_manager_->tables_[insertion_ptr->table_id_]->InsertRecord(insertion_ptr->primary_key_, insertion_ptr->insertion_record_);
#if defined(VALUE_LOGGING)
					log_buffer_.InsertRecord(insertion_ptr->table_id_, insertion_record->data_ptr_, insertion_record->schema_ptr_->GetSchemaSize());
#endif
				}
				// commit.
#if defined(VALUE_LOGGING)
				CharArray *log_str = log_buffer_.Commit();
				logger_->CommitTransaction(this->thread_id_, commit_ts, log_str);
#elif defined(COMMAND_LOGGING)
				CharArray *log_str = log_buffer_.Commit(context->txn_type_, param);
				logger_->CommitTransaction(this->thread_id_, commit_ts, log_str);
#endif

				// step 3: release locks and clean up.
				for (size_t i = 0; i < access_list_.access_count_; ++i) {
					Access *access_ptr = access_list_.GetAccess(i);
					if (access_ptr->access_type_ == READ_ONLY) {
						access_ptr->access_record_->content_.ReleaseReadLock();
					}
					else if (access_ptr->access_type_ == READ_WRITE) {
						access_ptr->access_record_->content_.ReleaseWriteLock();
						BEGIN_CC_MEM_ALLOC_TIME_MEASURE(thread_id_);
						allocator_->Free(access_ptr->local_record_->data_ptr_);
						access_ptr->local_record_->~SchemaRecord();
						allocator_->Free((char*)access_ptr->local_record_);
						END_CC_MEM_ALLOC_TIME_MEASURE(thread_id_);
					}
					else if (access_ptr->access_type_ == DELETE_ONLY) {
						access_ptr->access_record_->content_.ReleaseWriteLock();
					}
				}
				for (size_t i = 0; i < insertion_list_.insertion_count_; ++i) {
					Insertion *insertion_ptr = insertion_list_.GetInsertion(i);
					insertion_ptr->insertion_record_->content_.ReleaseWriteLock();
				}
			}
			// if failed.
			else {
				// step 3: release locks and clean up.
				for (size_t i = 0; i < access_list_.access_count_; ++i) {
					Access *access_ptr = access_list_.GetAccess(i);
					if (access_ptr->access_type_ == READ_ONLY) {
						access_ptr->access_record_->content_.ReleaseReadLock();
					}
					else if (access_ptr->access_type_ == READ_WRITE) {
						access_ptr->access_record_->content_.ReleaseWriteLock();
						BEGIN_CC_MEM_ALLOC_TIME_MEASURE(thread_id_);
						allocator_->Free(access_ptr->local_record_->data_ptr_);
						access_ptr->local_record_->~SchemaRecord();
						allocator_->Free((char*)access_ptr->local_record_);
						END_CC_MEM_ALLOC_TIME_MEASURE(thread_id_);
					}
					else {
						assert(access_ptr->access_type_ == DELETE_ONLY);
						access_ptr->access_record_->content_.ReleaseWriteLock();
					}
					--lock_count;
					if (lock_count == 0) {
						break;
					}
				}
				for (size_t i = 0; i < insertion_list_.insertion_count_; ++i) {
					Insertion *insertion_ptr = insertion_list_.GetInsertion(i);
					BEGIN_CC_MEM_ALLOC_TIME_MEASURE(thread_id_);
					allocator_->Free(insertion_ptr->local_record_->data_ptr_);
					insertion_ptr->local_record_->~SchemaRecord();
					allocator_->Free((char*)insertion_ptr->local_record_);
					END_CC_MEM_ALLOC_TIME_MEASURE(thread_id_);
				}
			}
			assert(insertion_list_.insertion_count_ <= kMaxAccessNum);
			assert(access_list_.access_count_ <= kMaxAccessNum);
			insertion_list_.Clear();
			access_list_.Clear();
			END_PHASE_MEASURE(thread_id_, COMMIT_PHASE);
			return is_success;
		}