��UV� � @ s� d d l m Z m Z d d l Z d d l Z y e Wn e k rP e Z Yn Xd d l m Z m Z m Z m Z m Z Gd d � d e � Z d S)� )�absolute_import�divisionN� )�LockBase� NotLocked� NotMyLock�LockTimeout� AlreadyLockedc @ sy e Z d Z d Z d Z d d d d � Z d d d � Z d d � Z d d � Z d d � Z d d � Z d d � Z d S)�SQLiteLockFilezDemonstrate SQL-based locking.NTc C s t j | | | | � t | j � | _ t | j � | _ t j d k r� d d l } | j � \ } } t j | � t j | � ~ ~ | t _ d d l } | j t j � | _ | j j � } y | j d � Wn | j k r� Yn0 X| j j � d d l } | j t j t j � d S)zu >>> lock = SQLiteLockFile('somefile') >>> lock = SQLiteLockFile('somefile', threaded=False) Nr zGcreate table locks( lock_file varchar(32), unique_name varchar(32)))r �__init__�unicode� lock_file�unique_namer �testdb�tempfile�mkstemp�os�close�unlink�sqlite3�connect� connection�cursor�executeZOperationalError�commit�atexit�register) �self�pathZthreaded�timeoutr Z_fdr r �cr � r! �/sqlitelockfile.pyr s( zSQLiteLockFile.__init__c C s� | d k r | n | j } t j � } | d k rI | d k rI | | 7} | d k r^ d } n | d k rs d } n | d } | j j � } x2| j � s%| j d | j | j f � | j j � | j d | j f � | j � } t | � d k r| j d | j f � | j j � q]d Sn8 | j d | j f � | j � } t | � d k r]d S| d k r�t j � | k r�| d k r�t d | j � � n t d | j � � t j | � q� Wd S) Nr g�������?� z;insert into locks (lock_file, unique_name) values (?, ?)z*select * from locks where unique_name = ?r z(delete from locks where unique_name = ?z&Timeout waiting to acquire lock for %sz%s is already locked)r �timer r � is_lockedr r r r �fetchall�lenr r r �sleep)r r �end_time�waitr �rowsr! r! r"