- ?csdZdkZdkZdkZdkZdkZdkZdkZdkl Z l Z dk l Z dk lZlZlZlZ!dklZ"dklZ$dklZ%dklZ&d klZlZlZlZlZ(d ei d Z!+y,d k"l#Z#Wn-e$j o.d Z#nX0dZ%3e&dZ'@dfdYZ(Me(Z)OddZ*Qde+fdYZ,Sy Te-Wn/Ue.j o Vde/fdYZ-nXYdfdYZ0dS(sThe ClientStorage class and the exceptions that it may raise. Public contents of this module: ClientStorage -- the main class, implementing the Storage API N(s ClientCaches ServerStub(sTransactionBuffer(sClientStorageErrorsUnrecognizedResultsClientDisconnecteds AuthError(s get_module(sConnectionManager(s POSException(s TimeStamp(sLOGsPROBLEMsINFOsBLATHERsERRORsZCS:%dcs()t|||dS(N(sLOGssubsysstypesmsg(stypesmsgssubsys((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyslog2(s(sResolvedSerialsrscs01tt|SdS(N(sstrs TimeStampstid(stid((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pystid2time0scsp39:ti};ttti|d |df}<|tj o=|i|}n>|SdS(sInternal helper to return a unique TimeStamp instance. If the optional argument is not None, it must be a TimeStamp; the return value is then guaranteed to be at least 1 microsecond later the argument. ii<N(stimestsapplys TimeStampsgmtimesprev_tssNones laterThan(sprev_tsst((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys get_timestamp3s *sDisconnectedServerStubcs @tZdZGIdZRS(s Internal helper class used as a faux RPC stub when disconnected. This raises ClientDisconnected on all attribute accesses. This is a singleton class -- there should be only one instance, the global disconnected_stub, os it can be tested by identity. csIJtdS(N(sClientDisconnected(sselfsattr((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys __getattr__Is(s__name__s __module__s__doc__s __getattr__(((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysDisconnectedServerStub@siis ClientStoragecsQQtZdZY]eZ^eiZ_eZ`e i Z bdde de de dde e e dddde dZ?e dZUd Zcd Zmd Zvd Z|d ZdZdZdZdZdZdZdZOdZ\dZadZndZrdZ ~dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!d"Z(d#Z)d$Z*d%Z+d&Z,d'Z-e e d!dd(Z.*d)Z/6d*Z0=d+Z1De d,d-Z2jd.Z3td/Z4wd0Z5e d1Z6d2Z7d3Z8d4Z9dd5e d6Z:dd5e d7Z;d8Z<e d9Z=d:Z>d;Z? d<Z@d=ZA,d>ZB?d?ZCLd@ZDOe@ZEPeBZFQeDZGRS(AsA Storage class that is a network client to a remote storage. This is a faithful implementation of the Storage API. This class is thread-safe; transactions are serialized in tpc_begin(). s1isiii,csbttd|iiti| odpd|odpd|f|ottdn| t j oT| t j o | | jottdnttd| } n| t jo d } n||_t|_t |_t |_ti|_| |_d |_||_||_||_||_||_!d |_"t |_#t |_$t |_%hd d <d d <d d<d d<d d<d d<|_&|i'|_(t |_)g|_*h|_+|p t-||_ti.|_/t |_0ti1|_2g|_3ti1|_4t |_5t |_6%ti1|_7't8}|_:(| |_;)d|_<,|i=||-d|d||_A/|iB||0d|1d| |_E3| o4|iF| nQ9|iEiH o:|iEiIn<|iiJ o=|iAiKndS(s_ ClientStorage constructor. This is typically invoked from a custom_zodb.py file. All arguments except addr should be keyword arguments. Arguments: addr -- The server address(es). This is either a list of addresses or a single address. Each address can be a (hostname, port) tuple to signify a TCP/IP connection or a pathname string to signify a Unix domain socket connection. A hostname may be a DNS name or a dotted IP address. Required. storage -- The storage name, defaulting to '1'. The name must match one of the storage names supported by the server(s) specified by the addr argument. The storage name is displayed in the Zope control panel. cache_size -- The disk cache size, defaulting to 20 megabytes. This is passed to the ClientCache constructor. name -- The storage name, defaulting to ''. If this is false, str(addr) is used as the storage name. client -- A name used to construct persistent cache filenames. Defaults to None, in which case the cache is not persistent. See ClientCache for more info. debug -- Ignored. This is present only for backwards compatibility with ZEO 1. var -- When client is not None, this specifies the directory where the persistent cache files are created. It defaults to None, in whichcase the current directory is used. min_disconnect_poll -- The minimum delay in seconds between attempts to connect to the server, in seconds. Defaults to 5 seconds. max_disconnect_poll -- The maximum delay in seconds between attempts to connect to the server, in seconds. Defaults to 300 seconds. wait_for_server_on_startup -- A backwards compatible alias for the wait argument. wait -- A flag indicating whether to wait until a connection with a server is made, defaulting to true. wait_timeout -- Maximum time to wait for a connection before giving up. Only meaningful if wait is True. read_only -- A flag indicating whether this should be a read-only storage, defaulting to false (i.e. writing is allowed by default). read_only_fallback -- A flag indicating whether a read-only remote storage should be acceptable as a fallback when no writable storages are available. Defaults to false. At most one of read_only and read_only_fallback should be true. username -- string with username to be used when authenticating. These only need to be provided if you are connecting to an authenticated server storage. password -- string with plaintext password to be used when authenticated. Note that the authentication protocol is defined by the server and is detected by the ClientStorage upon connecting (see testConnection() and doAuth() for details). s)%s (pid=%d) created %s/%s for storage: %rsROsRWsfallbacksnormals1ClientStorage(): debug argument is no longer usedsZClientStorage(): conflicting values for wait and wait_for_server_on_startup; wait prevailssRClientStorage(): wait_for_server_on_startup is deprecated; please use wait insteadiislengthssizes ZEO Clientsnames supportsUndossupportsVersionsssupportsTransactionalUndossclientsvarstminstmaxN(Lslog2sINFOsselfs __class__s__name__sossgetpids read_onlysread_only_fallbacksstoragesdebugswait_for_server_on_startupsNoneswaitsPROBLEMsaddrs_addrsdisconnected_stubs_servers _connections_pending_servers threadingsEvents_readys _is_read_onlys_conn_is_read_onlys_storages_read_only_fallbacksusernames _usernamespasswords _passwordsrealms_realms_midtxn_disconnects _server_addrs_tfiles_picklers_infosTransactionBufferClasss_tbufs_dbs_serialss_serialdsnamesstrs Conditions _tpc_conds _transactionsLocks _oid_locks_oidss _load_locks _load_oids _load_statuss_locks get_timestampsts_tss_serials_oidsClientCacheClasss cache_sizesclientsvars_cachesConnectionManagerClasssmin_disconnect_pollsmax_disconnect_polls_rpc_mgrs_waits wait_timeoutsattempt_connectsconnectsisSetsopen(sselfsaddrsstorages cache_sizesnamesclientsdebugsvarsmin_disconnect_pollsmax_disconnect_pollswait_for_server_on_startupswaits wait_timeouts read_onlysread_only_fallbacksusernamespasswordsrealmst((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys__init__bsrPK                     B            cs?@|tj oAti|}nC|iiddI|iioJxJdowK|i i dL|i i oMPnN|oti|joOt t dPPnQt tdqYWnS|idS(Nssynciis Timed out waiting for connections(Waiting for cache verification to finish(stimeoutsNonestimesdeadlinesselfs_rpc_mgrsconnects _connectionsis_asyncs_readyswaitsisSetslog2sPROBLEMsINFOs _wait_sync(sselfstimeoutsdeadline((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys_wait?s cs~UXxqXdofY|iioZPn[ttd\|itjo_|iSna|iidq WdS(Nis(Waiting for cache verification to finishi( sselfs_readysisSetslog2sINFOs _connectionsNones_waitspending(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys _wait_syncUs cscde|iif|itj o g|iiht|_ni|itj o j|iikt|_ndS(s@Storage API: finalize the storage, releasing external resources.N(sselfs_tbufscloses_cachesNones_rpc_mgr(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysclosecscsmst||_dS(sStorage API: register a database for invalidation messages. This is called by ZODB.DB (and by some tests). The storage isn't really ready to use until after this call. N(sdbsselfs_db(sselfsdbslimit((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys registerDBmscsvwz|iiSdS(s>Return whether the storage is currently connected to a server.N(sselfs_readysisSet(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys is_connectedvscs7||i}|tj o|indS(sqHandle any pending invalidation messages. This is called by the sync method in ZODB.Connection. N(sselfs _connectionscnsNonespending(sselfscn((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyssync|s cs|io|i otdnt|}| o+ttd|i i |fdSn|\}}}| o3ttd|i i |ftdn||}|i|i|i|iSdS(Nsempty username or passwords %s: no such an auth protocol: %ss7%s: %s isn't a valid protocol, must have a Client classsinvalid protocol(sselfs _usernames _passwords AuthErrors get_modulesprotocolsmoduleslog2sPROBLEMs __class__s__name__s storage_classsclientsdb_classsstubscsstarts_realm(sselfsprotocolsstubscsdb_classsmodulesclients storage_class((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysdoAuths     csottd|d|_|i|}|i}ttd||oc|i ||}|o$ttd|i |ntt dt dny*|it|i|idSWnstij oa|i o nttd|it|iddd|_dSnXd S( s Internal: test the given connection. This returns: 1 if the connection is an optimal match, 0 if it is a suboptimal but acceptable match. It can also raise DisconnectedError or ReadOnlyError. This is called by ZEO.zrpc.ConnectionManager to decide which connection to use in case there are multiple, and some are read-only and others are read-write. This works by calling register() on the server. In read-only mode, register() is called with the read_only flag set. In writable mode and in read-only fallback mode, register() is called with the read_only flag cleared. In read-only fallback mode only, if the register() call raises ReadOnlyError, it is retried with the read-only flag set, and if this succeeds, this is deemed a suboptimal match. In all other cases, a succeeding register() call is deemed an optimal match, and any exception raised by register() is passed through. sTesting connection %ris!Server authentication protocol %rs Client authentication successfulsAuthentication failedis0Got ReadOnlyError; trying again with read_only=1s read_onlyN(slog2sINFOsconnsselfs_conn_is_read_onlysStorageServerStubClasssstubsgetAuthProtocolsauthsdoAuthsskeys setSessionKeysERRORs AuthErrorsregistersstrs_storages _is_read_onlys POSExceptions ReadOnlyErrors_read_only_fallback(sselfsconnsauthsstubsskey((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pystestConnections.      cs\|itjo dSn|itj o d}n d}|i|i|itj o|iin||_|ot t d|i nt t d|i |i |}g|_|ii|i|i||i o!t t d|in|idS(sInternal: start using the given connection. This is called by ConnectionManager after it has decided which connection should be used. NiisReconnected to storage: %ssConnected to storage: %ss(Waiting for cache verification to finish(sselfs_cachesNones _connections reconnectsset_server_addrsconnsget_addrscloseslog2sINFOs _server_addrsStorageServerStubClasssstubs_oidss_infosupdatesget_infos verify_cachesis_asyncs _wait_syncs_handle_extensions(sselfsconnsstubs reconnect((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysnotifyConnecteds*      csaxT|iiD]=}t|| o#t|||ii|nqWdS(N(sselfsgetExtensionMethodsskeyssnameshasattrssetattrs_serversextensionMethod(sselfsname((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys_handle_extensionss cst|tio||_ntot|tipt|d}y t i |\}}}Wn> t ij o,} ttd||f |}nX t||df|_dS(NisError resolving host: %s (%s)i(s isinstancesaddrstypess StringTypesselfs _server_addrs __debug__s TupleTypesAssertionErrorshostssockets gethostbyaddrs canonicalsaliasessaddrsserrorserrslog2sBLATHERsstr(sselfsaddrserrs canonicalshostsaddrssaliases((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysset_server_addrs$ cs>|itjo tnd|i|ifSdS(Ns%s:%s(sselfs _server_addrsNonesClientDisconnecteds_storage(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyssortKeys cs"|ii}#|tj o8$|i}%||joG&tt d(|ii )||_ *|i i +dSn.tt d|t|f0tt d||o t|f3|i|}4|tj oe5tt dt|d6|ii 7|i|8||_ 9|i i :dSnn<tt d>tid d |_?ti|id|_@d|i_B|ii|iC||_D|iEd Sd S( sInternal routine called to verify the cache. The return value (indicating which path we took) is used by the test suite. s5No verification necessary (last_inval_tid up-to-date)sno verificationslast inval tid: %r %s slast transaction: %r %ssRecovering %d invalidationsisquick verificationsVerifying cachessuffixs.invsfull verificationN(sselfs_caches getLastTidslast_inval_tidsNonesserverslastTransactionsltidslog2sINFOsopens_servers_readyssetstid2timesgetInvalidationsspairslensinvalidateTransactionstempfiles TemporaryFiles_tfilescPicklesPicklers_picklersfastsverifys zeoVerifys_pending_servers endZeoVerify(sselfsserverslast_inval_tidsltidspair((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys verify_caches8   '   cs[OTUttdt|iWt|_X|iiYt |_ Zd|_ dS(sInternal: notify that the server connection was terminated. This is called by ConnectionManager when the connection is closed or when certain problems with the connection occur. sDisconnected from storage: %siN( slog2sPROBLEMsreprsselfs _server_addrsNones _connections_readysclearsdisconnected_stubs_servers_midtxn_disconnect(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysnotifyDisconnectedOs   cs\]_|idSdS(sReturn the size of the storage.slengthN(sselfs_info(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys__len__\scs2aijd|i|iodpdfSdS(sWStorage API: return the storage name as a string. The return value consists of two parts: the name as determined by the name and addr argments to the ClientStorage constructor, and the string 'connected' or 'disconnected' in parentheses indicating whether the storage is (currently) connected. s%s (%s)s connecteds disconnectedN(sselfs__name__s is_connected(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysgetNameascsnop|idSdS(s;Storage API: an approximate size of the database, in bytes.ssizeN(sselfs_info(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysgetSizenscs r{||iidhSdS(sgetExtensionMethods This returns a dictionary whose keys are names of extra methods provided by this storage. Storage proxies (such as ZEO) should call this method to determine the extra methods that they need to proxy in addition to the standard storage methods. Dictionary values should be None; this will be a handy place for extra marshalling information, should we need it sextensionMethodsN(sselfs_infosget(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysgetExtensionMethodsrs cs~|idSdS(s,Storage API: return whether we support undo.s supportsUndoN(sselfs_info(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys supportsUndo~scs|idSdS(s0Storage API: return whether we support versions.ssupportsVersionsN(sselfs_info(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyssupportsVersionsscs|idSdS(s:Storage API: return whether we support transactional undo.ssupportsTransactionalUndoN(sselfs_info(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyssupportsTransactionalUndoscs,|io dSn |iSdS(s5Storage API: return whether we are in read-only mode.iN(sselfs _is_read_onlys_conn_is_read_only(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys isReadOnlys  cs\|iotin|i|j oti|i|ndS(s;Internal helper to check a transaction argument for sanity.N(sselfs _is_read_onlys POSExceptions ReadOnlyErrors _transactionstranssStorageTransactionError(sselfstrans((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys _check_transs  csi|i||ii||i}x'|D]}|i i |dq;W|SdS(s9Storage API: clear any changes made by the given version.sN( sselfs _check_transs transactions_servers abortVersionsversions_serialsoidssoids_tbufs invalidate(sselfsversions transactionsoidssoid((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys abortVersions cs|i||ii|||i}|o1x'|D]}|i i ||qHWn.x'|D]}|i i ||qyW|SdS(s:Storage API: commit the source version in the destination.N( sselfs _check_transs transactions_servers commitVersionssources destinations_serialsoidssoids_tbufs invalidate(sselfssources destinations transactionsoidsoids((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys commitVersions   ics#|ii|||SdS(sStorage API: return a sequence of HistoryEntry objects. This does not support the optional filter argument defined by the Storage API. N(sselfs_servershistorysoidsversionslength(sselfsoidsversionslength((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyshistoryscs|ii|SdS(s2Storage API: return current serial number for oid.N(sselfs_servers getSerialsoid(sselfsoid((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys getSerialscs |ii||SdS(s5Storage API: load a historical revision of an object.N(sselfs_servers loadSerialsoidsserial(sselfsoidsserial((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys loadSerialsc s|iiz1|ii||}|o |SnWd|iiX|i t jot n|i iz|iiz||_ d|_Wd|iiX|i i|\}}}}}|iizV|io9|iid|ii||||||nt |_ Wd|iiXWd|i iX|o|o ||jo||fSn(|o||fSnt|dS(sStorage API: return the data for a given object. This returns the pickle data and serial number for the object specified by the given object id and version, if they exist; otherwise a KeyError is raised. Nii(sselfs_locksacquires_cachesloadsoidsversionspairsreleases_serversNonesClientDisconnecteds _load_locks _load_oids _load_statusszeoLoadspsssvspvssvs checkSizesstoresKeyError( sselfsoidsversionspvssvspsssvspair((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysloadsD  $ & cs{|iiz4|ii|}|tj o |SnWd|iiX|i i|SdS(sStorage API: return the version, if any, that modfied an object. If no version modified the object, return an empty string. N( sselfs_locksacquires_cachesmodifiedInVersionsoidsvsNonesreleases_server(sselfsoidsv((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysmodifiedInVersionscs  |io tin |iizK|i o)|ii|_|ii n|ii SWd|ii XdS(s,Storage API: return a new object identifier.N( sselfs _is_read_onlys POSExceptions ReadOnlyErrors _oid_locksacquires_oidss_serversnew_oidssreversespopsrelease(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysnew_oids csT"%|tjo&ti}n'||d}(|ii||SdS(sStorage API: pack the storage. Deviations from the Storage API: the referencesf argument is ignored; two additional optional arguments wait and days are provided: wait -- a flag indicating whether to wait for the pack to complete; defaults to true. days -- a number of days to subtract from the pack time; defaults to zero. iQN(stsNonestimesdayssselfs_serverspackswait(sselfsts referencesfswaitsdays((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyspacks  cs*+,|io-t|i}.|i| }/|i|40xG|D0]<\}}1t|to 2|n3||i |?||ij o @dSnA|ii|iB|iSdS(s#Storage API: vote on a transaction.N(s transactionsselfs _transactions_serversvotes_serials_check_serials(sselfs transaction((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pystpc_vote=s  s csDEF|ioGtinH|iiId|_JxYJ|itj oEN|i|joO|ii PdSnQ|ii dqHWR||_S|ii U|tjo&Vt |i|_W|i }nYt||_Z|}\y2]|ii||i|i^|i||Wn4_a|itj ob|incnXe||_f|iig|iih|i2dS(s!Storage API: begin a transaction.iNi(sselfs _is_read_onlys POSExceptions ReadOnlyErrors _tpc_condsacquires_midtxn_disconnects _transactionsNonestxnsreleaseswaitstids get_timestamps_tssids TimeStamps_servers tpc_beginsusers descriptions _extensionsstatussdisconnected_stubsend_transactions_serials_tbufsclears_serialds_serials(sselfstxnstidsstatussid((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys tpc_beginDs:       csUjkn|i|_o|iipt|_q|iir|iidS(s%Internal helper to end a transaction.N( sselfs_serials_ltids _tpc_condsacquiresNones _transactionsnotifysrelease(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysend_transactionjs  cstu|iSdS(N(sselfs_ltid(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyslastTransactiontscswxy||ij o zdSn{zJy|ii|iWn&tj ottdnXWd|i i |i i |i 2|i XdS(s!Storage API: abort a transaction.Ns)ClientDisconnected in tpc_abort() ignored(s transactionsselfs _transactions_servers tpc_aborts_serialsClientDisconnectedslog2sBLATHERs_tbufsclears_serialds_serialssend_transaction(sselfs transaction((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys tpc_abortws  csN||ij o dSn|iiz|iotdn|ii|i }|i iz/|i |tj o|nWd|i iX|ii||i}to.|tjpt|djptd|Wd|ii|iXdS(s"Storage API: finish a transaction.Ns2Calling tpc_finish() on a disconnected transactionisunhandled serialnos: %s(s transactionsselfs _transactions _load_locksacquires_midtxn_disconnectsClientDisconnecteds_servers tpc_finishs_serialstids_locks _update_cachesfsNonesreleases_caches setLastTids_check_serialssrs __debug__slensAssertionErrorsend_transaction(sselfs transactionsfstidsr((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys tpc_finishs*   <cs|itjo dSn|ii|iiy|iiWn(tj o}t d|nXxdoy|ii }Wn(tj o}t d|nX|tjoPn|\}}}|tjo t}n|i|}|tjp |tjo|ii||n|ii||||qW|iidS(sInternal helper to handle objects modified by a transaction. This iterates over the objects in the transaction buffer and update or invalidate the cache. Ns=Unexpected error reading temporary file in client storage: %si(sselfs_cachesNones checkSizes_tbufsget_sizes begin_iterates ValueErrorsmsgsClientStorageErrorsnextstsoidsvspsss_serialdsResolvedSerials invalidatesupdatesclear(sselfsoidspssstsvsmsg((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys _update_caches0   !csi|i||ii||i}x'|D]}|i i |dq;W|SdS(sStorage API: undo a transaction. This is executed in a transactional context. It has no effect until the transaction is committed. It can be undone itself. Zope uses this to implement undo unless it is not supported by a storage. sN( sselfs _check_transstranss_serverstransactionalUndostrans_ids_serialsoidssoids_tbufs invalidate(sselfstrans_idstranssoidsoids((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pystransactionalUndos cs|iotin|ii|}|ii z1x'|D]}|i i |dq[WWd|ii X|SdS(sAStorage API: undo a transaction, writing directly to the storage.sN(sselfs _is_read_onlys POSExceptions ReadOnlyErrors_serversundostransaction_idsoidss_locksacquiresoids_caches invalidatesrelease(sselfstransaction_idsoidsoids((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysundos  ics#|ii|||SdS(s%Storage API: return undo information.N(sselfs_serversundoInfosfirstslasts specification(sselfsfirstslasts specification((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysundoInfoscs;|tj o gSn|ii||SdS(s1Storage API: return a sequence of TransactionDescription objects. The filter argument should be None or left unspecified, since it is impossible to pass the filter function to the server to be executed there. If filter is not None, an empty sequence is returned. N(sfiltersNonesselfs_serversundoLogsfirstslast(sselfsfirstslastsfilter((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysundoLogs cs|ii|SdS(s<Storage API: return whether the version has no transactions.N(sselfs_servers versionEmptysversion(sselfsversion((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys versionEmptyscs|ii|SdS(s:Storage API: return a sequence of versions in the storage.N(sselfs_serversversionssmax(sselfsmax((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysversionsscs|ii|dS(s>Server callback to pass a list of changed (oid, serial) pairs.N(sselfs_serialssextendsargs(sselfsargs((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys serialnosscs |ii|dS(s.Server callback to update the info dictionary.N(sselfs_infosupdatesdict(sselfsdict((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysinfoscs; |itjo dSn|ii|dS(ssServer callback to invalidate an (oid, version) pair. This is called as part of cache validation. N(sselfs_picklersNonesdumpsargs(sselfsargs((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysinvalidateVerify s cs|iizh} xl|D ]a\}}!||ijo"d|_n#|i i |d|$d|i |h|