[llvm-commits] [zorg] r146946 - in /zorg/trunk/lnt/lnt/server/db: testsuitedb.py v4db.py

Daniel Dunbar daniel at zuster.org
Mon Dec 19 17:14:27 PST 2011


Author: ddunbar
Date: Mon Dec 19 19:14:26 2011
New Revision: 146946

URL: http://llvm.org/viewvc/llvm-project?rev=146946&view=rev
Log:
[lnt/v0.4] lnt.server.db.testsuitedb: Start implementing import functionality (just machine records, currently).

Modified:
    zorg/trunk/lnt/lnt/server/db/testsuitedb.py
    zorg/trunk/lnt/lnt/server/db/v4db.py

Modified: zorg/trunk/lnt/lnt/server/db/testsuitedb.py
URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/lnt/lnt/server/db/testsuitedb.py?rev=146946&r1=146945&r2=146946&view=diff
==============================================================================
--- zorg/trunk/lnt/lnt/server/db/testsuitedb.py (original)
+++ zorg/trunk/lnt/lnt/server/db/testsuitedb.py Mon Dec 19 19:14:26 2011
@@ -5,6 +5,8 @@
 suite metadata, so we only create the classes at runtime.
 """
 
+import json
+
 import sqlalchemy
 from sqlalchemy import *
 
@@ -213,3 +215,62 @@
         self.add = self.v4db.add
         self.commit = self.v4db.commit
         self.query = self.v4db.query
+
+    def _getOrCreateMachine(self, machine_data):
+        """
+        _getOrCreateMachine(data) -> Machine
+
+        Add or create (and insert) a Machine record from the given machine data
+        (as recorded by the test interchange format).
+        """
+
+        # Convert the machine data into a machine record. We construct the query
+        # to look for any existing machine at the same time as we build up the
+        # record to possibly add.
+        #
+        # FIXME: This feels inelegant, can't SA help us out here?
+        query = self.query(self.Machine).\
+            filter(self.Machine.name == machine_data['Name'])
+        machine = self.Machine(machine_data['Name'])
+        machine_parameters = machine_data['Info'].copy()
+
+        # First, extract all of the specified machine fields.
+        for item in self.test_suite.machine_fields:
+            if item.info_key in machine_parameters:
+                value = machine_parameters.pop(item.info_key)
+            else:
+                # For now, insert empty values for any missing fields. We don't
+                # want to insert NULLs, so we should probably allow the test
+                # suite to define defaults.
+                value = ''
+
+            # FIXME: Avoid setattr.
+            query = query.filter(item.column == value)
+            setattr(machine, item.name, value)
+
+        # Convert any remaining machine_parameters into a JSON encoded blob. We
+        # encode this as an array to avoid a potential ambiguity on the key
+        # ordering.
+        machine.parameters = json.dumps(sorted(machine_parameters.items()))
+        query = query.filter(self.Machine.parameters == machine.parameters)
+
+        # Execute the query to see if we already have this machine.
+        try:
+            return query.one()
+        except sqlalchemy.orm.exc.NoResultFound:
+            # If not, add the machine.
+            self.add(machine)
+
+            return machine
+
+    def importDataFromDict(self, data):
+        # Construct the machine entry.
+        machine = self._getOrCreateMachine(data['Machine'])
+
+        self.commit()
+
+        import sys
+        print >>sys.stderr,"added machine %r" % machine.id
+
+        print self.test_suite.machine_fields
+        raise NotImplementedError

Modified: zorg/trunk/lnt/lnt/server/db/v4db.py
URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/lnt/lnt/server/db/v4db.py?rev=146946&r1=146945&r2=146946&view=diff
==============================================================================
--- zorg/trunk/lnt/lnt/server/db/v4db.py (original)
+++ zorg/trunk/lnt/lnt/server/db/v4db.py Mon Dec 19 19:14:26 2011
@@ -33,6 +33,11 @@
             self._cache[name] = ts = testsuitedb.TestSuiteDB(self.v4db, ts)
             return ts
 
+        def get(self, name, default = None):
+            if name in self:
+                return self[name]
+            return default
+
         def keys(self):
             return iter(self)
 
@@ -96,4 +101,14 @@
                     for ts in self.testsuite.values()])
 
     def importDataFromDict(self, data):
-        raise NotImplementedError
+        # Select the database to import into.
+        #
+        # FIXME: Promote this to a top-level field in the data.
+        tag = data['Run']['Info'].get('tag')
+        db_name = { 'nts' : 'nt' }.get(tag)
+        if db_name is None:
+            raise ValueError,"unknown database target from tag %r" % (
+                tag,)
+
+        db = self.testsuite.get(db_name)
+        return db.importDataFromDict(data)





More information about the llvm-commits mailing list