// -------------------------------------------------------------------
//
// riak.proto: Protocol buffers for Riak
//
// 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.4
//

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


// Error response - may be generated for any Req
message RpbErrorResp {
    required bytes errmsg = 1;
    required uint32 errcode = 2;
}

// Get server info request - no message defined, just send RpbGetServerInfoReq message code
message RpbGetServerInfoResp {
    optional bytes node = 1;
    optional bytes server_version = 2;
}

// Key/value pair - used for user metadata, indexes, search doc fields
message RpbPair {
    required bytes key = 1;
    optional bytes value = 2;
}


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

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

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

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

// Reset bucket properties request
message RpbResetBucketReq {
    required bytes bucket = 1;
    optional bytes type = 2;
}

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

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

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

// Module-Function pairs for commit hooks and other bucket properties
// that take functions
message RpbModFun {
    required bytes module = 1;
    required bytes function = 2;
}

// A commit hook, which may either be a modfun or a JavaScript named
// function
message RpbCommitHook {
    optional RpbModFun modfun = 1;
    optional bytes name = 2;
}

// Bucket properties
message RpbBucketProps {
    // Declared in riak_core_app
    optional uint32 n_val = 1;
    optional bool allow_mult = 2;
    optional bool last_write_wins = 3;
    repeated RpbCommitHook precommit = 4;
    optional bool has_precommit = 5 [default = false];
    repeated RpbCommitHook postcommit = 6;
    optional bool has_postcommit = 7 [default = false];
    optional RpbModFun chash_keyfun = 8;

    // Declared in riak_kv_app
    optional RpbModFun linkfun = 9;
    optional uint32 old_vclock = 10;
    optional uint32 young_vclock = 11;
    optional uint32 big_vclock = 12;
    optional uint32 small_vclock = 13;
    optional uint32 pr = 14;
    optional uint32 r = 15;
    optional uint32 w = 16;
    optional uint32 pw = 17;
    optional uint32 dw = 18;
    optional uint32 rw = 19;
    optional bool basic_quorum = 20;
    optional bool notfound_ok = 21;

    // Used by riak_kv_multi_backend
    optional bytes backend = 22;

    // Used by riak_search bucket fixup
    optional bool search = 23;

    // Used by riak_repl bucket fixup
    enum RpbReplMode {
        FALSE = 0;
        REALTIME = 1;
        FULLSYNC = 2;
        TRUE = 3;
    }
    optional RpbReplMode repl = 24;

    // Search index
    optional bytes search_index = 25;

    // KV Datatypes
    optional bytes datatype = 26;

    // KV strong consistency
    optional bool consistent = 27;
}

// Authentication request
message RpbAuthReq {
    required bytes user = 1;
    required bytes password = 2;
}


// -------------------------------------------------------------------
//
// 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.4
//

// 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
    optional uint32 timeout = 10;
    optional bool sloppy_quorum = 11;   // Experimental, may change/disappear
    optional uint32 n_val = 12;         // Experimental, may change/disappear
    optional bytes type = 13;           // Bucket type, if not set we assume the 'default' type
}

// 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;
    optional uint32 timeout = 12;
    optional bool asis = 13;
    optional bool sloppy_quorum = 14; // Experimental, may change/disappear
    optional uint32 n_val = 15;       // Experimental, may change/disappear
    optional bytes type = 16;         // Bucket type, if not set we assume the 'default' type
}

// 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;
    optional uint32 timeout = 10;
    optional bool sloppy_quorum = 11; // Experimental, may change/disappear
    optional uint32 n_val = 12;       // Experimental, may change/disappear
    optional bytes type = 13;         // Bucket type, if not set we assume the 'default' type
}

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

// List buckets request 
message RpbListBucketsReq {
    optional uint32 timeout = 1;
    optional bool stream = 2;
    optional bytes type = 3;         // Bucket type, if not set we assume the 'default' type
}

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


// List keys in bucket request
message RpbListKeysReq {
    required bytes bucket = 1;
    optional uint32 timeout = 2;
    optional bytes type = 3;         // Bucket type, if not set we assume the 'default' type
}

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


// 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; // key here means equals value for index?
    optional bytes range_min = 5;
    optional bytes range_max = 6;
    optional bool return_terms = 7;
    optional bool stream = 8;
    optional uint32 max_results = 9;
    optional bytes continuation = 10;
    optional uint32 timeout = 11;
    optional bytes type = 12;         // Bucket type, if not set we assume the 'default' type
    optional bytes term_regex = 13;
    // Whether to use pagination sort for non-paginated queries
    optional bool pagination_sort = 14;
}

// Secondary Index query response
message RpbIndexResp {
    repeated bytes keys = 1;
    repeated RpbPair results = 2;
    optional bytes continuation = 3;
    optional bool done = 4;
}

// added solely for riak_cs currently
// for folding over a bucket and returning
// objects.
message RpbCSBucketReq {
    required bytes bucket = 1;
    required bytes start_key = 2;
    optional bytes end_key = 3;
    optional bool start_incl = 4 [default = true];
    optional bool end_incl = 5 [default = false];
    optional bytes continuation = 6;
    optional uint32 max_results = 7;
    optional uint32 timeout = 8;
    optional bytes type = 9;         // Bucket type, if not set we assume the 'default' type
}

// return for CS bucket fold
message RpbCSBucketResp {
    repeated RpbIndexObject objects = 1;
    optional bytes continuation = 2;
    optional bool done = 3;
}

message RpbIndexObject {
    required bytes key = 1;
    required RpbGetResp object = 2;
}

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

// Counter update request
message RpbCounterUpdateReq {
    required bytes bucket = 1;
    required bytes key = 2;
    required sint64 amount = 3;
    optional uint32 w = 4;
    optional uint32 dw = 5;
    optional uint32 pw = 6;
    optional bool returnvalue = 7;
}

// Counter update response? No message | error response
message RpbCounterUpdateResp {
        optional sint64 value = 1;
}

// counter value
message RpbCounterGetReq {
    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;
}

// Counter value response
message RpbCounterGetResp {
    optional sint64 value = 1;
}