]> git.jsancho.org Git - mojodb.git/blob - objectid.py
Savepoints to protect integrity of documents
[mojodb.git] / objectid.py
1 # -*- coding: utf-8 -*-
2 ##############################################################################
3 #
4 #    mojo, a Python library for implementing document based databases
5 #    Copyright (C) 2013-2014 by Javier Sancho Fernandez <jsf at jsancho dot org>
6 #
7 #    This program is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU General Public License as published by
9 #    the Free Software Foundation, either version 3 of the License, or
10 #    (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU General Public License for more details.
16 #
17 #    You should have received a copy of the GNU General Public License
18 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##############################################################################
21
22 import binascii
23 import hashlib
24 import os
25 import random
26 import socket
27 import struct
28 import time
29 import threading
30
31 class ObjectId(object):
32     _inc = random.randint(0, 0xFFFFFF)
33     _inc_lock = threading.Lock()
34
35     __id = ""
36
37     def __init__(self):
38         self.__generate()
39
40     def __generate(self):
41         oid = ""
42         # Secons since the Unix epoch
43         oid += struct.pack(">i", int(time.time()))
44         # Machine Identifier
45         machine_hash = hashlib.md5()
46         machine_hash.update(socket.gethostname())
47         oid += machine_hash.digest()[0:3]
48         # Process Id
49         oid += struct.pack(">H", os.getpid() % 0xFFFF)
50         # Counter
51         ObjectId._inc_lock.acquire()
52         oid += struct.pack(">i", ObjectId._inc)[1:4]
53         ObjectId._inc += 1
54         ObjectId._inc_lock.release()
55
56         self.__id = oid
57
58     def __str__(self):
59         return binascii.hexlify(self.__id)
60
61     def __repr__(self):
62         return "ObjectId('%s')" % (str(self),)