Format size in bytes as human-readable string using PostgreSQL's algorithm Uses binary prefixes: 1 kB = 1024 bytes, 1 MB = 1024² bytes, etc. Based on PostgreSQL source code in src/backend/utils/adt/dbsize.c
(mut size: i64)
| 471 | /// Uses binary prefixes: 1 kB = 1024 bytes, 1 MB = 1024² bytes, etc. |
| 472 | /// Based on PostgreSQL source code in src/backend/utils/adt/dbsize.c |
| 473 | fn format_size_pretty(mut size: i64) -> String { |
| 474 | let abs_size = size.unsigned_abs(); |
| 475 | |
| 476 | // PostgreSQL unit definitions |
| 477 | const BYTES_LIMIT: u64 = 10 * 1024; // 10240 bytes |
| 478 | const UNIT_LIMIT: u64 = 10 * 1024; // 10240 (for kB, MB, GB, TB, PB) |
| 479 | |
| 480 | // Check if we should display as bytes |
| 481 | if abs_size < BYTES_LIMIT { |
| 482 | return format!("{} bytes", size); |
| 483 | } |
| 484 | |
| 485 | // Convert to kB and check limit |
| 486 | size = (size + 512) / 1024; // Half-rounded division |
| 487 | let abs_size_kb = size.unsigned_abs(); |
| 488 | if abs_size_kb < UNIT_LIMIT { |
| 489 | return format!("{} kB", size); |
| 490 | } |
| 491 | |
| 492 | // Convert to MB and check limit |
| 493 | size = (size + 512) / 1024; // Half-rounded division |
| 494 | let abs_size_mb = size.unsigned_abs(); |
| 495 | if abs_size_mb < UNIT_LIMIT { |
| 496 | return format!("{} MB", size); |
| 497 | } |
| 498 | |
| 499 | // Convert to GB and check limit |
| 500 | size = (size + 512) / 1024; // Half-rounded division |
| 501 | let abs_size_gb = size.unsigned_abs(); |
| 502 | if abs_size_gb < UNIT_LIMIT { |
| 503 | return format!("{} GB", size); |
| 504 | } |
| 505 | |
| 506 | // Convert to TB and check limit |
| 507 | size = (size + 512) / 1024; // Half-rounded division |
| 508 | let abs_size_tb = size.unsigned_abs(); |
| 509 | if abs_size_tb < UNIT_LIMIT { |
| 510 | return format!("{} TB", size); |
| 511 | } |
| 512 | |
| 513 | // Convert to PB (final unit) |
| 514 | size = (size + 512) / 1024; // Half-rounded division |
| 515 | format!("{} PB", size) |
| 516 | } |
| 517 | |
| 518 | #[cfg(test)] |
| 519 | mod tests { |
no outgoing calls
no test coverage detected