# Buggy code
def on_got_metainfo(metainfo):
    if not isinstance(metainfo, dict) or "info" not in metainfo:
        self._logger.warning("Received metainfo is not a valid dictionary")
        request.setResponseCode(http.INTERNAL_SERVER_ERROR)
        request.write(json.twisted_dumps({"error": "invalid response"}))
        self.finish_request(request)
        return

    # Add the torrent to GigaChannel as a free-for-all entry, so others can search it
    self.session.lm.mds.TorrentMetadata.add_ffa_from_tdef(
        TorrentDef.load_from_dict(metainfo)
    )

    # TODO(Martijn): store the stuff in a database!!!
    # TODO(Vadim): this means cache the downloaded torrent in a binary storage, like LevelDB
    infohash = hashlib.sha1(bencode(metainfo["info"])).digest()

    # Check if the torrent is already in the downloads
    metainfo["download_exists"] = infohash in self.session.lm.downloads
    encoded_metainfo = hexlify(json.dumps(metainfo, ensure_ascii=False))

    request.write(json.twisted_dumps({"metainfo": encoded_metainfo}))
    self.finish_request(request)


# Traceback (RuntimeError)
Traceback (most recent call last):
File "TriblerGUI\event_request_manager.py", line 114, in on_read_data
RuntimeError: [Failure instance: Traceback: <class 'pony.orm.core.TransactionIntegrityError'>: Object TorrentMetadata[new:47] cannot be stored in the database. IntegrityError: UNIQUE constraint failed: ChannelNode.public_key, ChannelNode.id_
Tribler\Core\Modules\restapi\torrentinfo_endpoint.py:135:render_GET
Tribler\Core\Modules\restapi\torrentinfo_endpoint.py:109:on_file
lib\site-packages\twisted\internet\defer.py:459:callback
lib\site-packages\twisted\internet\defer.py:567:_startRunCallbacks
--- <exception caught here> ---
lib\site-packages\twisted\internet\defer.py:653:_runCallbacks
Tribler\Core\Modules\restapi\torrentinfo_endpoint.py:70:on_got_metainfo
<auto generated wrapper of add_ffa_from_tdef() function>:2:add_ffa_from_tdef
lib\site-packages\pony\orm\core.py:543:new_func
lib\site-packages\pony\orm\core.py:528:new_func
Tribler\Core\Modules\MetadataStore\OrmBindings\torrent_metadata.py:98:add_ffa_from_tdef
Tribler\Core\Modules\MetadataStore\OrmBindings\channel_node.py:213:from_dict
Tribler\Core\Modules\MetadataStore\OrmBindings\torrent_metadata.py:77:__init__
Tribler\Core\Modules\MetadataStore\OrmBindings\torrent_metadata.py:82:add_tracker
lib\site-packages\pony\orm\core.py:3950:get
lib\site-packages\pony\orm\core.py:4053:_find_one_
lib\site-packages\pony\orm\core.py:4112:_find_in_db_
lib\site-packages\pony\orm\core.py:934:_exec_sql
lib\site-packages\pony\orm\core.py:1797:prepare_connection_for_query_execution
lib\site-packages\pony\orm\core.py:1883:flush
lib\site-packages\pony\orm\core.py:5357:_save_
lib\site-packages\pony\orm\core.py:5201:_save_created_
lib\site-packages\pony\utils\utils.py:106:throw
]

# Fixed code
def on_got_metainfo(metainfo):
    if not isinstance(metainfo, dict) or "info" not in metainfo:
        self._logger.warning("Received metainfo is not a valid dictionary")
        request.setResponseCode(http.INTERNAL_SERVER_ERROR)
        request.write(json.twisted_dumps({"error": "invalid response"}))
        self.finish_request(request)
        return

    # Add the torrent to GigaChannel as a free-for-all entry, so others can search it
    self.session.lm.mds.TorrentMetadata.add_ffa_from_dict(
        tdef_to_metadata_dict(TorrentDef.load_from_dict(metainfo))
    )

    # TODO(Martijn): store the stuff in a database!!!
    # TODO(Vadim): this means cache the downloaded torrent in a binary storage, like LevelDB
    infohash = hashlib.sha1(bencode(metainfo["info"])).digest()

    # Check if the torrent is already in the downloads
    metainfo["download_exists"] = infohash in self.session.lm.downloads
    encoded_metainfo = hexlify(json.dumps(metainfo, ensure_ascii=False))

    request.write(json.twisted_dumps({"metainfo": encoded_metainfo}))
    self.finish_request(request)