-í Ú„?cs¼dZdkZdkZdkZdkZdkZdkZdkZdkl Z l Z dk l Z dk lZlZlZlZdklZdklZdklZdklZd klZlZlZlZlZd ei ƒd „Z!yd k"l#Z#Wne$j o d Z#nXd„Z%e&d„Z'dfd„ƒYZ(e(ƒZ)ddZ*de+fd„ƒYZ,ye-Wn)e.j ode/fd„ƒYZ-nXdfd„ƒYZ0dS(sžThe 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:%dcst|||ƒdS(N(sLOGssubsysstypesmsg(stypesmsgssubsys((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyslog2(s(sResolvedSerialsrscstt|ƒƒSdS(N(sstrs TimeStampstid(stid((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pystid2time0scs[tiƒ}ttti|ƒd |dfƒ}|tj o|i|ƒ}n|SdS(sÛInternal 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  ' sDisconnectedServerStubcstZdZd„ZRS(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. cs tƒ‚dS(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@s iis ClientStoragecs‘tZdZeZeiZeZe i Z dde de de dde e e dddde d„Ze d„Zd „Zd „Zd „Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Z d„Z!d„Z"d„Z#d„Z$d„Z%d„Z&d „Z'd!d"„Z(d#„Z)d$„Z*d%„Z+d&„Z,d'„Z-e e d!dd(„Z.d)„Z/d*„Z0d+„Z1e d,d-„Z2d.„Z3d/„Z4d0„Z5e d1„Z6d2„Z7d3„Z8d4„Z9dd5e d6„Z:dd5e d7„Z;d8„Z<e d9„Z=d:„Z>d;„Z?d<„Z@d=„ZAd>„ZBd?„ZCd@„ZDe@ZEeBZFeDZGRS(AsÍA 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,csttd|iitiƒ| odpd|odpd|fƒ|ottdƒn| t j oB| t j o | | jottdƒnttdƒ| } 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 |_6ti1ƒ|_7t8ƒ}|_:| |_;d|_<|i=||d|d|ƒ|_A|iB||d|d| ƒ|_E| o|iF| ƒnE|iEiHƒ o|iEiIƒn|iiJƒ o|iAiKƒndS(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__bsrPH                    ?            csÃ|tj otiƒ|}n|iiddƒ|iiƒoqxjdob|i i dƒ|i i ƒoPn|otiƒ|jot t dƒPnt tdƒqGWn |iƒdS(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  cscx\doT|iiƒoPnttdƒ|itjo|iƒSn|iidƒqWdS(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 cse|iiƒ|itj o|iiƒt|_n|itj o|iiƒt|_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.pysclosecs    cs ||_dS(sÂStorage 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 registerDBmscs|iiƒSdS(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_connectedvscs(|i}|tj o|iƒndS(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 o td‚nt|ƒ}| o%ttd|i i |fƒdSn|\}}}| o*ttd|i i |fƒtd‚n||ƒ}|i|i|i|iƒSdS(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.pysdoAuth‰s    cs'ttd|ƒd|_|i|ƒ}|iƒ}ttd|ƒ|oQ|i ||ƒ}|ottdƒ|i |ƒntt dƒt d‚ny$|it|iƒ|iƒdSWn^tij oO|i o‚nttdƒ|it|iƒddƒd|_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.pystestConnection s.        cs|itjodSn|itj o d}nd}|i|iƒƒ|itj o|iiƒn||_|ot t d|i ƒnt t d|i ƒ|i |ƒ}g|_|ii|iƒƒ|i|ƒ|iƒ ot t dƒ|iƒn|iƒdS(sŸInternal: 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.pysnotifyConnectedÐs*     csRxK|iƒiƒD]7}t||ƒ o t|||ii|ƒƒnqWdS(N(sselfsgetExtensionMethodsskeyssnameshasattrssetattrs_serversextensionMethod(sselfsname((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys_handle_extensions÷scs›t|tiƒo ||_nx|d}yti|ƒ\}}}Wn5ti j o&}ttd||fƒ|}nXt||dfƒ|_dS(NisError resolving host: %s (%s)i(s isinstancesaddrstypess StringTypesselfs _server_addrshostssockets gethostbyaddrs canonicalsaliasessaddrsserrorserrslog2sBLATHERsstr(sselfsaddrserrs canonicalshostsaddrssaliases((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysset_server_addrüs   cs2|itjo t‚nd|i|ifSdS(Ns%s:%s(sselfs _server_addrsNonesClientDisconnecteds_storage(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyssortKeys cs•|iiƒ}|tj o|iƒ}||jo8tt dƒ|ii ƒ||_ |i i ƒdSntt d|t|ƒfƒtt d||o t|ƒfƒ|i|ƒ}|tj oStt dt|dƒƒ|ii ƒ|i|Œ||_ |i i ƒdSnntt dƒtid d ƒ|_ti|idƒ|_d|i_|ii|iƒ||_|iƒd Sd S( s’Internal 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       $          csFttdt|iƒƒt|_|iiƒt |_ d|_ dS(sËInternal: 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__\scs)d|i|iƒodpdfSdS(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.pysgetNameascs|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|iidhƒSdS(s³getExtensionMethods 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.pyssupportsVersions‚scs|idSdS(s:Storage API: return whether we support transactional undo.ssupportsTransactionalUndoN(sselfs_info(sself((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyssupportsTransactionalUndo†scs|iodSn|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 isReadOnlyŠs csG|iotiƒ‚n|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_trans”s   csQ|i|ƒ|ii||iƒ}x!|D]}|i i |dƒq,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 abortVersionœs  csƒ|i|ƒ|ii|||iƒ}|o(x!|D]}|i i ||ƒq6Wn%x!|D]}|i i ||ƒq^W|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 commitVersion­s ics|ii|||ƒSdS(s Storage 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.pyshistory»scs|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 getSerialÃscs|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 loadSerialÇsc s|iiƒz(|ii||ƒ}|o|SnWd|iiƒX|i t jo t ƒ‚n|i iƒzÁ|iiƒz||_ d|_Wd|iiƒX|i i|ƒ\}}}}}|iiƒzJ|io3|iidƒ|ii||||||ƒnt |_ Wd|iiƒXWd|i iƒX|o|o ||jo||fSn|o||fSnt|‚dS(síStorage 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.pysloadËsD       !  # cs]|iiƒz+|ii|ƒ}|tj o|SnWd|iiƒX|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.pysmodifiedInVersionús   cs{|iotiƒ‚n|iiƒz?|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   csB|tjotiƒ}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. i€QN(stsNonestimesdayssselfs_serverspackswait(sselfsts referencesfswaitsdays((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pyspacks  csz|iolt|iƒ}|i| }|i|4x;|D]3\}}t|tƒo |‚n||i |y|ii|iƒWn tj ottdƒnXWd|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  cs×||ij odSn|iiƒz“|iotdƒ‚n|ii|i ƒ}|i iƒz&|i ƒ|tj o |ƒnWd|i iƒX|ii|ƒ|iƒ}Wd|iiƒ|iƒXdS(s"Storage API: finish a transaction.Ns2Calling tpc_finish() on a disconnected transaction(s transactionsselfs _transactions _load_locksacquires_midtxn_disconnectsClientDisconnecteds_servers tpc_finishs_serialstids_locks _update_cachesfsNonesreleases_caches setLastTids_check_serialssrsend_transaction(sselfs transactionsfstidsr((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pys tpc_finishŠs*       csN|itjodSn|ii|iiƒƒy|iiƒWn"tj o}t d|‚nXxÓdoËy|ii ƒ}Wn"tj o}t d|‚nX|tjoPn|\}}}|tjo t}n|i|}|tjp |tjo|ii||ƒn|ii||||ƒqjW|iiƒdS(s³Internal 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_cache¥s0    csQ|i|ƒ|ii||iƒ}x!|D]}|i i |dƒq,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.pystransactionalUndoÍs csz|iotiƒ‚n|ii|ƒ}|ii ƒz(x!|D]}|i i |dƒqCWWd|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.pysundoÜs  iìÿÿÿcs|ii|||ƒSdS(s%Storage API: return undo information.N(sselfs_serversundoInfosfirstslasts specification(sselfsfirstslasts specification((s9/usr/pkg/lib/python2.2/site-packages/ZEO/ClientStorage.pysundoInfoéscs,|tj ogSn|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.pysundoLogís 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 versionEmptyùscs|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.pysversionsýscs|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,|itjodSn|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 scsÓ|iiƒz±h}x]|D]U\}}||ijo d|_n|i i |d|ƒd|i |hƒ|