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 |
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 |