/* -------------------------------------------------------------------
**
** riak_kv.proto: Protocol buffers for riak KV
**
** Copyright (c) 2007-2010 Basho Technologies, Inc.  All Rights Reserved.
**
** This file is provided to you under the Apache License,
** Version 2.0 (the "License"); you may not use this file
** except in compliance with the License.  You may obtain
** a copy of the License at
**
**   http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing,
** software distributed under the License is distributed on an
** "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
** KIND, either express or implied.  See the License for the
** specific language governing permissions and limitations
** under the License.
**
** -------------------------------------------------------------------
*/

/*
** Revision: 1.2
*/

// Java package specifiers
option java_package = "com.basho.riak.protobuf";
option java_outer_classname = "RiakKvPB";

import "riak.proto"; // for RpbPair

// Get ClientId Request - no message defined, just send RpbGetClientIdReq message code
message RpbGetClientIdResp {
    required bytes client_id = 1; // Client id in use for this connection
}

message RpbSetClientIdReq {
    required bytes client_id = 1; // Client id to use for this connection
}
// Set ClientId Request - no message defined, just send RpbSetClientIdReq message code


// Get Request - retrieve bucket/key
message RpbGetReq {
    required bytes bucket = 1;
    required bytes key = 2;
    optional uint32 r = 3;
    optional uint32 pr = 4;
    optional bool basic_quorum = 5;
    optional bool notfound_ok = 6;
    optional bytes if_modified = 7;     // fail if the supplied vclock does not match
    optional bool head = 8;             // return everything but the value
    optional bool deletedvclock = 9;    // return the tombstone's vclock, if applicable
}

// Get Response - if the record was not found there will be no content/vclock
message RpbGetResp {
    repeated RpbContent content = 1;
    optional bytes vclock = 2;        // the opaque vector clock for the object
    optional bool unchanged = 3;
}


// Put request - if options.return_body is set then the updated metadata/data for
//               the key will be returned.
message RpbPutReq {
    required bytes bucket = 1;
    optional bytes key = 2;
    optional bytes vclock = 3;
    required RpbContent content = 4;
    optional uint32 w = 5;
    optional uint32 dw = 6;
    optional bool return_body = 7;
    optional uint32 pw = 8;
    optional bool if_not_modified = 9;
    optional bool if_none_match = 10;
    optional bool return_head = 11;
}

// Put response - same as get response with optional key if one was generated
message RpbPutResp {
    repeated RpbContent content = 1;
    optional bytes vclock = 2;        // the opaque vector clock for the object
    optional bytes key = 3;           // the key generated, if any
}


// Delete request
message RpbDelReq {
    required bytes bucket = 1;
    required bytes key = 2;
    optional uint32 rw = 3;
    optional bytes vclock = 4;
    optional uint32 r = 5;
    optional uint32 w = 6;
    optional uint32 pr = 7;
    optional uint32 pw = 8;
    optional uint32 dw = 9;
}

// Delete response - not defined, will return a RpbDelResp on success or RpbErrorResp on failure

// List buckets request - no message defined, just send RpbListBucketsReq

// List buckets response
message RpbListBucketsResp {
    repeated bytes buckets = 1;
}


// List keys in bucket request
message RpbListKeysReq {
    required bytes bucket = 1;
}

// List keys in bucket response - one or more of these packets will be sent
// the last one will have done set true (and may not have any keys in it)
message RpbListKeysResp {
    repeated bytes keys = 1;
    optional bool done = 2;
}

// Get bucket properties request
message RpbGetBucketReq {
    required bytes bucket = 1;
}

// Get bucket properties response
message RpbGetBucketResp {
    required RpbBucketProps props = 1;
}

// Set bucket properties request
message RpbSetBucketReq {
    required bytes bucket = 1;
    required RpbBucketProps props = 2;
}


// Set bucket properties response - no message defined, just send RpbSetBucketResp


// Map/Reduce request
message RpbMapRedReq {
    required bytes request = 1;
    required bytes content_type = 2;
}

// Map/Reduce response
// one or more of these packets will be sent the last one will have done set
// true (and may not have phase/data in it)
message RpbMapRedResp {
    optional uint32 phase = 1;
    optional bytes response = 2;
    optional bool done = 3;
}

// Secondary Index query request
message RpbIndexReq {
    enum IndexQueryType {
        eq = 0;
        range = 1;
    }

    required bytes bucket = 1;
    required bytes index = 2;
    required IndexQueryType qtype = 3;
    optional bytes key = 4;
    optional bytes range_min = 5;
    optional bytes range_max = 6;
}

// Secondary Index query response
message RpbIndexResp {
    repeated bytes keys = 1;
}

// Content message included in get/put responses
// Holds the value and associated metadata
message RpbContent {
    required bytes value = 1;
    optional bytes content_type = 2;     // the media type/format
    optional bytes charset = 3;
    optional bytes content_encoding = 4;
    optional bytes vtag = 5;
    repeated RpbLink links = 6;          // links to other resources
    optional uint32 last_mod = 7;
    optional uint32 last_mod_usecs = 8;
    repeated RpbPair usermeta = 9;       // user metadata stored with the object
    repeated RpbPair indexes = 10;       // user metadata stored with the object
    optional bool deleted = 11;
}

// Link metadata
message RpbLink {
    optional bytes bucket = 1;
    optional bytes key = 2;
    optional bytes tag = 3;
}

// Bucket properties
message RpbBucketProps {
    optional uint32 n_val = 1;
    optional bool allow_mult = 2;
}
