13 #ifndef PQXX_H_LARGEOBJECT 14 #define PQXX_H_LARGEOBJECT 16 #include "pqxx/compiler-public.hxx" 17 #include "pqxx/internal/compiler-internal-pre.hxx" 21 #include "pqxx/dbtransaction.hxx" 74 [[nodiscard]] oid
id() const noexcept {
return m_id; }
88 return m_id == other.m_id;
94 return m_id != other.m_id;
100 return m_id <= other.m_id;
106 return m_id >= other.m_id;
112 return m_id < other.m_id;
118 return m_id > other.m_id;
137 PQXX_PURE
static internal::pq::PGconn *
140 PQXX_PRIVATE std::string reason(
connection const &,
int err)
const;
166 static constexpr
auto default_mode{std::ios::in | std::ios::out |
238 void write(
char const buf[],
size_t len);
244 void write(std::string_view buf) {
write(buf.data(), buf.size()); }
298 off_type cwrite(
char const buf[],
size_t len) noexcept;
307 off_type cread(
char buf[],
size_t len) noexcept;
314 [[nodiscard]]
pos_type ctell()
const noexcept;
321 void process_notice(std::string
const &) noexcept;
327 using largeobject::operator==;
328 using largeobject::operator!=;
329 using largeobject::operator<;
330 using largeobject::operator<=;
331 using largeobject::operator>;
332 using largeobject::operator>=;
339 PQXX_PRIVATE std::string reason(
int err)
const;
340 internal::pq::PGconn *raw_connection()
const 345 PQXX_PRIVATE
void open(
openmode mode);
346 void close() noexcept;
360 template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
375 static constexpr
auto default_mode{std::ios::in | std::ios::out |
380 size_type buf_size = 512) :
391 size_type buf_size = 512) :
413 this->setg(this->eback(), this->eback(), this->egptr());
414 return overflow(eof());
426 return adjust_eof(newpos);
431 auto *
const pp{this->pptr()};
434 auto *
const pb{this->pbase()};
440 adjust_eof(m_obj.cwrite(pb, static_cast<std::size_t>(pp - pb)))};
441 if constexpr (std::is_arithmetic_v<decltype(out)>)
446 this->setp(m_p, m_p + m_bufsize);
451 *this->pptr() =
static_cast<char_type>(ch);
461 if (this->gptr() ==
nullptr)
463 auto *
const eb{this->eback()};
464 auto const res{adjust_eof(
465 m_obj.cread(this->eback(),
static_cast<std::size_t
>(m_bufsize)))};
467 eb, eb, eb + (res == eof() ? 0 : static_cast<std::size_t>(res)));
468 return (res == eof() or res == 0) ? eof() : traits_type::to_int_type(*eb);
473 static int_type eof() {
return traits_type::eof(); }
476 template<
typename INTYPE>
static std::streampos adjust_eof(INTYPE pos)
478 bool const at_eof{pos == -1};
479 if constexpr (std::is_arithmetic_v<std::streampos>)
482 (at_eof ? eof() : pos),
"large object seek");
486 return std::streampos(at_eof ? eof() : pos);
492 if ((mode & std::ios::in) != 0)
494 m_g =
new char_type[unsigned(m_bufsize)];
495 this->setg(m_g, m_g, m_g);
497 if ((mode & std::ios::out) != 0)
499 m_p =
new char_type[unsigned(m_bufsize)];
500 this->setp(m_p, m_p + m_bufsize);
504 size_type
const m_bufsize;
521 template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
524 using super = std::basic_istream<CHAR, TRAITS>;
542 m_buf{t, o, std::ios::in | std::ios::binary, buf_size}
556 m_buf{t, o, std::ios::in | std::ios::binary, buf_size}
577 template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
580 using super = std::basic_ostream<CHAR, TRAITS>;
598 m_buf{t, o, std::ios::out | std::ios::binary, buf_size}
612 m_buf{t, o, std::ios::out | std::ios::binary, buf_size}
624 catch (std::exception
const &e)
626 m_buf.process_notice(e.what());
646 template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
649 using super = std::basic_iostream<CHAR, TRAITS>;
667 m_buf{t, o, std::ios::in | std::ios::out | std::ios::binary,
682 m_buf{t, o, std::ios::in | std::ios::out | std::ios::binary,
695 catch (std::exception
const &e)
697 m_buf.process_notice(e.what());
708 #include "pqxx/internal/compiler-internal-post.hxx" typename traits_type::int_type int_type
Definition: largeobject.hxx:654
CHAR char_type
Definition: largeobject.hxx:583
~basic_olostream()
Definition: largeobject.hxx:617
typename traits_type::off_type off_type
Definition: largeobject.hxx:370
TRAITS traits_type
Definition: largeobject.hxx:584
basic_lostream(dbtransaction &t, largeobject o, largeobject::size_type buf_size=512)
Create a basic_lostream.
Definition: largeobject.hxx:664
TRAITS traits_type
Definition: largeobject.hxx:367
TRAITS traits_type
Definition: largeobject.hxx:528
size_type off_type
Definition: largeobject.hxx:152
CHAR char_type
Definition: largeobject.hxx:366
bool operator!=(largeobject const &other) const
Compare object identities.
Definition: largeobject.hxx:92
virtual pos_type seekpos(pos_type pos, openmode) override
Definition: largeobject.hxx:422
int64_t large_object_size_type
Number of bytes in a large object.
Definition: types.hxx:33
basic_olostream(dbtransaction &t, oid o, largeobject::size_type buf_size=512)
Create a basic_olostream.
Definition: largeobject.hxx:609
CHAR char_type
Definition: largeobject.hxx:652
basic_ilostream(dbtransaction &t, oid o, largeobject::size_type buf_size=512)
Create a basic_ilostream.
Definition: largeobject.hxx:553
TO check_cast(FROM value, char const description[])
Cast a numeric value to another type, or throw if it underflows/overflows.
Definition: util.hxx:52
virtual int_type overflow(int_type ch) override
Definition: largeobject.hxx:429
largeobjectaccess::seekdir seekdir
Definition: largeobject.hxx:372
typename traits_type::pos_type pos_type
Definition: largeobject.hxx:530
Input stream that gets its data from a large object.
Definition: largeobject.hxx:522
bool operator==(largeobject const &other) const
Compare object identities.
Definition: largeobject.hxx:86
~largeobjectaccess() noexcept
Definition: largeobject.hxx:209
largeobject_streambuf(dbtransaction &t, largeobject o, openmode mode=default_mode, size_type buf_size=512)
Definition: largeobject.hxx:378
void write(std::string_view buf)
Write string to large object.
Definition: largeobject.hxx:244
typename traits_type::int_type int_type
Definition: largeobject.hxx:585
typename traits_type::int_type int_type
Definition: largeobject.hxx:368
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:25
Connection to a database.
Definition: connection.hxx:135
virtual int_type overflow()
Definition: largeobject.hxx:457
constexpr oid oid_none
The "null" oid.
Definition: util.hxx:180
basic_olostream(dbtransaction &t, largeobject o, largeobject::size_type buf_size=512)
Create a basic_olostream.
Definition: largeobject.hxx:595
size_type pos_type
Definition: largeobject.hxx:153
Abstract transaction base class: bracket transactions on the database.
Definition: dbtransaction.hxx:52
virtual int sync() override
Definition: largeobject.hxx:410
Identity of a large object.
Definition: largeobject.hxx:34
typename traits_type::pos_type pos_type
Definition: largeobject.hxx:655
bool operator>(largeobject const &other) const
Compare object identities.
Definition: largeobject.hxx:116
static PQXX_PURE internal::pq::PGconn * raw_connection(dbtransaction const &T)
Definition: largeobject.cxx:127
typename traits_type::off_type off_type
Definition: largeobject.hxx:531
virtual int_type underflow() override
Definition: largeobject.hxx:459
typename traits_type::off_type off_type
Definition: largeobject.hxx:656
largeobjectaccess::openmode openmode
Definition: largeobject.hxx:371
bool operator<(largeobject const &other) const
Compare object identities.
Definition: largeobject.hxx:110
typename traits_type::pos_type pos_type
Definition: largeobject.hxx:369
Stream that reads and writes a large object.
Definition: largeobject.hxx:647
Streambuf to use large objects in standard I/O streams.
Definition: largeobject.hxx:361
basic_ilostream(dbtransaction &t, largeobject o, largeobject::size_type buf_size=512)
Create a basic_ilostream.
Definition: largeobject.hxx:539
~basic_lostream()
Definition: largeobject.hxx:688
virtual ~largeobject_streambuf() noexcept
Definition: largeobject.hxx:400
void remove(dbtransaction &t) const
Delete large object from database.
Definition: largeobject.cxx:113
typename traits_type::off_type off_type
Definition: largeobject.hxx:587
basic_lostream(dbtransaction &t, oid o, largeobject::size_type buf_size=512)
Create a basic_lostream.
Definition: largeobject.hxx:679
Output stream that writes data back to a large object.
Definition: largeobject.hxx:578
largeobject_streambuf(dbtransaction &t, oid o, openmode mode=default_mode, size_type buf_size=512)
Definition: largeobject.hxx:389
Accessor for large object's contents.
Definition: largeobject.hxx:148
large_object_size_type size_type
Definition: largeobject.hxx:37
std::ios::seekdir seekdir
Seek direction: beg, cur, end.
Definition: largeobject.hxx:170
typename traits_type::int_type int_type
Definition: largeobject.hxx:529
oid id() const noexcept
Object identifier.
Definition: largeobject.hxx:74
std::ios::openmode openmode
Open mode: in, out (can be combined using "bitwise or").
Definition: largeobject.hxx:163
TRAITS traits_type
Definition: largeobject.hxx:653
void to_file(dbtransaction &t, std::string_view file) const
Export large object's contents to a local file.
Definition: largeobject.cxx:98
virtual pos_type seekoff(off_type offset, seekdir dir, openmode) override
Definition: largeobject.hxx:417
void process_notice(std::string const &s)
For use by large object stream classes.
Definition: largeobject.hxx:407
bool operator>=(largeobject const &other) const
Compare object identities.
Definition: largeobject.hxx:104
typename traits_type::pos_type pos_type
Definition: largeobject.hxx:586
CHAR char_type
Definition: largeobject.hxx:527
bool operator<=(largeobject const &other) const
Compare object identities.
Definition: largeobject.hxx:98
void to_file(std::string_view file) const
Export large object's contents to a local file.
Definition: largeobject.hxx:221
large_object_size_type size_type
Definition: largeobject.hxx:37