util/pubsub.lua
changeset 11723 3986b5a0c3fc
parent 11571 c471e19a238e
child 11724 72512c0858b3
equal deleted inserted replaced
11722:d79f5431f31b 11723:3986b5a0c3fc
   563 	end
   563 	end
   564 	if not self.config.itemcheck(item) then
   564 	if not self.config.itemcheck(item) then
   565 		return nil, "invalid-item";
   565 		return nil, "invalid-item";
   566 	end
   566 	end
   567 	local node_data = self.data[node];
   567 	local node_data = self.data[node];
   568 	if not node_data then
   568 	if node_data then
   569 		-- FIXME how is this possible?  #1657
   569 		local ok = node_data:set(id, item);
   570 		return nil, "internal-server-error";
   570 		if not ok then
   571 	end
   571 			return nil, "internal-server-error";
   572 	local ok = node_data:set(id, item);
   572 		end
   573 	if not ok then
   573 		if type(ok) == "string" then id = ok; end
   574 		return nil, "internal-server-error";
   574 	end
   575 	end
       
   576 	if type(ok) == "string" then id = ok; end
       
   577 	local event_data = { service = self, node = node, actor = actor, id = id, item = item };
   575 	local event_data = { service = self, node = node, actor = actor, id = id, item = item };
   578 	self.events.fire_event("item-published/"..node, event_data);
   576 	self.events.fire_event("item-published/"..node, event_data);
   579 	self.events.fire_event("item-published", event_data);
   577 	self.events.fire_event("item-published", event_data);
   580 	self:broadcast("items", node, node_obj.subscribers, item, actor, node_obj);
   578 	self:broadcast("items", node, node_obj.subscribers, item, actor, node_obj);
   581 	return true;
   579 	return true;
   591 	if not self:may(node, actor, "retract") then
   589 	if not self:may(node, actor, "retract") then
   592 		return false, "forbidden";
   590 		return false, "forbidden";
   593 	end
   591 	end
   594 	--
   592 	--
   595 	local node_obj = self.nodes[node];
   593 	local node_obj = self.nodes[node];
   596 	if (not node_obj) or (not self.data[node]:get(id)) then
   594 	if not node_obj then
   597 		return false, "item-not-found";
   595 		return false, "item-not-found";
   598 	end
   596 	end
   599 	local ok = self.data[node]:set(id, nil);
   597 	if self.data[node] then
   600 	if not ok then
   598 		if not self.data[node]:get(id) then
   601 		return nil, "internal-server-error";
   599 			return false, "item-not-found";
       
   600 		end
       
   601 		local ok = self.data[node]:set(id, nil);
       
   602 		if not ok then
       
   603 			return nil, "internal-server-error";
       
   604 		end
   602 	end
   605 	end
   603 	self.events.fire_event("item-retracted", { service = self, node = node, actor = actor, id = id });
   606 	self.events.fire_event("item-retracted", { service = self, node = node, actor = actor, id = id });
   604 	if retract then
   607 	if retract then
   605 		self:broadcast("retract", node, node_obj.subscribers, retract, actor, node_obj);
   608 		self:broadcast("retract", node, node_obj.subscribers, retract, actor, node_obj);
   606 	end
   609 	end
   615 	--
   618 	--
   616 	local node_obj = self.nodes[node];
   619 	local node_obj = self.nodes[node];
   617 	if not node_obj then
   620 	if not node_obj then
   618 		return false, "item-not-found";
   621 		return false, "item-not-found";
   619 	end
   622 	end
   620 	if self.data[node] and self.data[node].clear then
   623 	if self.data[node] then
   621 		self.data[node]:clear()
   624 		if self.data[node].clear then
   622 	else
   625 			self.data[node]:clear()
   623 		self.data[node] = self.config.itemstore(self.nodes[node].config, node);
   626 		else
       
   627 			self.data[node] = self.config.itemstore(self.nodes[node].config, node);
       
   628 		end
   624 	end
   629 	end
   625 	self.events.fire_event("node-purged", { service = self, node = node, actor = actor });
   630 	self.events.fire_event("node-purged", { service = self, node = node, actor = actor });
   626 	if notify then
   631 	if notify then
   627 		self:broadcast("purge", node, node_obj.subscribers, nil, actor, node_obj);
   632 		self:broadcast("purge", node, node_obj.subscribers, nil, actor, node_obj);
   628 	end
   633 	end
   641 	end
   646 	end
   642 	if type(ids) == "string" then -- COMPAT see #1305
   647 	if type(ids) == "string" then -- COMPAT see #1305
   643 		ids = { ids };
   648 		ids = { ids };
   644 	end
   649 	end
   645 	local data = {};
   650 	local data = {};
       
   651 	if not self.data[node] then
       
   652 		return true, data;
       
   653 	end
   646 	if ids then
   654 	if ids then
   647 		for _, key in ipairs(ids) do
   655 		for _, key in ipairs(ids) do
   648 			local value = self.data[node]:get(key);
   656 			local value = self.data[node]:get(key);
   649 			if value then
   657 			if value then
   650 				data[#data+1] = key;
   658 				data[#data+1] = key;
   668 	--
   676 	--
   669 
   677 
   670 	-- Check node exists
   678 	-- Check node exists
   671 	if not self.nodes[node] then
   679 	if not self.nodes[node] then
   672 		return false, "item-not-found";
   680 		return false, "item-not-found";
       
   681 	end
       
   682 
       
   683 	if not self.data[node] then
       
   684 		-- FIXME Should this be a success or failure?
       
   685 		return true, nil;
   673 	end
   686 	end
   674 
   687 
   675 	-- Returns success, id, item
   688 	-- Returns success, id, item
   676 	return true, self.data[node]:head();
   689 	return true, self.data[node]:head();
   677 end
   690 end
   803 	end
   816 	end
   804 
   817 
   805 	if old_config["persist_items"] ~= node_obj.config["persist_items"] then
   818 	if old_config["persist_items"] ~= node_obj.config["persist_items"] then
   806 		self.data[node] = self.config.itemstore(self.nodes[node].config, node);
   819 		self.data[node] = self.config.itemstore(self.nodes[node].config, node);
   807 	elseif old_config["max_items"] ~= node_obj.config["max_items"] then
   820 	elseif old_config["max_items"] ~= node_obj.config["max_items"] then
   808 		self.data[node]:resize(self.nodes[node].config["max_items"]);
   821 		if self.data[node] then
       
   822 			self.data[node]:resize(self.nodes[node].config["max_items"]);
       
   823 		end
   809 	end
   824 	end
   810 
   825 
   811 	return true;
   826 	return true;
   812 end
   827 end
   813 
   828