| 1 | #include "duckdb/common/progress_bar/display/terminal_progress_bar_display.hpp" | 
|---|---|
| 2 | #include "duckdb/common/printer.hpp" | 
| 3 | #include "duckdb/common/to_string.hpp" | 
| 4 | |
| 5 | namespace duckdb { | 
| 6 | |
| 7 | void TerminalProgressBarDisplay::PrintProgressInternal(int percentage) { | 
| 8 | if (percentage > 100) { | 
| 9 | percentage = 100; | 
| 10 | } | 
| 11 | if (percentage < 0) { | 
| 12 | percentage = 0; | 
| 13 | } | 
| 14 | string result; | 
| 15 | // we divide the number of blocks by the percentage | 
| 16 | // 0% = 0 | 
| 17 | // 100% = PROGRESS_BAR_WIDTH | 
| 18 | // the percentage determines how many blocks we need to draw | 
| 19 | double blocks_to_draw = PROGRESS_BAR_WIDTH * (percentage / 100.0); | 
| 20 | // because of the power of unicode, we can also draw partial blocks | 
| 21 | |
| 22 | // render the percentage with some padding to ensure everything stays nicely aligned | 
| 23 | result = "\r"; | 
| 24 | if (percentage < 100) { | 
| 25 | result += " "; | 
| 26 | } | 
| 27 | if (percentage < 10) { | 
| 28 | result += " "; | 
| 29 | } | 
| 30 | result += to_string(val: percentage) + "%"; | 
| 31 | result += " "; | 
| 32 | result += PROGRESS_START; | 
| 33 | idx_t i; | 
| 34 | for (i = 0; i < idx_t(blocks_to_draw); i++) { | 
| 35 | result += PROGRESS_BLOCK; | 
| 36 | } | 
| 37 | if (i < PROGRESS_BAR_WIDTH) { | 
| 38 | // print a partial block based on the percentage of the progress bar remaining | 
| 39 | idx_t index = idx_t((blocks_to_draw - idx_t(blocks_to_draw)) * PARTIAL_BLOCK_COUNT); | 
| 40 | if (index >= PARTIAL_BLOCK_COUNT) { | 
| 41 | index = PARTIAL_BLOCK_COUNT - 1; | 
| 42 | } | 
| 43 | result += PROGRESS_PARTIAL[index]; | 
| 44 | i++; | 
| 45 | } | 
| 46 | for (; i < PROGRESS_BAR_WIDTH; i++) { | 
| 47 | result += PROGRESS_EMPTY; | 
| 48 | } | 
| 49 | result += PROGRESS_END; | 
| 50 | result += " "; | 
| 51 | |
| 52 | Printer::RawPrint(stream: OutputStream::STREAM_STDOUT, str: result); | 
| 53 | } | 
| 54 | |
| 55 | void TerminalProgressBarDisplay::Update(double percentage) { | 
| 56 | PrintProgressInternal(percentage); | 
| 57 | Printer::Flush(stream: OutputStream::STREAM_STDOUT); | 
| 58 | } | 
| 59 | |
| 60 | void TerminalProgressBarDisplay::Finish() { | 
| 61 | PrintProgressInternal(percentage: 100); | 
| 62 | Printer::RawPrint(stream: OutputStream::STREAM_STDOUT, str: "\n"); | 
| 63 | Printer::Flush(stream: OutputStream::STREAM_STDOUT); | 
| 64 | } | 
| 65 | |
| 66 | } // namespace duckdb | 
| 67 | 
