<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def dicom2db(file_path, file_type, is_copy, step_id, db_conn, sid_by_patient=False, pid_in_vid=False, visit_in_path=False, rep_in_path=False):
 """Extract some meta-data from a DICOM file and store in a DB. Arguments: :param file_path: File path. :param file_type: File type (should be 'DICOM'). :param is_copy: Indicate if this file is a copy. :param step_id: Step ID :param db_conn: Database connection. :param sid_by_patient: Rarely, a data set might use study IDs which are unique by patient (not for the whole study). E.g.: LREN data. In such a case, you have to enable this flag. This will use PatientID + StudyID as a session ID. :param pid_in_vid: Rarely, a data set might mix patient IDs and visit IDs. E.g. : LREN data. In such a case, you to enable this flag. This will try to split PatientID into VisitID and PatientID. :param visit_in_path: Enable this flag to get the visit ID from the folder hierarchy instead of DICOM meta-data (e.g. can be useful for PPMI). :param rep_in_path: Enable this flag to get the repetition ID from the folder hierarchy instead of DICOM meta-data (e.g. can be useful for PPMI). :return: A dictionary containing the following IDs : participant_id, visit_id, session_id, sequence_type_id, sequence_id, repetition_id, file_id. """

    global conn
    conn = db_conn

    tags = dict()
    logging.info("Extracting DICOM headers from '%s'" % file_path)

    try:
        dcm = dicom.read_file(file_path)
        dataset = db_conn.get_dataset(step_id)

        tags['participant_id'] = _extract_participant(dcm, dataset, pid_in_vid)
        if visit_in_path:
            tags['visit_id'] = _extract_visit_from_path(
                dcm, file_path, pid_in_vid, sid_by_patient, dataset, tags['participant_id'])
        else:
            tags['visit_id'] = _extract_visit(dcm, dataset, tags['participant_id'], sid_by_patient, pid_in_vid)
        tags['session_id'] = _extract_session(dcm, tags['visit_id'])
        tags['sequence_type_id'] = _extract_sequence_type(dcm)
        tags['sequence_id'] = _extract_sequence(tags['session_id'], tags['sequence_type_id'])
        if rep_in_path:
            tags['repetition_id'] = _extract_repetition_from_path(dcm, file_path, tags['sequence_id'])
        else:
            tags['repetition_id'] = _extract_repetition(dcm, tags['sequence_id'])
        tags['file_id'] = extract_dicom(file_path, file_type, is_copy, tags['repetition_id'], step_id)
    except InvalidDicomError:
        logging.warning("%s is not a DICOM file !" % step_id)
    except IntegrityError:
        # TODO: properly deal with concurrency problems
        logging.warning("A problem occurred with the DB ! A rollback will be performed...")
        conn.db_session.rollback()
    return tags