| 450 | return data |
| 451 | |
| 452 | def get_bytes_stream(self, start=0, end=None, chunk_size=64 * 1024): |
| 453 | def _read_with_offset(): |
| 454 | offset = start |
| 455 | while True: |
| 456 | result = select_one( |
| 457 | "SELECT lo_get(%s::oid, %s, %s) as chunk", |
| 458 | [self.loid, offset, end - offset if end and (end - offset) < chunk_size else chunk_size], |
| 459 | ) |
| 460 | chunk = result["chunk"] if result else None |
| 461 | if not chunk: |
| 462 | break |
| 463 | yield chunk |
| 464 | offset += len(chunk) |
| 465 | if len(chunk) < chunk_size: |
| 466 | break |
| 467 | if end and offset > end: |
| 468 | break |
| 469 | |
| 470 | return _read_with_offset() |
| 471 | |
| 472 | |
| 473 | @receiver(pre_delete, sender=File) |