19 #ifndef PQXX_H_LARGEOBJECT
20 #define PQXX_H_LARGEOBJECT
22 #include "pqxx/compiler-public.hxx"
23 #include "pqxx/compiler-internal-pre.hxx"
27 #include "pqxx/dbtransaction"
33 class largeobjectaccess;
82 oid
id() const PQXX_NOEXCEPT {
return m_ID; }
95 {
return m_ID == other.m_ID; }
99 {
return m_ID != other.m_ID; }
103 {
return m_ID <= other.m_ID; }
107 {
return m_ID >= other.m_ID; }
111 {
return m_ID < other.m_ID; }
115 {
return m_ID > other.m_ID; }
123 void to_file(
dbtransaction &T,
const std::string &File)
const;
133 PQXX_PURE
static internal::pq::PGconn *RawConnection(
const dbtransaction &T);
135 std::string Reason(
int err)
const;
172 openmode mode=std::ios::in|std::ios::out);
183 openmode mode=std::ios::in|std::ios::out);
193 openmode mode=std::ios::in|std::ios::out);
202 const std::string &File,
203 openmode mode=std::ios::in|std::ios::out);
231 void write(
const char Buf[], size_type Len);
238 { write(Buf.c_str(),
static_cast<size_type>(Buf.size())); }
247 size_type read(
char Buf[], size_type Len);
253 size_type seek(size_type dest, seekdir dir);
259 size_type tell()
const;
280 pos_type cseek(off_type dest, seekdir dir) PQXX_NOEXCEPT;
289 off_type cwrite(
const char Buf[], size_type Len) PQXX_NOEXCEPT;
298 off_type cread(
char Buf[], size_type Len) PQXX_NOEXCEPT;
305 pos_type ctell() const PQXX_NOEXCEPT;
312 void process_notice(const std::
string &) PQXX_NOEXCEPT;
326 PQXX_PRIVATE std::
string Reason(
int err) const;
327 internal::pq::PGconn *RawConnection()
const
330 void open(openmode mode);
331 void close() PQXX_NOEXCEPT;
333 dbtransaction &m_Trans;
337 largeobjectaccess() PQXX_DELETED_OP;
338 largeobjectaccess(const largeobjectaccess &) PQXX_DELETED_OP;
339 largeobjectaccess operator=(const largeobjectaccess &) PQXX_DELETED_OP;
352 template<typename CHAR=
char, typename TRAITS=std::char_traits<CHAR> >
354 public std::basic_streambuf<CHAR, TRAITS>
356 typedef long size_type;
368 openmode mode=std::ios::in|std::ios::out,
369 size_type BufSize=512) :
374 { initialize(mode); }
378 openmode mode=std::ios::in|std::ios::out,
379 size_type BufSize=512) :
384 { initialize(mode); }
387 {
delete [] m_P;
delete [] m_G; }
394 virtual int sync() PQXX_OVERRIDE
397 this->setg(this->eback(), this->eback(), this->egptr());
398 return overflow(EoF());
404 openmode) PQXX_OVERRIDE
409 virtual pos_type
seekpos(pos_type pos, openmode) PQXX_OVERRIDE
414 return AdjustEOF(newpos);
417 virtual int_type
overflow(int_type ch = EoF()) PQXX_OVERRIDE
419 char *
const pp = this->pptr();
420 if (!pp)
return EoF();
421 char *
const pb = this->pbase();
424 if (pp > pb) res = int_type(AdjustEOF(m_Obj.cwrite(pb, pp-pb)));
425 this->setp(m_P, m_P + m_BufSize);
430 *this->pptr() = char(ch);
438 if (!this->gptr())
return EoF();
439 char *
const eb = this->eback();
440 const int_type res(static_cast<int_type>(
441 AdjustEOF(m_Obj.cread(this->eback(), m_BufSize))));
442 this->setg(eb, eb, eb + ((res==EoF()) ? 0 : res));
443 return (!res || (res == EoF())) ? EoF() : *eb;
448 static int_type EoF() {
return traits_type::eof(); }
451 template<
typename INTYPE>
452 static std::streampos AdjustEOF(INTYPE pos)
453 {
return (pos==-1) ? std::streampos(EoF()) : std::streampos(pos); }
455 void initialize(openmode mode)
457 if (mode & std::ios::in)
459 m_G =
new char_type[unsigned(m_BufSize)];
460 this->setg(m_G, m_G, m_G);
462 if (mode & std::ios::out)
464 m_P =
new char_type[unsigned(m_BufSize)];
465 this->setp(m_P, m_P + m_BufSize);
469 const size_type m_BufSize;
470 largeobjectaccess m_Obj;
473 char_type *m_G, *m_P;
486 template<
typename CHAR=
char,
typename TRAITS=std::
char_traits<CHAR> >
488 public std::basic_istream<CHAR, TRAITS>
490 typedef std::basic_istream<CHAR, TRAITS> super;
509 m_Buf(T, O, std::ios::in, BufSize)
510 { super::init(&m_Buf); }
522 m_Buf(T, O, std::ios::in, BufSize)
523 { super::init(&m_Buf); }
541 template<
typename CHAR=
char,
typename TRAITS=std::
char_traits<CHAR> >
543 public std::basic_ostream<CHAR, TRAITS>
545 typedef std::basic_ostream<CHAR, TRAITS> super;
563 m_Buf(T, O, std::ios::out, BufSize)
564 { super::init(&m_Buf); }
576 m_Buf(T, O, std::ios::out, BufSize)
577 { super::init(&m_Buf); }
583 m_Buf.pubsync(); m_Buf.pubsync();
585 catch (
const std::exception &e)
587 m_Buf.process_notice(e.what());
607 template<
typename CHAR=
char,
typename TRAITS=std::
char_traits<CHAR> >
609 public std::basic_iostream<CHAR, TRAITS>
611 typedef std::basic_iostream<CHAR, TRAITS> super;
630 m_Buf(T, O, std::ios::in | std::ios::out, BufSize)
631 { super::init(&m_Buf); }
643 m_Buf(T, O, std::ios::in | std::ios::out, BufSize)
644 { super::init(&m_Buf); }
650 m_Buf.pubsync(); m_Buf.pubsync();
652 catch (
const std::exception &e)
654 m_Buf.process_notice(e.what());
666 #include "pqxx/compiler-internal-post.hxx"
void process_notice(const std::string &s)
For use by large object stream classes.
Definition: largeobject.hxx:391
virtual int_type underflow() PQXX_OVERRIDE
Definition: largeobject.hxx:436
traits_type::off_type off_type
Definition: largeobject.hxx:551
virtual pos_type seekpos(pos_type pos, openmode) PQXX_OVERRIDE
Definition: largeobject.hxx:409
traits_type::pos_type pos_type
Definition: largeobject.hxx:496
std::ios::openmode openmode
Open mode: in, out (can be combined with the "or" operator)
Definition: largeobject.hxx:157
Accessor for large object's contents.
Definition: largeobject.hxx:145
traits_type::int_type int_type
Definition: largeobject.hxx:495
std::ios::seekdir seekdir
Seek direction: beg, cur, end.
Definition: largeobject.hxx:164
basic_ilostream(dbtransaction &T, oid O, largeobject::size_type BufSize=512)
Create a basic_ilostream.
Definition: largeobject.hxx:518
~largeobjectaccess() PQXX_NOEXCEPT
Definition: largeobject.hxx:205
bool operator!=(const largeobject &other) const
Compare object identities.
Definition: largeobject.hxx:98
basic_olostream< char > olostream
Definition: largeobject.hxx:595
TRAITS traits_type
Definition: largeobject.hxx:494
oid id() const PQXX_NOEXCEPT
Object identifier.
Definition: largeobject.hxx:82
CHAR char_type
Definition: largeobject.hxx:547
basic_ilostream< char > ilostream
Definition: largeobject.hxx:529
basic_ilostream(dbtransaction &T, largeobject O, largeobject::size_type BufSize=512)
Create a basic_ilostream.
Definition: largeobject.hxx:505
bool operator<(const largeobject &other) const
Compare object identities.
Definition: largeobject.hxx:110
traits_type::pos_type pos_type
Definition: largeobject.hxx:361
long size_type
Definition: largeobject.hxx:46
bool operator==(const largeobject &other) const
Compare object identities.
Definition: largeobject.hxx:94
long off_type
Definition: largeobject.hxx:149
basic_olostream(dbtransaction &T, oid O, largeobject::size_type BufSize=512)
Create a basic_olostream.
Definition: largeobject.hxx:572
~basic_lostream()
Definition: largeobject.hxx:646
traits_type::pos_type pos_type
Definition: largeobject.hxx:617
Output stream that writes data back to a large object.
Definition: largeobject.hxx:542
Input stream that gets its data from a large object.
Definition: largeobject.hxx:487
basic_lostream(dbtransaction &T, largeobject O, largeobject::size_type BufSize=512)
Create a basic_lostream.
Definition: largeobject.hxx:626
TRAITS traits_type
Definition: largeobject.hxx:359
Streambuf to use large objects in standard I/O streams.
Definition: largeobject.hxx:353
traits_type::off_type off_type
Definition: largeobject.hxx:497
traits_type::off_type off_type
Definition: largeobject.hxx:618
basic_lostream(dbtransaction &T, oid O, largeobject::size_type BufSize=512)
Create a basic_lostream.
Definition: largeobject.hxx:639
CHAR char_type
Definition: largeobject.hxx:493
~basic_olostream()
Definition: largeobject.hxx:579
TRAITS traits_type
Definition: largeobject.hxx:548
traits_type::int_type int_type
Definition: largeobject.hxx:549
basic_olostream(dbtransaction &T, largeobject O, largeobject::size_type BufSize=512)
Create a basic_olostream.
Definition: largeobject.hxx:559
largeobject_streambuf(dbtransaction &T, largeobject O, openmode mode=std::ios::in|std::ios::out, size_type BufSize=512)
Definition: largeobject.hxx:366
traits_type::int_type int_type
Definition: largeobject.hxx:360
traits_type::int_type int_type
Definition: largeobject.hxx:616
CHAR char_type
Definition: largeobject.hxx:358
Stream that reads and writes a large object.
Definition: largeobject.hxx:608
traits_type::off_type off_type
Definition: largeobject.hxx:362
largeobjectaccess::openmode openmode
Definition: largeobject.hxx:363
Identity of a large object.
Definition: largeobject.hxx:43
void to_file(dbtransaction &T, const std::string &File) const
Export large object's contents to a local file.
Definition: largeobject.cxx:115
TRAITS traits_type
Definition: largeobject.hxx:615
bool operator>(const largeobject &other) const
Compare object identities.
Definition: largeobject.hxx:114
CHAR char_type
Definition: largeobject.hxx:614
largeobjectaccess::seekdir seekdir
Definition: largeobject.hxx:364
Definition: dbtransaction.hxx:68
virtual int_type overflow(int_type ch=EoF()) PQXX_OVERRIDE
Definition: largeobject.hxx:417
traits_type::pos_type pos_type
Definition: largeobject.hxx:550
virtual pos_type seekoff(off_type offset, seekdir dir, openmode) PQXX_OVERRIDE
Definition: largeobject.hxx:402
bool operator<=(const largeobject &other) const
Compare object identities.
Definition: largeobject.hxx:102
void write(const std::string &Buf)
Write string to large object.
Definition: largeobject.hxx:237
largeobject_streambuf(dbtransaction &T, oid O, openmode mode=std::ios::in|std::ios::out, size_type BufSize=512)
Definition: largeobject.hxx:376
virtual int sync() PQXX_OVERRIDE
Definition: largeobject.hxx:394
static PQXX_PURE internal::pq::PGconn * RawConnection(const dbtransaction &T)
Definition: largeobject.cxx:141
size_type pos_type
Definition: largeobject.hxx:150
basic_lostream< char > lostream
Definition: largeobject.hxx:662
bool operator>=(const largeobject &other) const
Compare object identities.
Definition: largeobject.hxx:106
void to_file(const std::string &File) const
Export large object's contents to a local file.
Definition: largeobject.hxx:217
virtual ~largeobject_streambuf() PQXX_NOEXCEPT
Definition: largeobject.hxx:386