12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556 |
- #ifndef MYSQL_DEVAPI_H
- #define MYSQL_DEVAPI_H
- #ifndef __cplusplus
- #error This header can be only used with C++ code
- #endif
- #include "devapi/common.h"
- #include "devapi/result.h"
- #include "devapi/collection_crud.h"
- #include "devapi/table_crud.h"
- #include "devapi/settings.h"
- #include "devapi/detail/session.h"
- namespace mysqlx {
- class Session;
- namespace internal {
- template <class Base> class Sch_object;
- }
- class Schema
- : protected internal::Schema_detail
- {
- Session *m_sess;
- public:
-
- Schema(Session &sess, const string &name);
-
- Schema(Session&);
-
- const string& getName() const
- {
- return m_name;
- }
-
- Session& getSession()
- {
- return *m_sess;
- }
- const Session& getSession() const
- {
- return const_cast<Schema*>(this)->getSession();
- }
-
- bool existsInDatabase() const
- {
- try {
-
- internal::Session_detail::Name_src list(*m_sess, m_name);
- list.iterator_start();
- return list.iterator_next();
- }
- CATCH_AND_WRAP
- }
-
- Collection createCollection(const string &name, bool reuse = false);
-
- Collection getCollection(const string &name, bool check_exists = false);
-
- Table getTable(const string &name, bool check_exists = false);
-
- CollectionList getCollections()
- {
- try {
- return Collection_src(*this, L"%");
- }
- CATCH_AND_WRAP
- }
-
- StringList getCollectionNames()
- {
- try {
- return Name_src(*this, COLLECTION, L"%");
- }
- CATCH_AND_WRAP
- }
-
- TableList getTables()
- {
- try {
- return Table_src(*this, L"%");
- }
- CATCH_AND_WRAP
- }
-
- StringList getTableNames()
- {
- try {
- return Name_src(*this, TABLE, L"%");
- }
- CATCH_AND_WRAP
- }
-
- Table getCollectionAsTable(const string &name, bool check_exists = true);
-
- void dropCollection(const mysqlx::string& name)
- {
- try {
- Schema_detail::drop_collection(name);
- }
- CATCH_AND_WRAP
- }
- friend Collection;
- friend Table;
-
- friend internal::Schema_detail::Name_src;
- template <class Base> friend class internal::Sch_object;
-
- };
- namespace internal {
- template <class Base = Db_obj_base>
- class Sch_object
- : public Base
- {
- protected:
- Schema m_schema;
- Sch_object(const Schema &sch, const string &name);
- public:
- using string = mysqlx::string;
-
- const string& getName() const
- {
- return Base::m_name;
- }
-
- Session& getSession()
- {
- return m_schema.getSession();
- }
-
- const Schema& getSchema() const
- {
- return m_schema;
- }
- protected:
- std::shared_ptr<common::Session_impl> get_session();
- internal::Schema_detail& get_schema()
- {
- return m_schema;
- }
- };
- }
- class Collection
- : protected internal::Sch_object<internal::Collection_detail>
- {
- public:
- Collection(const Schema &sch, const string &name)
- try
- : Sch_object(sch, name)
- {}
- CATCH_AND_WRAP
- using Sch_object::getName;
- using Sch_object::getSession;
- using Sch_object::getSchema;
- bool existsInDatabase() const
- {
- try {
- Schema::StringList list(m_schema, Schema::COLLECTION, m_name);
- return list.begin() != list.end();
- }
- CATCH_AND_WRAP
- }
-
- uint64_t count();
-
-
- CollectionFind find()
- {
- try {
- return CollectionFind(*this);
- }
- CATCH_AND_WRAP;
- }
-
- CollectionFind find(const string &cond)
- {
- try {
- return CollectionFind(*this, cond);
- }
- CATCH_AND_WRAP;
- }
-
- template <typename... Types>
- CollectionAdd add(Types... args)
- {
- try {
- CollectionAdd add(*this);
- return add.add(args...);
- }
- CATCH_AND_WRAP;
- }
-
- CollectionRemove remove(const string &cond)
- {
- try {
- return CollectionRemove(*this, cond);
- }
- CATCH_AND_WRAP;
- }
-
- CollectionModify modify(const string &expr)
- {
- try {
- return CollectionModify(*this, expr);
- }
- CATCH_AND_WRAP;
- }
-
- DbDoc getOne(const string &id)
- {
- return find("_id = :id").bind("id", id).execute().fetchOne();
- }
-
- Result removeOne(const string &id)
- {
- return remove("_id = :id").bind("id", id).execute();
- }
-
- Result replaceOne(const string &id, Value &&document)
- {
- try {
- return
- Collection_detail::add_or_replace_one(id, std::move(document), true);
- }
- CATCH_AND_WRAP
- }
-
- Result addOrReplaceOne(const string &id, Value &&document)
- {
- try {
- return
- Collection_detail::add_or_replace_one(id, std::move(document), false);
- }
- CATCH_AND_WRAP
- }
-
- void createIndex(const string &name, const string &idx_spec)
- {
- try {
- Collection_detail::index_create(name, idx_spec);
- }
- CATCH_AND_WRAP
- }
-
- void dropIndex(const string &name)
- {
- try {
- Collection_detail::index_drop(name);
- }
- CATCH_AND_WRAP
- }
- friend CollectionFind;
- friend CollectionAdd;
- friend CollectionRemove;
- friend CollectionModify;
-
- friend internal::Crud_factory;
-
- };
- inline
- Collection Schema::createCollection(const string &name, bool reuse)
- {
- try {
- Schema_detail::create_collection(name, reuse);
- return Collection(*this, name);
- }
- CATCH_AND_WRAP
- }
- inline
- Collection Schema::getCollection(const string &name, bool check_exists)
- {
- Collection coll(*this, name);
- if (check_exists && !coll.existsInDatabase())
- throw_error("Collection does not exist");
- return coll;
- }
- class Table
- : protected internal::Sch_object<>
- {
- public:
- Table(const Schema &sch, const string &name)
- : Sch_object(sch, name)
- {}
- Table(const Schema &sch, const string &name, bool is_view)
- : Sch_object(sch, name)
- {
- m_type = is_view ? VIEW : TABLE;
- }
- using Sch_object::getName;
- using Sch_object::getSession;
- using Sch_object::getSchema;
- bool existsInDatabase() const;
-
- bool isView();
-
- uint64_t count()
- {
- try {
- RowResult cnt = select(L"count(*)").execute();
- return cnt.fetchOne()[0].get<uint64_t>();
- }
- CATCH_AND_WRAP
- }
-
-
- TableInsert insert()
- {
- try {
- return TableInsert(*this);
- }
- CATCH_AND_WRAP;
- }
-
- template <class... T>
- TableInsert insert(const T&... t)
- {
- try {
- return TableInsert(*this, t...);
- }
- CATCH_AND_WRAP;
- }
-
- template<typename ...PROJ>
- TableSelect select(const PROJ&...proj)
- {
- try {
- return TableSelect(*this, proj...);
- }
- CATCH_AND_WRAP;
- }
-
- TableRemove remove()
- {
- try {
- return TableRemove(*this);
- }
- CATCH_AND_WRAP;
- }
-
- TableUpdate update()
- {
- try {
- return TableUpdate(*this);
- }
- CATCH_AND_WRAP;
- }
- private:
- enum { TABLE, VIEW, UNKNOWN } m_type = UNKNOWN;
- friend TableSelect;
- friend TableInsert;
- friend TableRemove;
- friend TableUpdate;
-
- friend internal::Crud_factory;
-
- };
- inline
- bool Table::existsInDatabase() const
- {
- try {
-
- Schema::TableList list(m_schema, m_name);
- auto it = list.begin();
- if (!(it != list.end()))
- return false;
- const_cast<Table*>(this)->m_type = (*it).isView() ? VIEW : TABLE;
- return true;
- }
- CATCH_AND_WRAP
- }
- inline
- bool Table::isView()
- {
- try {
-
- if (UNKNOWN == m_type)
- if (!existsInDatabase())
- throw_error("Table does not exist");
- return VIEW == m_type;
- }
- CATCH_AND_WRAP
- }
- inline
- Table Schema::getTable(const string &name, bool check_exists)
- {
- Table tbl(*this, name);
- if (check_exists && !tbl.existsInDatabase())
- throw_error("Table does not exist");
- return tbl;
- }
- inline
- Table Schema::getCollectionAsTable(const string &name, bool check_exists)
- {
- if (check_exists && !getCollection(name).existsInDatabase())
- throw_error("Collection does not exist");
- return { *this, name };
- }
- inline
- uint64_t Collection::count()
- {
- return m_schema.getCollectionAsTable(m_name).count();
- }
- using SqlStatement = internal::SQL_statement;
- class Session
- : private internal::Session_detail
- {
- public:
-
- Session(SessionSettings settings)
- try
- : Session_detail(settings)
- {}
- CATCH_AND_WRAP
-
- template<typename...T>
- Session(T...options)
- try
- : Session(SessionSettings(options...))
- {}CATCH_AND_WRAP
- Session(Session &&other)
- try
- : internal::Session_detail(std::move(other))
- {}CATCH_AND_WRAP
- Session(Client &client);
-
- Schema createSchema(const string &name, bool reuse = false)
- {
- try {
- Session_detail::create_schema(name, reuse);
- return Schema(*this, name);
- }
- CATCH_AND_WRAP
- }
-
- Schema getSchema(const string &name, bool check_exists = false)
- {
- Schema sch(*this, name);
- if (check_exists && !sch.existsInDatabase())
- throw_error("Schema does not exist");
- return sch;
- }
-
- Schema getDefaultSchema()
- {
- return Schema(*this, getDefaultSchemaName());
- }
-
- string getDefaultSchemaName()
- {
- try {
- return Session_detail::get_default_schema_name();
- }
- CATCH_AND_WRAP
- }
-
- SchemaList getSchemas()
- {
- try {
- return Schema_src(*this, L"%");
- }
- CATCH_AND_WRAP
- }
-
-
- void dropSchema(const string &name)
- {
- try {
- Session_detail::drop_schema(name);
- }
- CATCH_AND_WRAP
- }
-
- SqlStatement sql(const string &query)
- {
- try {
- return SqlStatement(this, query);
- }
- CATCH_AND_WRAP
- }
-
- void startTransaction()
- {
- try {
- Session_detail::start_transaction();
- }
- CATCH_AND_WRAP
- }
-
- void commit()
- {
- try {
- Session_detail::commit();
- }
- CATCH_AND_WRAP
- }
-
- void rollback()
- {
- try {
- Session_detail::rollback();
- }
- CATCH_AND_WRAP
- }
-
- void rollbackTo(const string &savepoint)
- {
- try {
- if (savepoint.empty())
- throw_error("Invalid empty save point name");
- Session_detail::rollback(savepoint);
- }
- CATCH_AND_WRAP
- }
-
- string setSavepoint(const string &savepoint)
- {
- try {
- if (savepoint.empty())
- throw_error("Invalid empty save point name");
- return Session_detail::savepoint_set(savepoint);
- }
- CATCH_AND_WRAP
- }
-
- string setSavepoint()
- {
- try {
- return Session_detail::savepoint_set();
- }
- CATCH_AND_WRAP
- }
-
- void releaseSavepoint(const string &savepoint)
- {
- try {
- if (savepoint.empty())
- throw_error("Invalid empty save point name");
- Session_detail::savepoint_remove(savepoint);
- }
- CATCH_AND_WRAP
- }
-
- void close()
- {
- try {
- Session_detail::close();
- }
- CATCH_AND_WRAP
- }
- protected:
- using internal::Session_detail::m_impl;
- public:
- friend Schema;
- friend Collection;
- friend Table;
- friend Result;
- friend RowResult;
-
- friend internal::Session_detail;
- friend internal::Crud_factory;
- friend internal::Result_detail;
- template <class Base> friend class internal::Sch_object;
-
- };
- class Client : public internal::Client_detail
- {
- public:
- Client(ClientSettings settings)
- try
- : Client_detail(settings)
- {}
- CATCH_AND_WRAP
- Client(SessionSettings &settings)
- try
- : Client_detail(settings)
- {}
- CATCH_AND_WRAP
- template<typename...T>
- Client(T...options)
- : Client(ClientSettings(options...))
- {}
- Session getSession()
- {
- return *this;
- }
- };
- inline
- Session::Session(Client &client)
- try
- : internal::Session_detail(client.get_session_pool())
- {}CATCH_AND_WRAP
- template<class ...P>
- Session getSession(P...p)
- {
- return Session(p...);
- }
- template<class ...P>
- Client getClient(P...p)
- {
- return Client(p...);
- }
- inline
- Schema::Schema(Session &sess, const string &name)
- : Schema_detail(sess.m_impl, name)
- , m_sess(&sess)
- {}
- template <class Base>
- inline
- internal::Sch_object<Base>::Sch_object(const Schema &sch, const string &name)
- : Base(sch.getSession().m_impl, name)
- , m_schema(sch)
- {}
- template <class Base>
- inline
- std::shared_ptr<common::Session_impl>
- internal::Sch_object<Base>::get_session()
- {
- assert(m_schema.m_sess);
- return m_schema.m_sess->m_impl;
- }
- }
- #endif
|