1 //
2 // SessionFactory.cpp
3 //
4 // Library: Data
5 // Package: DataCore
6 // Module: SessionFactory
7 //
8 // Copyright (c) 2006, Applied Informatics Software Engineering GmbH.
9 // and Contributors.
10 //
11 // SPDX-License-Identifier: BSL-1.0
12 //
13
14
15 #include "Poco/Data/SessionFactory.h"
16 #include "Poco/URI.h"
17 #include "Poco/String.h"
18
19
20 namespace Poco {
21 namespace Data {
22
23
SessionFactory()24 SessionFactory::SessionFactory()
25 {
26 }
27
28
~SessionFactory()29 SessionFactory::~SessionFactory()
30 {
31 }
32
33
instance()34 SessionFactory& SessionFactory::instance()
35 {
36 static SessionFactory sf;
37 return sf;
38 }
39
40
add(Connector * pIn)41 void SessionFactory::add(Connector* pIn)
42 {
43 Poco::FastMutex::ScopedLock lock(_mutex);
44 SessionInfo info(pIn);
45 std::pair<Connectors::iterator, bool> res =
46 _connectors.insert(std::make_pair(pIn->name(), info));
47 if (!res.second) res.first->second.cnt++;
48 }
49
50
remove(const std::string & key)51 void SessionFactory::remove(const std::string& key)
52 {
53 Poco::FastMutex::ScopedLock lock(_mutex);
54 Connectors::iterator it = _connectors.find(key);
55 poco_assert (_connectors.end() != it);
56
57 --(it->second.cnt);
58 if (it->second.cnt == 0) _connectors.erase(it);
59 }
60
61
create(const std::string & key,const std::string & connectionString,std::size_t timeout)62 Session SessionFactory::create(const std::string& key,
63 const std::string& connectionString,
64 std::size_t timeout)
65 {
66 Poco::SharedPtr<Connector> ptrSI;
67 {
68 Poco::FastMutex::ScopedLock lock(_mutex);
69 Connectors::iterator it = _connectors.find(key);
70 if (_connectors.end() == it) throw Poco::NotFoundException(key);
71 ptrSI = it->second.ptrSI;
72 }
73 return Session(ptrSI->createSession(connectionString, timeout));
74 }
75
76
create(const std::string & uri,std::size_t timeout)77 Session SessionFactory::create(const std::string& uri,
78 std::size_t timeout)
79 {
80 URI u(uri);
81 poco_assert (!u.getPath().empty());
82 return create(u.getScheme(), u.getPath().substr(1), timeout);
83 }
84
85
SessionInfo(Connector * pSI)86 SessionFactory::SessionInfo::SessionInfo(Connector* pSI):
87 cnt(1),
88 ptrSI(pSI)
89 {
90 }
91
92
93 } } // namespace Poco::Data
94