in sapp/pipeline/database_saver.py [0:0]
def _save(self) -> RunSummary:
"""Saves bulk saver's info into the databases in bulk."""
assert self.summary["run"] is not None, "Must have called process before"
trace_frames = self.bulk_saver.get_items_to_add(TraceFrame)
log.info(
"Saving %d issues, %d trace frames, %d trace annotations, %d trace frame leaf assocs",
len(self.bulk_saver.get_items_to_add(Issue)),
len(self.bulk_saver.get_items_to_add(TraceFrame)),
len(self.bulk_saver.get_items_to_add(TraceFrameAnnotation)),
len(self.bulk_saver.get_items_to_add(TraceFrameLeafAssoc)),
)
num_pre = 0
num_post = 0
for frame in trace_frames:
if frame.kind == TraceKind.PRECONDITION:
num_pre += 1
elif frame.kind == TraceKind.POSTCONDITION:
num_post += 1
log.info(
"Within trace frames: %d preconditions, %d postconditions",
num_pre,
num_post,
)
if not self.dry_run:
with self.database.make_session() as session:
pk_gen = self.primary_key_generator.reserve(session, [Run])
self.summary["run"].id.resolve(id=pk_gen.get(Run), is_new=True)
session.add(self.summary["run"])
meta_run_identifier = self.summary.get("meta_run_identifier")
if meta_run_identifier is not None:
session.add(
MetaRunToRunAssoc(
meta_run_id=meta_run_identifier,
run_id=self.summary["run"].id,
run_label=self.summary.get("meta_run_child_label", None),
)
)
session.commit()
run_id = self.summary["run"].id.resolved()
self.summary["run"] = None # Invalidate it
self.bulk_saver.save_all(self.database)
# Now that the run is finished, fetch it from the DB again and set its
# status to FINISHED.
with self.database.make_session() as session:
run = session.query(self.RUN_MODEL).filter_by(id=run_id).one()
run.status = RunStatus.FINISHED
session.add(run)
session.commit()
run_summary = run.get_summary()
else:
run_summary = self._get_dry_run_summary()
# pyre-fixme[16]: `RunSummary` has no attribute `num_invisible_issues`.
run_summary.num_invisible_issues = 0
run_summary.num_missing_preconditions = len(
self.summary["missing_traces"][TraceKind.precondition]
)
run_summary.num_missing_postconditions = len(
self.summary["missing_traces"][TraceKind.postcondition]
)
return run_summary