- modified insert_new_item to support multiple value insert in single sql statement
[plcapi.git] / PLC / Peers.py
index 9686044..684361f 100644 (file)
@@ -3,13 +3,16 @@
 # 
 
 import re
-
 from types import StringTypes
 
 from PLC.Faults import *
 from PLC.Parameter import Parameter
+from PLC.Filter import Filter
 from PLC.Table import Row, Table
 
+from PLC.Nodes import Nodes,Node
+from PLC.Slices import Slices,Slice
+
 class Peer (Row):
     """
     Stores the list of peering PLCs in the peers table. 
@@ -22,8 +25,9 @@ class Peer (Row):
        'peer_id' : Parameter (int, "Peer identifier"),
        'peername' : Parameter (str, "Peer name"),
        'peer_url' : Parameter (str, "Peer API url"),
-       'person_id' : Parameter (int, "person_id of the account used to log there"),
-       'foreign_node_ids' : Parameter ([int], "doc")
+       'person_id' : Parameter (int, "Person_id of the account storing credentials - temporary"),
+       'node_ids' : Parameter ([int], "This peer's nodes ids"),
+       'slice_ids' : Parameter ([int], "This peer's slices ids"),
        }
 
     def validate_peer_url (self, url):
@@ -42,6 +46,11 @@ class Peer (Row):
        
        assert 'peer_id' in self
 
+        # remove nodes depending on this peer
+        for foreign_node in Nodes (self.api, self['node_ids']):
+            foreign_node.delete(commit)
+
+        # remove the peer
        self['deleted'] = True
        self.sync(commit)
 
@@ -50,29 +59,21 @@ class Peers (Table):
     Maps to the peers table in the database
     """
     
-    def __init__ (self, api, peer_id_or_peername_list = None):
-       self.api = api
-
-       sql="SELECT %s FROM view_peers WHERE deleted IS False" % \
-           ", ".join(Peer.fields)
-       if peer_id_or_peername_list:
-            peer_ids = [x for x in peer_id_or_peername_list if isinstance(x, (int, long))]
-            peernames = [x for x in peer_id_or_peername_list if isinstance(x, StringTypes)]
-           sql += " AND (False"
-           if peer_ids:
-               sql += " OR peer_id in (%s)"% ", ".join([str(i) for i in peer_ids])
-           if peernames:
-               sql += " OR peername in (%s)"% ". ".join(api.db.quote(peernames)).lower()
-           sql += ")"
-
-       rows = self.api.db.selectall(sql)
+    def __init__ (self, api, peer_filter = None, columns = None):
+        Table.__init__(self, api, Peer, columns)
 
-       for row in rows:
-           self[row['peer_id']] = peer = Peer(api,row)
-            for aggregate in ['foreign_node_ids']:
-                if not peer.has_key(aggregate) or peer[aggregate] is None:
-                    peer[aggregate] = []
-                else:
-                    peer[aggregate] = map(int, peer[aggregate].split(','))
+       sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \
+              ", ".join(self.columns)
 
+        if peer_filter is not None:
+            if isinstance(peer_filter, (list, tuple, set)):
+                # Separate the list into integers and strings
+                ints = filter(lambda x: isinstance(x, (int, long)), peer_filter)
+                strs = filter(lambda x: isinstance(x, StringTypes), peer_filter)
+                peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs})
+                sql += " AND (%s)" % peer_filter.sql(api, "OR")
+            elif isinstance(peer_filter, dict):
+                peer_filter = Filter(Peer.fields, peer_filter)
+                sql += " AND (%s)" % peer_filter.sql(api, "AND")
 
+       self.selectall(sql)