1.2.2 Broccoli Pie (2013-07-24)

New Features:
  • Support for Riak secondary indexes have been added (for use with the LevelDB backend). Bucket.GetKeysByIndex() allows you perform both equality and range queries against a given secondary index based on ASCII encoded strings.
  • There are overloads for all Set methods that accept an IEnumerable<IndexEntry> parameter to specify the secondary indexes to be stored together with the value. Secondary indexes are retrieved together with the value using Bucket.Get().
  • MapReduce queries now work correctly with Riak 1.3+ rather than returning just the first few results.

1.2.1 Broccoli Pie (2012-10-04)

  • Fixed an issue where a failed connection could freeze the whole Unity Editor the next time you entered play mode.
  • Fixed an issue where, after play mode was stopped in the Unity Editor, uGameDB might start using a lot of CPU.

1.2.0 Broccoli Pie (2012-08-03)

New features:
  • Replication parameters can now be used in all Get, Set and Remove requests to control how many data replicas are involved in each request. Get requests include an R value that indicates how many replicas must agree before returning. Set requests include W and Dw values that indicate how many replicas must be written to memory and disk respectively, before returning success. Remove requests include an Rw value that indicate how many replicas must be found and deleted before returning success. The total number of replicas for each database entry can be set through the N value of the SetBucketProp request.
  • MapReduce inputs have been expanded to include both a list of keys in one bucket, and a list of bucket/key-pairs. Using such explicit, finite list inputs is more efficient than the existing method to operate on all keys in a bucket, because they do not imply an internal GetKeys operation in Riak. Making a MapReduce on a list of keys in a bucket can be done through the Bucket.MapReduceOnKeyList() method, and if you want to use a list of bucket/key-pairs you can call Database.MapReduceOnBucketKeyList().
  • MapReduce phase functions can now be specified both as explicit JavaScript code and as an database address where the JavaScript code can be found. This can help lower the bandwidth used when sending MapReduce requests. The JavaScript code will be loaded from Riak internally. You can now also specify to use Erlang functions that have been previously loaded on all nodes as phase functions.
  • It is now possible to use Riak's functionality to generate keys for new entries. Use Bucket.SetGeneratedKey() to perform a Set request without a specified key. The generated key will be returned in the response.
  • You can now get and set bucket properties by using Bucket.GetBucketProp() and Bucket.SetBucketProp() respectively. This allows you to control the N-val (the number of replicas that Riak should keep of each entry in the bucket) and whether the bucket should allow siblings of entries to be created.
  • To handle write conflicts in the data (siblings) you can now use GetRequest.HasSiblings() and GetRequest.GetSiblings() to find out if there are persistent conflicts in your data. You can choose which value should be the unique and correct one, and make a new write to resolve the conflict. Note that siblings can show up even if the bucket has been set not to allow them, for example if the Riak nodes become unable to communicate.
  • Threading stability has been greatly improved, and a number of potential race conditions and deadlock situations have been solved.
  • The underlying request dispatch system has been greatly reworked. It is now much more straight-forward and has a lot fewer synchronization points.
  • Request timeouts should no longer risk leaving the request hanging around on the queue, and failed requests should no longer hang around to time out a bit later.
  • The default timeout for requests has been increased to 30 seconds. The default timeouts for socket read/write operations have been increased to 5 seconds.
  • The Database.ResetGlobalState() debug method has been moved to Database.Debug.ResetGlobalState() to emphasize its intended use. The Database.Debug class also contains a SetSibling() method that can be used to artificially create siblings in your data, and to test conflict resolution in your uGameDB code.