Skip to content
Newer
Older
100644 179 lines (103 sloc) 15.3 KB
fcc4fff @phiggins42 monster commit from moinconverter, which is always done prior to the …
phiggins42 authored Nov 20, 2011
1 .. _dojo/store:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
2
f89feb8 @wkeese regex change of level 1 headers to ====\nTEXT\n==== and level 2 heade…
wkeese authored Nov 28, 2011
3 ==========
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
4 dojo.store
5 ==========
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
6
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
7 :Authors: Kris Zyp
8 :Project owner: Kris Zyp
9 :Available: 1.6.0
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
10
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
11 .. contents::
12 :depth: 2
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
13
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
14 Dojo Store is an uniform interface for the access and manipulation of stored data. Dojo Store is intended to supersede, integrate, and improve upon the Dojo Data API and Dojo Storage API with a simple, easy to implement and extend API, based on `HTML5/W3C's IndexedDB object store API <http://www.w3.org/TR/IndexedDB/#object-store-sync>`_. The Dojo Storage API (implemented in `dojox.storage <dojox/storage>`_) is already a compatible subset of the the Dojo object store API.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
15
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
16 Dojo Store API
17 ==============
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
18
19
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
20 Methods
21 -------
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
22
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
23 Every method in the API is optional, it's presence indicating support for that feature. Every method can return a promise (except where noted otherwise) to represent an asynchronous completion of the action. (Some of these are still wavering a bit in W3C's object store API):
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
24
f89feb8 @wkeese regex change of level 1 headers to ====\nTEXT\n==== and level 2 heade…
wkeese authored Nov 28, 2011
25 ================================================ Method Description
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
26 ================================================ ======================================================================
27 get(id) Retrieves an object by its identifier, returning the object.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
28
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
29 query(query, options) Queries the store using the provided query.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
30
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
31 The returned value should be an array or a promise with forEach, map, filter, reduce, subscribe, and optional close and watch methods, and a total property (the total may be a promise). The options parameter may include the following properties (all our optional):
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
32
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
33 * start - Starting offset
34 * count - Number of objects to return
35 * sort - This is an array of sort definitions, where each definition contains an "attribute" property indicating which property to sort on and a "descending" property indicating the direction of sort. For example: [{attribute:"price, descending: true}]. If the sort parameter is omitted, then the natural order of the store may be applied if there is a natural order.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
36
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
37 put(object, options) Saves the given object. The (optional) options argument may be an object with the following properties (each of these is optional and advisory, stores are not required to implement or respond to each property):
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
38
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
39 * id - Indicates the identity of the object if a new object is created
40 * before - If the collection of objects in the store has a natural ordering, this indicates that the created or updated object should be placed before the object specified by the value of this property. A value of null indicates that the object should be last.
41 * parent - If the store is hierarchical (with single parenting) this property indicates the new parent of the created or updated object.
42 * overwrite - If this is provided as a boolean it indicates that the object should or should not overwrite an existing object. A value of true indicates that a new object should not be created, the operation should update an existing object. A value of false indicates that an existing object should not be updated, a new object should be created (which is the same as an add() operation). When this property is not provided, either an update or creation is acceptable.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
43
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
44 add(object, options) Create a new object. The (optional) options argument is defined the same as put() (except overwrite is assumed to be false).
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
45
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
46 remove(id) Delete the object by id.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
47
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
48 getIdentity(object) Returns an object's identity
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
49
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
50 queryEngine(query, options) This takes a query and query options and returns a function that can execute the provided query on a JavaScript array. The queryEngine may be replace to provide more sophisticated querying capabilities. The returned query function may have a "matches" property that can be used to determine if an object matches the query.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
51
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
52 transaction() Starts a transaction and returns a transaction object.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
53
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
54 The transaction object should include:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
55
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
56 * commit() - Commits all the changes that took place during the transaction.
57 * abort() - Aborts all the changes that took place during the transaction.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
58
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
59 Note that a store user might not call transaction() prior to using put, delete, etc. in which case these operations effectively could be thought of as "auto-commit" style actions.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
60
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
61 getChildren(object, options) Returns the children of an object. The options parameter may include the same properties as query options
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
62
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
63 getMetadata(object) Returns any metadata about the object.
64 This may include attribution, cache directives, history, or version information. (addresses #3126, #3127)
65 ================================================ ======================================================================
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
66
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
67 Properties
68 ----------
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
69
f89feb8 @wkeese regex change of level 1 headers to ====\nTEXT\n==== and level 2 heade…
wkeese authored Nov 28, 2011
70 =========== ================ Property Type Description
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
71 =========== ================ ======================================================================
72 idProperty String Name of the property to use as the identifier
73 data Array of Objects If the store has a collection of cached objects, it can make this available in this property. This is included so an additional layer could add referential integrity cleanup on object deletion (which is a pain to implement).
74 =========== ================ ======================================================================
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
75
76
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
77 Returned Objects
78 ================
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
79
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
80 Objects returned from store should primarily be treated as normal hash objects and have standard JavaScript properties to access their data and modify their data. However, methods may also be defined on the objects returned by the store (once again, they are optional). These methods should '''not''' be the object's own properties (hasOwnProperty(methodName) should return false), but rather should be inherited from one of the object's prototypes). This is to ensure ease of enumeration of data properties. In particular, a store may choose to return objects that are instances of dojo.Stateful (although none of the core stores do this).
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
81
82
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
83 Observing Result Sets
84 =====================
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
85
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
86 When a store is wrapped with ``dojo.store.Observable``, one can listen for changes in data through the observe method on the result set (the object returned from a query). The observe method has the following signature:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
87
f89feb8 @wkeese regex change of level 1 headers to ====\nTEXT\n==== and level 2 heade…
wkeese authored Nov 28, 2011
88 ======================================================== Method Description
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
89 ======================================================== =======================================================================
90 observe(listener) The listener function is called with following arguments:
91 listener(object, removedFrom, insertedInto);
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
92
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
93 * The object parameter indicates the object that was create, modified, or deleted.
94 * The removedFrom parameter indicates the index in the result array where the object used to be. If the value is -1, then the object is an addition to this result set (due to a new object being created, or changed such that it is a part of the result set).
95 * The insertedInto parameter indicates the index in the result array where the object should be now. If the value is -1, then the object is a removal from this result set (due to an object being deleted, or changed such that it is not a part of the result set).
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
96
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
97 close When close() is called on a result set, notifications will no longer be fired.
98 ======================================================== =======================================================================
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
99
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
100 Core Stores included with Dojo
101 ==============================
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
102
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
103 The following stores, store wrappers, and utilities ship with Dojo. These provide a solid base of good modular components for using stores and building more complex store technology. The following two core stores based on the typical pattern of in-memory and server-based data stores:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
104
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
105 * :ref:`dojo.store.Memory <dojo/store/Memory>`
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
106
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
107 An in-memory object store that queries, modifies, and accesses client-side in-memory data. This can be created with a simple array of JavaScript objects.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
108
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
109 * :ref:`dojo.store.JsonRest <dojo/store/JsonRest>`
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
110
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
111 An server-oriented JSON/REST object store that queries, modifies, and accesses data through RESTful HTTP requests. This would fulfill the conceptual role of JsonRestStore/QueryReadStore/ServiceStore.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
112
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
113 There is also an adapter store for using legacy Dojo Data stores with the new API:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
114
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
115 * :ref:`dojo.store.DataStore <dojo/store/DataStore>`
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
116
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
117 We are also moving in the direction of providing composable functionality by providing store "wrappers" or store "middleware" that takes a store and adds functionality. Several key store wrappers:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
118
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
119 * :ref:`dojo.store.Observable <dojo/store/Observable>` This augments a store with the data monitoring capability, adding a observe method on the query result sets that notifies of data changes.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
120
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
121 * :ref:`dojo.store.Cache <dojo/store/Cache>`
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
122
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
123 Adds caching capability to the store. This eliminates the need for a base store to deal with caching concerns.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
124
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
125 * Future: JsonSchema
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
126
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
127 Handles validation of data through JSON Schema as well object referencing through JSON Schema's link definitions.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
128
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
129 With this one can easily mix and match wrappers and base stores to achieve various types of functionality. A common pattern may be:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
130
c49c87d @phiggins42 normalization
phiggins42 authored Nov 21, 2011
131 .. js ::
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
132
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
133 store = dojo.store.Observable(new dojo.store.Memory({data: someData}));
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
134
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
135 There are also a couple of utility modules:
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
136
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
137 * :ref:`dojo.store.util.SimpleQueryEngine <dojo/store/util/SimpleQueryEngine>`
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
138
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
139 This is basic query engine that provides simple object hash style filtering or function based filtering.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
140
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
141 * :ref:`dojo.store.util.QueryResults <dojo/store/util/QueryResults>`
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
142
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
143 This utility will take an array or a promise for an array and return a result set object with all the standard iterative methods that should be available on a result set (forEach, map, and filter).
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
144
145
146
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
147 Rationale
148 ---------
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
149
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
150 [Rationale: The purpose of using this style of notifications (instead of the Dojo Data notification style of events on the store) is to deal with several problems I have seen with Dojo Data notifications. First, it neglects that fact that most of the time users only want to listen to events from the queried subset of the items in the store, and that subscriptions can be costly. While subscriptions are usually cheap on the client side, carte blanche subscriptions can actually be very expensive on the server side (with Comet-style notifications), forcing the server to send excessive events and then forcing the client to filter them.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
151
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
152 Also this subscription deals with an issue we have experience with Dojo Data in that often new items and item changes can affect query results in ways that the widget can not understand because the queries are opaque to the widget. With the grid, all onNew items result in an addition of a row, regardless of whether the new item actually matches the query. The grid itself knows nothing (and should know nothing) of how queries work, and so it can't filter these events. By putting notifications on the query action itself, notifications can be stated in terms of how they affect a given query result set, which is what the widget ultimately cares about.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
153
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
154 I have intentionally used different event names to be clear that the semantics are different than the Dojo Data notifications. The distinctive events are defined by how they affect the query result set (not whether they have come into or gone out of existence by some definition of existence). Also, the onUpdate applies to an entire object, not per property modifications.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
155
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
156 It also may be worth considering adding the notification events to an options parameter for get(id) calls.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
157
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
158 We will need to include a helper mixin or wrapper to make it easy to implement the query function.]
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
159
160
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
161 I believe this generally facilitates all of the Dojo Data functionality. Some of it may require some composition, but I think most of the needed things would be in place to achieve anything you could with Dojo Data. The one thing I did intentionally omit was getLabel/getLabelAttributes, as I think is clearly a UI concern. It would be easy enough to include a labelProperty property on the store, but I don't think it is necessary.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
162
163
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
164 Design Goals
165 ============
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
166
c9772fd @wkeese more link fixes
wkeese authored Nov 24, 2011
167 * We want to make it very easy to for people to implement their own object stores, essentially one should easily be able to write something up handle the communication to their server without having to deal with much more than writing the :ref:`XHR calls <dojo/xhr>`. Higher level functionality can be built on this. A key to this strategy is a very simple API, that requires a minimal amount of required complexity to implement.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
168
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
169 * We want to maintain the same level of functionality that :ref:`Dojo Data <dojo/data>` provided. While there will be very little (if any) core parts of the object store API that MUST be implemented, there will numerous parts that can be implemented to incrementally add functionality. Optional functionality will be determined through feature detection (checking to see if a method exists). As I noted in the meeting, having lots of optional features does shift some complexity from the store implementors to the anyone who wishes to use stores in a completely generic fashion. However, I believe that our widgets are the primary generic store users, and that most application developers are working with a known store, with a known set of implemented features. In particular, if they know they are using a sync store, the interaction with the store becomes extremely simple. For now I will suggest that basically every method is optional, and the presence of the method indicates support for that feature. However, practically one would at least need to implement get and query, a store without read capabilities is pretty useless, but that should be self-evident.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
170
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
171 * Every method can be implemented sync or async. The interface is the exactly the same for sync and async except that async returns promises/deferreds instead of plain values. The interface requires no other knowledge of specific callbacks to operate.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
172
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
173 * Objects returned from the data store (via query or get) should be plain JavaScript objects whose properties can be typically accessed and modified through standard property access.
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
174
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
175 See Also
176 ========
d608cc5 @phiggins42 \r\n -> \n conversion.
phiggins42 authored Nov 20, 2011
177
9dd52dc @phiggins42 mondo whitespace change
phiggins42 authored Nov 20, 2011
178 * `SitePen Blog Post on Object Stores <http://www.sitepen.com/blog/2011/02/15/dojo-object-stores/>`_
Something went wrong with that request. Please try again.