def get_sample(self, md5):
        """Get the sample from the data store.

        This method first fetches the data from datastore, then cleans it for serialization
        and then updates it with 'raw_bytes' item.
        
        Args:
            md5: The md5 digest of the sample to be fetched from datastore.

        Returns:
            The sample dictionary or None
        """

        # Support 'short' md5s but don't waste performance if the full md5 is provided
        if len(md5) < 32:
            md5 = self.get_full_md5(md5, self.sample_collection)

        # Grab the sample
        sample_info = self.database[self.sample_collection].find_one({'md5': md5})
        if not sample_info:
            return None

        # Get the raw bytes from GridFS (note: this could fail)
        try:
            grid_fs_id = sample_info['__grid_fs']
            sample_info = self.clean_for_serialization(sample_info)
            sample_info.update({'raw_bytes':self.gridfs_handle.get(grid_fs_id).read()})
            return sample_info
        except gridfs.errors.CorruptGridFile:
            # If we don't have the gridfs files, delete the entry from samples
            self.database[self.sample_collection].update({'md5': md5}, {'md5': None})
            return None
dataset/ETHPy150Open SuperCowPowers/workbench/workbench/server/data_store.py/DataStore.get_sample/original