def attrs(self, four_part_name): """ """ fpn = ccm_utils.parse_fpn(four_part_name, self.delim()) # attributes from attrib-table query = \ """ SELECT attrib.name, attrib.textval FROM compver INNER JOIN attrib ON (compver.id = attrib.is_attr_of) WHERE compver.name = ? AND compver.version = ? AND compver.cvtype = ? AND compver.subsystem = ?; """ args = (fpn['name'], fpn['version'], fpn['type'], fpn['instance']) cursor = self._db_connection.cursor() cursor.execute(query, args) attrib_attrs = { row[0]: ccm_utils.type_from_text(row[1]) for row in cursor.fetchall() } # attributes from compver-table compver_attrs = _COMPVER_ATTR_NAMES.copy() attrs = {} attrs.update(attrib_attrs) attrs.update(compver_attrs) return attrs
def object_by_fpn(self, four_part_name): fpn = four_part_name if isinstance(four_part_name, dict) else ccm_utils.parse_fpn( four_part_name, self.delim) sql_query = \ "SELECT cv.id, cv.cvtype " + \ "FROM compver cv " + \ "WHERE cv.name = ? AND cv.version = ? AND cv.cvtype = ? and cv.subsystem = ?" rows = self._db.query_sql(sql_query, fpn['name'], fpn['version'], fpn['type'], fpn['instance']) if not rows: return None row = rows[0] cv_id = row[0] cv_type = row[1] return self._construct_object(cv_id, cv_type)
def contents_dir(self, four_part_name): fpn = ccm_utils.parse_fpn(four_part_name, self.delim()) if fpn['type'] != 'dir': raise CcmError('Object is not a directory') sql_query = \ ("SELECT bsite.info " + \ "FROM bsite " + \ "WHERE bsite.is_bsite_of = (" + \ " SELECT compver.id " + \ " FROM compver " + \ " WHERE compver.name = '{name}' AND compver.version = '{version}' AND compver.cvtype = '{type}' AND compver.subsystem = '{instance}' " + \ ") AND bsite.info NOT LIKE '%/dir/%' " + \ "ORDER BY bsite.info").format(**fpn) cursor = self._db_connection.cursor() cursor.execute(sql_query) return [row[0] for row in cursor.fetchall()]
def finduse_task(self, four_part_name): fpn = ccm_utils.parse_fpn(four_part_name, self.delim()) names = ['objectname', 'status'] # find all task_in_baseline ? # find all task_in_folder ? XXX TODO: is this correct? sql_query = \ ("SELECT cv2.name || '" + self.delim() + "' || cv2.version || ':' || cv2.cvtype || ':' || cv2.subsystem AS objectname, ccm_status(a1.textval) AS status " + \ "FROM compver cv1 INNER JOIN relate r1 ON (cv1.id = r1.to_cv) INNER JOIN relate r2 ON (r1.from_cv = r2.to_cv) INNER JOIN compver cv2 ON (r2.from_cv = cv2.id) LEFT JOIN attrib a1 ON (cv2.id = a1.is_attr_of) " + \ "WHERE cv1.name = '{name}' AND cv1.version = '{version}' AND cv1.cvtype = '{type}' AND cv1.subsystem = '{instance}' AND " + \ "r1.name = 'task_in_folder' AND " + \ "r2.name = 'folder_in_rp' AND "+ \ "a1.name = 'status_log'").format(**fpn) # find all dirty_task_in_baseline ? cursor = self._db_connection.cursor() cursor.execute(sql_query) return [dict(zip(names, row)) for row in cursor.fetchall()]
def attr(self, four_part_name, attr_name): """ """ # attributes from attrib-table fpn = ccm_utils.parse_fpn(four_part_name, self.delim()) query = \ """ SELECT attrib.textval FROM compver INNER JOIN attrib ON (compver.id = attrib.is_attr_of) WHERE compver.name = ? AND compver.version = ? AND compver.cvtype = ? AND compver.subsystem = ? AND attrib.name = ?; """ args = (fpn['name'], fpn['version'], fpn['type'], fpn['instance'], attr_name) cursor = self._db_connection.cursor() cursor.execute(query, args) result = cursor.fetchone() if result: return ccm_utils.deserialize_textval(result[0]) # attributes from compver-table query = "SELECT " + ", ".join(_COMPVER_ATTR_NAMES.keys()) + \ """ FROM compver WHERE compver.name = ? AND compver.version = ? AND compver.cvtype = ? AND compver.subsystem = ?; """ args = (fpn['name'], fpn['version'], fpn['type'], fpn['instance']) cursor = self._db_connection.cursor() cursor.execute(query, args) result = cursor.fetchone() if result: compver_attrs = dict(zip(_COMPVER_ATTR_NAMES.keys(), result)) return compver_attrs.get(attr_name) return None
def visit_function_call(self, node, visited_nodes): function = node.children[0].text.rstrip() args = [ n.text.rstrip()[1:-1] for n in descendants_with_expr_name(node, 'string') ] if function == 'is_successor_of': fpn = ccm_utils.parse_fpn(args[0], self._delim) self.sql_query += ("cv.id = (" + \ "SELECT relate.to_cv " + \ "FROM compver INNER JOIN relate ON (compver.id = relate.from_cv) " + \ "WHERE compver.name = '{name}' AND compver.version = '{version}' AND compver.cvtype = '{type}' AND compver.subsystem = '{instance}' AND " + \ "relate.name = 'successor'" + \ ")").format(**fpn) elif function == 'is_predecessor_of': fpn = ccm_utils.parse_fpn(args[0], self._delim) self.sql_query += ("cv.id = (" + \ "SELECT relate.from_cv " + \ "FROM compver INNER JOIN relate ON (compver.id = relate.to_cv) " + \ "WHERE compver.name = '{name}' AND compver.version = '{version}' AND compver.cvtype = '{type}' AND compver.subsystem = '{instance}' AND " + \ "relate.name = 'successor'" + \ ")").format(**fpn) elif function == 'is_child_of': fpn = ccm_utils.parse_fpn(args[0], self._delim) project_fpn = ccm_utils.parse_fpn(args[1], self._delim) self.sql_query += ("cv.id IN (" + \ "SELECT bind.has_child " + \ "FROM bind INNER JOIN compver cv1 ON (bind.has_asm = cv1.id) INNER JOIN compver cv2 on (bind.has_parent = cv2.id) " + \ "WHERE cv1.name = '{0[name]}' AND cv1.version = '{0[version]}' AND cv1.cvtype = '{0[type]}' AND cv1.subsystem = '{0[instance]}' AND " + \ "cv2.name = '{1[name]}' AND cv2.version = '{1[version]}' AND cv2.cvtype = '{1[type]}' AND cv2.subsystem = '{1[instance]}'" + \ ")").format(project_fpn, fpn) elif function == 'is_member_of': fpn = ccm_utils.parse_fpn(args[0], self._delim) self.sql_query += ("cv.id IN (" + \ "SELECT cv2.id " + \ "FROM compver cv1 INNER JOIN bind ON (cv1.id = bind.has_asm) INNER JOIN compver cv2 ON (bind.has_child = cv2.id) " + \ "WHERE cv1.name = '{name}' AND cv1.version = '{version}' AND cv1.cvtype = '{type}' AND cv1.subsystem = '{instance}'" + \ ")").format(**fpn) elif function == 'has_member': fpn = ccm_utils.parse_fpn(args[0], self._delim) self.sql_query += ("cv.id IN (" + \ "SELECT cv1.id " + \ "FROM bind INNER JOIN compver cv1 ON (bind.has_asm = cv1.id) INNER JOIN compver cv2 ON (bind.has_child = cv2.id) " + \ "WHERE cv2.name = '{name}' AND cv2.version = '{version}' AND cv2.cvtype = '{type}' AND cv2.subsystem = '{instance}'" + \ ")").format(**fpn) elif function == 'is_baseline_project_of': fpn = ccm_utils.parse_fpn(args[0], self._delim) self.sql_query += ("cv.id = (" + \ "SELECT relate.to_cv " + \ "FROM compver INNER JOIN relate ON (compver.id = relate.from_cv) " + \ "WHERE compver.name = '{name}' AND compver.version = '{version}' AND compver.cvtype = '{type}' AND compver.subsystem = '{instance}' AND " + \ "relate.name = 'baseline_project'" + \ ")").format(**fpn) elif function == 'has_baseline_project': fpn = ccm_utils.parse_fpn(args[0], self._delim) self.sql_query += ("cv.id IN (" + \ "SELECT relate.from_cv " + \ "FROM relate INNER JOIN compver ON (relate.to_cv = compver.id) " + \ "WHERE compver.name = '{name}' AND compver.version = '{version}' AND compver.cvtype = '{type}' AND compver.subsystem = '{instance}' AND " + \ "relate.name = 'baseline_project'" ")").format(**fpn) else: raise NotImplementedError() return node