lib/rhoconnect/document.rb in rhoconnect-3.4.5 vs lib/rhoconnect/document.rb in rhoconnect-4.0.0.beta.10

- old
+ new

@@ -1,87 +1,196 @@ module Document - + class << self + def included(base) + base.extend ClassMethods + end + end + + module ClassMethods + def define_valid_doctypes(doctypes = []) + @valid_doctypes ||= Set.new + doctypes.each do |doctype| + @valid_doctypes.add(doctype.to_sym) + end + @enforce_valid_doctypes ||= true + end + + def valid_doctypes + @valid_doctypes ||= Set.new + @valid_doctypes + end + + def enforce_valid_doctypes + @enforce_valid_doctypes ||= false + end + def enforce_valid_doctypes=(enforce_flag) + @enforce_valid_doctypes = enforce_flag + end + end + + def set_db_doc(doctype, data, append=false) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).set_db_doc(docname(doctype), data, append) + end + + def get_db_doc(doctype) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).get_db_doc(docname(doctype)) + end + # Store wrapper methods for document def get_data(doctype,type=Hash) - Store.get_data(docname(doctype), type) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).get_data(docname(doctype), type) end - + def get_object(doctype, key) - Store.get_object(docname(doctype), key) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).get_object(docname(doctype), key) end - + def get_objects(doctype, keys) - Store.get_objects(docname(doctype), keys) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).get_objects(docname(doctype), keys) end - + def get_list(doctype) - Store.get_list(docname(doctype)) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).get_list(docname(doctype)) end - + def get_value(doctype) - Store.get_value(docname(doctype)) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).get_value(docname(doctype)) end - + def put_object(doctype, key, data={}) - Store.put_object(docname(doctype), key, data) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).put_object(docname(doctype), key, data) end - + def put_data(doctype,data,append=false) - Store.put_data(docname(doctype),data,append) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).put_data(docname(doctype),data,append) end - + + def put_tmp_data(doctype, data, append=false) + Store.get_store(store_index(doctype)).put_tmp_data(docname(doctype),data,append) + end + def put_list(doctype,data,append=false) - Store.put_list(docname(doctype),data,append) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).put_list(docname(doctype),data,append) end - + def update_objects(doctype,updates) - Store.update_objects(docname(doctype),updates) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).update_objects(docname(doctype),updates) end - + def remove_objects(doctype,deletes) - Store.delete_objects(docname(doctype),deletes) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).delete_objects(docname(doctype),deletes) end - + def put_value(doctype,data) - Store.put_value(docname(doctype),data) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).put_value(docname(doctype),data) end - + def delete_data(doctype,data) - Store.delete_data(docname(doctype),data) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).delete_data(docname(doctype),data) end - - def flash_data(doctype) - Store.flash_data(docname(doctype)) + + def flush_data(doctype) + verify_doctype(doctype) + Store.flush_data(docname(doctype)) end - - def flash_source_data(doctype, from_source) - self.source_name=from_source - docnamestr = docname('') + doctype - Store.flash_data(docnamestr) - end - + def rename(srcdoctype,dstdoctype) - Store.rename(docname(srcdoctype),docname(dstdoctype)) + verify_doctype(srcdoctype) + verify_doctype(dstdoctype) + Store.get_store(store_index(srcdoctype)).rename(docname(srcdoctype),docname(dstdoctype)) end - - def get_zdata(doctype) - Store.get_zdata(docname(doctype)) + + def rename_tmp_data(srcdoctype,dstdoctype) + verify_doctype(dstdoctype) + Store.get_store(store_index(srcdoctype)).rename_tmp_data(docname(srcdoctype),docname(dstdoctype)) end - - def flush_zdata(doctype) - Store.flush_zdata(docname(doctype)) + + def clone(srcdoctype, dstdocname) + verify_doctype(srcdoctype) + Store.get_store(store_index(srcdoctype)).clone(docname(srcdoctype), dstdocname) end - - def put_zdata(doctype,assoc_key, data={},append=false) - Store.put_zdata(docname(doctype),assoc_key, data,append) - end - + # Generate the fully-qualified docname def docname(doctype) "#{self.class.class_prefix(self.class)}:#{self.app_id}:#{self.doc_suffix(doctype)}" end - + + # default data sharding + def store_index(doctype) + 0 + end + + def compute_store_index(doctype, source, user_id) + index = 0 + # app-partitioned sources go to 0 + # everything else if sharded + if(source.partition == :user) + index_char = Digest::SHA1.hexdigest("#{user_id}:#{source.name}")[0] + # designate Store 0 only for system data + num_user_stores = Store.num_stores - 1 + if num_user_stores > 0 + index = index_char.hex/(16/num_user_stores) + if index >= num_user_stores + index = num_user_stores - 1 + end + # make up for fact that user store index starts from 1 + index += 1 + end + end + index + end + + def exists?(dockey) + verify_doctype(dockey) + Store.get_store(store_index(dockey)).exists?(docname(dockey)) + end + # Update count for a given document def update_count(doctype,count) - Store.update_count(docname(doctype), count) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).update_count(docname(doctype), count) end -end \ No newline at end of file + + def verify_doctype(doctype) + # doctype must be in the list (or list must be empty - which is default for 'all documents are valid') + return true if !self.class.enforce_valid_doctypes or self.class.valid_doctypes.member?(doctype.to_sym) or (self.class.valid_doctypes.size == 0) + raise Rhoconnect::InvalidDocumentException.new("Invalid document type #{doctype} for #{self.class.name}") + end + + # interface for doc diffs + def get_diff_data(srcdoctype, dstdocname, p_size = nil) + verify_doctype(srcdoctype) + Store.get_store(store_index(srcdoctype)).get_diff_data(docname(srcdoctype), dstdocname, p_size) + end + + def get_diff_data_bruteforce(srcdoctype, dstdocname, p_size = nil) + verify_doctype(srcdoctype) + Store.get_store(store_index(srcdoctype)).get_diff_data_bruteforce(docname(srcdoctype), dstdocname, p_size) + end + + def update_elements(doctype, inserts_elements_map, deletes_elements_map) + verify_doctype(doctype) + Store.get_store(store_index(doctype)).update_elements(docname(doctype), inserts_elements_map, deletes_elements_map) + end + + # Computes token for a single client request + def compute_token(doc_key) + verify_doctype(doc_key) + token = get_token + Store.get_store(store_index(doc_key)).put_value(docname(doc_key),token) + token.to_s + end +end