1 # -*- coding: utf-8 -*-
2 ##############################################################################
4 # mojo, a Python library for implementing document based databases
5 # Copyright (C) 2013-2014 by Javier Sancho Fernandez <jsf at jsancho dot org>
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.
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.
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/>.
20 ##############################################################################
31 class ObjectId(object):
32 _inc = random.randint(0, 0xFFFFFF)
33 _inc_lock = threading.Lock()
42 # Secons since the Unix epoch
43 oid += struct.pack(">i", int(time.time()))
45 machine_hash = hashlib.md5()
46 machine_hash.update(socket.gethostname())
47 oid += machine_hash.digest()[0:3]
49 oid += struct.pack(">H", os.getpid() % 0xFFFF)
51 ObjectId._inc_lock.acquire()
52 oid += struct.pack(">i", ObjectId._inc)[1:4]
54 ObjectId._inc_lock.release()
59 return binascii.hexlify(self.__id)
62 return "ObjectId('%s')" % (str(self),)