syntax = "proto2";
option go_package = "memcache";

package appengine;

message MemcacheServiceError {
  enum ErrorCode {
    OK = 0;
    UNSPECIFIED_ERROR = 1;
    NAMESPACE_NOT_SET = 2;
    PERMISSION_DENIED = 3;
    INVALID_VALUE = 6;
  }
}

message AppOverride {
  required string app_id = 1;

  optional int32 num_memcacheg_backends = 2 [deprecated=true];
  optional bool ignore_shardlock = 3 [deprecated=true];
  optional string memcache_pool_hint = 4 [deprecated=true];
  optional bytes memcache_sharding_strategy = 5 [deprecated=true];
}

message MemcacheGetRequest {
  repeated bytes key = 1;
  optional string name_space = 2 [default = ""];
  optional bool for_cas = 4;
  optional AppOverride override = 5;
  optional bool for_peek = 6 [default = false];
}

message ItemTimestamps {
  optional int64 expiration_time_sec = 1;
  optional int64 last_access_time_sec = 2;
  optional int64 delete_lock_time_sec = 3;
}

message MemcacheGetResponse {
  repeated group Item = 1 {
    required bytes key = 2;
    required bytes value = 3;
    optional fixed32 flags = 4;
    optional fixed64 cas_id = 5;
    optional int32 expires_in_seconds = 6;
    optional ItemTimestamps timestamps = 8;
    optional bool is_delete_locked = 9;
  }
}

message MemcacheSetRequest {
  enum SetPolicy {
    SET = 1;
    ADD = 2;
    REPLACE = 3;
    CAS = 4;
  }
  repeated group Item = 1 {
    required bytes key = 2;
    required bytes value = 3;

    optional fixed32 flags = 4;
    optional SetPolicy set_policy = 5 [default = SET];
    optional fixed32 expiration_time = 6 [default = 0];

    optional fixed64 cas_id = 8;
    optional bool for_cas = 9;
  }
  optional string name_space = 7 [default = ""];
  optional AppOverride override = 10;
}

message MemcacheSetResponse {
  enum SetStatusCode {
    STORED = 1;
    NOT_STORED = 2;
    ERROR = 3;
    EXISTS = 4;
  }
  repeated SetStatusCode set_status = 1;
}

message MemcacheDeleteRequest {
  repeated group Item = 1 {
    required bytes key = 2;
    optional fixed32 delete_time = 3 [default = 0];
  }
  optional string name_space = 4 [default = ""];
  optional AppOverride override = 5;
}

message MemcacheDeleteResponse {
  enum DeleteStatusCode {
    DELETED = 1;
    NOT_FOUND = 2;
  }
  repeated DeleteStatusCode delete_status = 1;
}

message MemcacheIncrementRequest {
  enum Direction {
    INCREMENT = 1;
    DECREMENT = 2;
  }
  required bytes key = 1;
  optional string name_space = 4 [default = ""];

  optional uint64 delta = 2 [default = 1];
  optional Direction direction = 3 [default = INCREMENT];

  optional uint64 initial_value = 5;
  optional fixed32 initial_flags = 6;
  optional AppOverride override = 7;
}

message MemcacheIncrementResponse {
  enum IncrementStatusCode {
    OK = 1;
    NOT_CHANGED = 2;
    ERROR = 3;
  }

  optional uint64 new_value = 1;
  optional IncrementStatusCode increment_status = 2;
}

message MemcacheBatchIncrementRequest {
  optional string name_space = 1 [default = ""];
  repeated MemcacheIncrementRequest item = 2;
  optional AppOverride override = 3;
}

message MemcacheBatchIncrementResponse {
  repeated MemcacheIncrementResponse item = 1;
}

message MemcacheFlushRequest {
  optional AppOverride override = 1;
}

message MemcacheFlushResponse {
}

message MemcacheStatsRequest {
  optional AppOverride override = 1;
}

message MergedNamespaceStats {
  required uint64 hits = 1;
  required uint64 misses = 2;
  required uint64 byte_hits = 3;

  required uint64 items = 4;
  required uint64 bytes = 5;

  required fixed32 oldest_item_age = 6;
}

message MemcacheStatsResponse {
  optional MergedNamespaceStats stats = 1;
}

message MemcacheGrabTailRequest {
  required int32 item_count = 1;
  optional string name_space = 2 [default = ""];
  optional AppOverride override = 3;
}

message MemcacheGrabTailResponse {
  repeated group Item = 1 {
    required bytes value = 2;
    optional fixed32 flags = 3;
  }
}
