StatementCache.hh

00001 //********************************************************************
00002 //*** ResourcePool/oracle/StatementCache.hh
00003 //*** Copyright (c) 2003-2009 by Markus Winand <mws@fatalmind.com>
00004 //*** $Id: StatementCache.hh,v 1.13 2009-03-02 14:16:46 mws Exp $
00005 //********************************************************************
00006 /*
00007 This file is part of ResourcePool.
00008 
00009 ResourcePool is free software; you can redistribute it
00010 and/or modify it under the terms of the GNU General Public License
00011 as published by the Free Software Foundation; either version 2 of 
00012 the License, or (at your option) any later version.
00013 
00014 ResourcePool is distributed in the hope that it will be
00015 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
00016 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017 GNU General Public License for more details.
00018 
00019 You should have received a copy of the GNU General Public License
00020 along with ResourcePool; if not, write to the Free Software
00021 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00022 02111-1307  USA */
00023 
00024 #ifndef RESOURCEPOOL_ORACLE_STATEMENTCACHE_HH
00025 #define RESOURCEPOOL_ORACLE_STATEMENTCACHE_HH
00026 
00027 #ifndef RESOURCEPOOL_ORACLE_OCIHANDLEFWD_HH
00028 #include "OCIHandleFwd.hh"
00029 #endif
00030 
00031 #ifndef INCLUDED_GC_PTR_HH
00032 #include "mm/gc_ptr.hh"
00033 #endif
00034 
00035 #ifndef RESOURCEPOOL_ORACLE_ORACLESTATEMENT_HH
00036 #include "oracleStatement.hh"
00037 #endif
00038 
00039 #include <map>
00040 #include <string>
00041 
00042 namespace fatalmind {
00043 namespace oracle {
00044 
00045 class StatementCache {
00046     public:
00047         typedef gc_ptr<OCIStatementHandle> handle_t;
00048 
00049         StatementCache(unsigned int maxsz = 65535, StatementCache* parent = 0);
00050         ~StatementCache();
00051 
00052         // to ensure the handle is not deleted (expired from the cache)
00053         // while it is still used by the client, the client has to
00054         // assign it to a oracle::StatementCache::handle_t
00055         // the return is passed as reference to avoid an additional temporary
00056         // TODO: hide so that only oracleHandles can use it!
00057         handle_t& open(const oracleStatement& sql, bool parentcache = false);
00058     private:
00059         handle_t* check(const oracleStatement& sql);
00060 
00061         void expire();
00062         void chksize();
00063 
00064         unsigned int _maxsz;
00065         StatementCache* _parent;
00066 
00067         typedef std::pair<oracleStatement, handle_t> element_t;
00068         typedef std::map<oracleStatement, handle_t> map_t;
00069         map_t _map;
00070     // hidden stuff
00071         StatementCache(const StatementCache&);
00072         StatementCache* operator=(const StatementCache&);
00073 };
00074 
00075 }
00076 }
00077 #endif

Generated on Mon Nov 9 16:21:24 2009 for ResourcePool by  doxygen 1.5.3