def _save()

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