11#ifndef PQXX_H_LARGEOBJECT
12#define PQXX_H_LARGEOBJECT
14#if !defined(PQXX_HEADER_PRE)
15# error "Include libpqxx headers as <pqxx/header>, not <pqxx/header.hxx>."
20#include "pqxx/dbtransaction.hxx"
61 [[deprecated(
"Use blob instead.")]] largeobject(
62 dbtransaction &
t, std::string_view
file);
69 [[deprecated(
"Use blob instead.")]] largeobject(
70 largeobjectaccess
const &
o)
noexcept;
91 return m_id ==
other.m_id;
97 return m_id !=
other.m_id;
103 return m_id <=
other.m_id;
109 return m_id >=
other.m_id;
115 return m_id <
other.m_id;
121 return m_id >
other.m_id;
171 static constexpr auto default_mode{
172 std::ios::in | std::ios::out | std::ios::binary};
245 void write(
char const buf[], std::size_t
len);
260 size_type read(
char buf[], std::size_t
len);
266 size_type seek(size_type
dest, seekdir
dir);
296 pos_type cseek(off_type
dest, seekdir
dir)
noexcept;
305 off_type cwrite(
char const buf[], std::size_t
len)
noexcept;
314 off_type cread(
char buf[], std::size_t
len)
noexcept;
347 internal::pq::
PGconn *raw_connection()
const
387 static constexpr auto default_mode{
388 std::ios::in | std::ios::out | std::ios::binary};
390#include "pqxx/internal/ignore-deprecated-pre.hxx"
398#include "pqxx/internal/ignore-deprecated-post.hxx"
422 return overflow(eof());
434 return adjust_eof(
newpos);
439 auto *
const pp{this->
pptr()};
449 m_obj.cwrite(
pb,
static_cast<std::size_t
>(
pp -
pb))};
452 "pqxx::largeobject: write failed "
453 "(is transaction still valid on write or flush?), "
454 "libpq reports error"};
457 "pqxx::largeobject: write failed "
458 "(is transaction still valid on write or flush?), " +
463 if constexpr (std::is_arithmetic_v<
decltype(
out)>)
468 this->
setp(m_p, m_p + m_bufsize);
483 if (this->
gptr() ==
nullptr)
486 auto const res{adjust_eof(
487 m_obj.cread(
this->eback(),
static_cast<std::size_t
>(m_bufsize)))};
489 eb,
eb,
eb + (res == eof() ? 0 :
static_cast<std::size_t
>(res)));
490 return (res == eof()
or res == 0) ? eof() : traits_type::to_int_type(*
eb);
495 static int_type eof() {
return traits_type::eof(); }
498 template<
typename INTYPE>
static std::streampos adjust_eof(
INTYPE pos)
500 bool const at_eof{pos == -1};
501 if constexpr (std::is_arithmetic_v<std::streampos>)
504 (
at_eof ? eof() : pos),
"large object seek"sv);
508 return std::streampos(
at_eof ? eof() : pos);
512 void initialize(openmode
mode)
514 if ((
mode & std::ios::in) != 0)
516 m_g =
new char_type[
unsigned(m_bufsize)];
517 this->
setg(m_g, m_g, m_g);
519 if ((
mode & std::ios::out) != 0)
521 m_p =
new char_type[
unsigned(m_bufsize)];
522 this->
setp(m_p, m_p + m_bufsize);
526 size_type
const m_bufsize;
527 largeobjectaccess m_obj;
530 char_type *m_g, *m_p;
544template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
547 using super = std::basic_istream<CHAR, TRAITS>;
556#include "pqxx/internal/ignore-deprecated-pre.hxx"
566 m_buf{t, o, std::ios::in | std::ios::
binary, buf_size}
570#include "pqxx/internal/ignore-deprecated-post.hxx"
581 m_buf{t, o, std::ios::in | std::ios::
binary, buf_size}
602template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
605 using super = std::basic_ostream<CHAR, TRAITS>;
614#include "pqxx/internal/ignore-deprecated-pre.hxx"
624 m_buf{t, o, std::ios::out | std::ios::
binary, buf_size}
628#include "pqxx/internal/ignore-deprecated-post.hxx"
639 m_buf{t, o, std::ios::out | std::ios::
binary, buf_size}
651 catch (std::exception
const &e)
653 m_buf.process_notice(e.what());
674template<
typename CHAR =
char,
typename TRAITS = std::
char_traits<CHAR>>
677 using super = std::basic_iostream<CHAR, TRAITS>;
696 t, o, std::ios::in | std::ios::out | std::ios::
binary, buf_size}
711 t, o, std::ios::in | std::ios::out | std::ios::
binary, buf_size}
723 catch (std::exception
const &e)
725 m_buf.process_notice(e.what());
The home of all libpqxx classes, functions, templates, etc.
Definition array.hxx:33
int64_t large_object_size_type
Number of bytes in a large object.
Definition types.hxx:43
constexpr char array_separator
Element separator between SQL array elements of this type.
Definition strconv.hxx:557
constexpr oid oid_none
The "null" oid.
Definition util.hxx:445
constexpr bool cmp_less_equal(LEFT lhs, RIGHT rhs) noexcept
C++20 std::cmp_less_equal, or workaround if not available.
Definition util.hxx:98
Connection to a database.
Definition connection.hxx:233
Abstract transaction base class: bracket transactions on the database.
Definition dbtransaction.hxx:54
Internal error in libpqxx library.
Definition except.hxx:242
Identity of a large object.
Definition largeobject.hxx:34
bool operator==(largeobject const &other) const
Compare object identities.
Definition largeobject.hxx:89
bool operator>=(largeobject const &other) const
Compare object identities.
Definition largeobject.hxx:107
static PQXX_PURE internal::pq::PGconn * raw_connection(dbtransaction const &T)
Definition largeobject.cxx:139
bool operator<=(largeobject const &other) const
Compare object identities.
Definition largeobject.hxx:101
large_object_size_type size_type
Definition largeobject.hxx:36
bool operator<(largeobject const &other) const
Compare object identities.
Definition largeobject.hxx:113
largeobject() noexcept=default
void to_file(dbtransaction &t, std::string_view file) const
Export large object's contents to a local file.
Definition largeobject.cxx:107
bool operator!=(largeobject const &other) const
Compare object identities.
Definition largeobject.hxx:95
bool operator>(largeobject const &other) const
Compare object identities.
Definition largeobject.hxx:119
oid id() const noexcept
Object identifier.
Definition largeobject.hxx:77
Accessor for large object's contents.
Definition largeobject.hxx:154
size_type pos_type
Definition largeobject.hxx:158
std::ios::openmode openmode
Open mode: in, out (can be combined using "bitwise or").
Definition largeobject.hxx:168
std::ios::seekdir seekdir
Seek direction: beg, cur, end.
Definition largeobject.hxx:175
void to_file(std::string_view file) const
Export large object's contents to a local file.
Definition largeobject.hxx:228
~largeobjectaccess() noexcept
Definition largeobject.hxx:216
void write(std::string_view buf)
Write string to large object.
Definition largeobject.hxx:251
size_type off_type
Definition largeobject.hxx:157
Streambuf to use large objects in standard I/O streams.
Definition largeobject.hxx:374
virtual pos_type seekoff(off_type offset, seekdir dir, openmode) override
Definition largeobject.hxx:425
virtual int_type overflow(int_type ch) override
Definition largeobject.hxx:437
TRAITS traits_type
Definition largeobject.hxx:379
typename traits_type::int_type int_type
Definition largeobject.hxx:380
virtual pos_type seekpos(pos_type pos, openmode) override
Definition largeobject.hxx:430
largeobject_streambuf(dbtransaction &t, oid o, openmode mode=default_mode, size_type buf_size=512)
Definition largeobject.hxx:400
CHAR char_type
Definition largeobject.hxx:378
typename traits_type::off_type off_type
Definition largeobject.hxx:382
virtual int_type overflow()
Definition largeobject.hxx:479
virtual ~largeobject_streambuf() noexcept
Definition largeobject.hxx:408
void process_notice(zview const &s)
For use by large object stream classes.
Definition largeobject.hxx:415
virtual int sync() override
Definition largeobject.hxx:418
largeobjectaccess::seekdir seekdir
Definition largeobject.hxx:384
virtual int_type underflow() override
Definition largeobject.hxx:481
largeobjectaccess::openmode openmode
Definition largeobject.hxx:383
typename traits_type::pos_type pos_type
Definition largeobject.hxx:381
largeobject_streambuf(dbtransaction &t, largeobject o, openmode mode=default_mode, size_type buf_size=512)
Definition largeobject.hxx:391
Input stream that gets its data from a large object.
Definition largeobject.hxx:546
basic_ilostream(dbtransaction &t, oid o, largeobject::size_type buf_size=512)
Create a basic_ilostream.
Definition largeobject.hxx:578
CHAR char_type
Definition largeobject.hxx:550
basic_ilostream(dbtransaction &t, largeobject o, largeobject::size_type buf_size=512)
Create a basic_ilostream.
Definition largeobject.hxx:563
typename traits_type::int_type int_type
Definition largeobject.hxx:552
TRAITS traits_type
Definition largeobject.hxx:551
typename traits_type::off_type off_type
Definition largeobject.hxx:554
typename traits_type::pos_type pos_type
Definition largeobject.hxx:553
Output stream that writes data back to a large object.
Definition largeobject.hxx:604
typename traits_type::off_type off_type
Definition largeobject.hxx:612
typename traits_type::pos_type pos_type
Definition largeobject.hxx:611
basic_olostream(dbtransaction &t, largeobject o, largeobject::size_type buf_size=512)
Create a basic_olostream.
Definition largeobject.hxx:621
typename traits_type::int_type int_type
Definition largeobject.hxx:610
~basic_olostream()
Definition largeobject.hxx:644
CHAR char_type
Definition largeobject.hxx:608
basic_olostream(dbtransaction &t, oid o, largeobject::size_type buf_size=512)
Create a basic_olostream.
Definition largeobject.hxx:636
TRAITS traits_type
Definition largeobject.hxx:609
Stream that reads and writes a large object.
Definition largeobject.hxx:676
typename traits_type::pos_type pos_type
Definition largeobject.hxx:683
~basic_lostream()
Definition largeobject.hxx:716
typename traits_type::int_type int_type
Definition largeobject.hxx:682
typename traits_type::off_type off_type
Definition largeobject.hxx:684
basic_lostream(dbtransaction &t, largeobject o, largeobject::size_type buf_size=512)
Create a basic_lostream.
Definition largeobject.hxx:692
basic_lostream(dbtransaction &t, oid o, largeobject::size_type buf_size=512)
Create a basic_lostream.
Definition largeobject.hxx:707
TRAITS traits_type
Definition largeobject.hxx:681
CHAR char_type
Definition largeobject.hxx:680
Marker-type wrapper: zero-terminated std::string_view.
Definition zview.hxx:38