diff --git a/Userland/Utilities/sql.cpp b/Userland/Utilities/sql.cpp index c9f759cb0c..309e685288 100644 --- a/Userland/Utilities/sql.cpp +++ b/Userland/Utilities/sql.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -170,30 +171,42 @@ private: AK::RefPtr m_sql_client { nullptr }; int m_connection_id { 0 }; Core::EventLoop m_loop; - RefPtr m_input_file { nullptr }; + OwnPtr m_input_file { nullptr }; bool m_quit_when_files_read { false }; Vector m_input_file_chain {}; + Array m_buffer {}; Optional get_line() { if (!m_input_file && !m_input_file_chain.is_empty()) { auto file_name = m_input_file_chain.take_first(); - auto file_or_error = Core::File::open(file_name, Core::OpenMode::ReadOnly); + auto file_or_error = Core::Stream::File::open(file_name, Core::Stream::OpenMode::Read); if (file_or_error.is_error()) { warnln("Input file {} could not be opened: {}", file_name, file_or_error.error()); return {}; } - m_input_file = file_or_error.value(); + + auto buffered_file_or_error = Core::Stream::BufferedFile::create(file_or_error.release_value()); + if (buffered_file_or_error.is_error()) { + warnln("Input file {} could not be buffered: {}", file_name, buffered_file_or_error.error()); + return {}; + } + + m_input_file = buffered_file_or_error.release_value(); } if (m_input_file) { - auto line = m_input_file->read_line(); - if (m_input_file->eof()) { + auto line = m_input_file->read_line(m_buffer); + if (line.is_error()) { + warnln("Failed to read line: {}", line.error()); + return {}; + } + if (m_input_file->is_eof()) { m_input_file->close(); m_input_file = nullptr; if (m_quit_when_files_read && m_input_file_chain.is_empty()) return {}; } - return line; + return line.release_value(); // If the last file is exhausted but m_quit_when_files_read is false // we fall through to the standard reading from the editor behaviour }