910
920
''', (put_timestamp, delete_timestamp, object_count, bytes_used))
913
def get_random_objects(self, max_count=100):
915
Get random objects from the DB. This is used by the container_auditor
916
when testing random objects for existence.
918
:param max_count: maximum number of objects to get
920
:returns: list of object names
925
if not self.stale_reads_ok:
928
with self.get() as conn:
929
row = conn.execute('''
930
SELECT ROWID FROM object ORDER BY ROWID DESC LIMIT 1
934
max_rowid = row['ROWID']
935
for _junk in xrange(min(max_count, max_rowid)):
936
row = conn.execute('''
937
SELECT name FROM object WHERE ROWID >= ? AND +deleted = 0
939
''', (randint(0, max_rowid),)).fetchone()
941
rv.append(row['name'])
944
923
def list_objects_iter(self, limit, marker, end_marker, prefix, delimiter,
945
924
path=None, format=None):
1035
1018
with self.get() as conn:
1037
1020
for rec in item_list:
1039
DELETE FROM object WHERE name = ? AND
1041
''', (rec['name'], rec['created_at']))
1023
WHERE name = ? AND (created_at < ?)
1025
if self.get_db_version(conn) >= 1:
1026
query += ' AND deleted IN (0, 1)'
1027
conn.execute(query, (rec['name'], rec['created_at']))
1028
query = 'SELECT 1 FROM object WHERE name = ?'
1029
if self.get_db_version(conn) >= 1:
1030
query += ' AND deleted IN (0, 1)'
1031
if not conn.execute(query, (rec['name'],)).fetchall():
1043
1032
conn.execute('''
1044
1033
INSERT INTO object (name, created_at, size,
1045
1034
content_type, etag, deleted)
1046
1035
VALUES (?, ?, ?, ?, ?, ?)
1047
1036
''', ([rec['name'], rec['created_at'], rec['size'],
1048
1037
rec['content_type'], rec['etag'], rec['deleted']]))
1049
except sqlite3.IntegrityError:
1052
1039
max_rowid = max(max_rowid, rec['ROWID'])
1164
1152
''', (self.account, normalize_timestamp(time.time()), str(uuid4()),
1165
1153
put_timestamp))
1155
def get_db_version(self, conn):
1156
if self._db_version == -1:
1157
self._db_version = 0
1158
for row in conn.execute('''
1159
SELECT name FROM sqlite_master
1160
WHERE name = 'ix_container_deleted_name' '''):
1161
self._db_version = 1
1162
return self._db_version
1167
1164
def update_put_timestamp(self, timestamp):
1169
1166
Update the put_timestamp. Only modifies it if it is greater than
1413
1410
FROM account_stat
1414
1411
''').fetchone()
1416
def get_random_containers(self, max_count=100):
1418
Get random containers from the DB. This is used by the
1419
account_auditor when testing random containerss for existence.
1421
:param max_count: maximum number of containers to get
1423
:returns: list of container names
1428
if not self.stale_reads_ok:
1431
with self.get() as conn:
1432
row = conn.execute('''
1433
SELECT ROWID FROM container ORDER BY ROWID DESC LIMIT 1
1437
max_rowid = row['ROWID']
1438
for _junk in xrange(min(max_count, max_rowid)):
1439
row = conn.execute('''
1440
SELECT name FROM container WHERE
1441
ROWID >= ? AND +deleted = 0
1443
''', (randint(0, max_rowid),)).fetchone()
1445
rv.append(row['name'])
1446
return list(set(rv))
1448
1413
def list_containers_iter(self, limit, marker, end_marker, prefix,
1529
1498
record = [rec['name'], rec['put_timestamp'],
1530
1499
rec['delete_timestamp'], rec['object_count'],
1531
1500
rec['bytes_used'], rec['deleted']]
1534
INSERT INTO container (name, put_timestamp,
1535
delete_timestamp, object_count, bytes_used,
1537
VALUES (?, ?, ?, ?, ?, ?)
1539
except sqlite3.IntegrityError:
1540
curs = conn.execute('''
1541
SELECT name, put_timestamp, delete_timestamp,
1542
object_count, bytes_used, deleted
1543
FROM container WHERE name = ? AND
1544
(put_timestamp < ? OR delete_timestamp < ? OR
1545
object_count != ? OR bytes_used != ?)''',
1546
(rec['name'], rec['put_timestamp'],
1547
rec['delete_timestamp'], rec['object_count'],
1549
curs.row_factory = None
1550
row = curs.fetchone()
1554
if record[i] is None and row[i] is not None:
1556
if row[1] > record[1]: # Keep newest put_timestamp
1558
if row[2] > record[2]: # Keep newest delete_timestamp
1560
conn.execute('DELETE FROM container WHERE name = ?',
1562
# If deleted, mark as such
1563
if record[2] > record[1] and \
1564
record[3] in (None, '', 0, '0'):
1570
INSERT INTO container (name, put_timestamp,
1571
delete_timestamp, object_count, bytes_used,
1573
VALUES (?, ?, ?, ?, ?, ?)
1575
except sqlite3.IntegrityError:
1502
SELECT name, put_timestamp, delete_timestamp,
1503
object_count, bytes_used, deleted
1504
FROM container WHERE name = ?
1506
if self.get_db_version(conn) >= 1:
1507
query += ' AND deleted IN (0, 1)'
1508
curs = conn.execute(query, (rec['name'],))
1509
curs.row_factory = None
1510
row = curs.fetchone()
1514
if record[i] is None and row[i] is not None:
1516
if row[1] > record[1]: # Keep newest put_timestamp
1518
if row[2] > record[2]: # Keep newest delete_timestamp
1520
# If deleted, mark as such
1521
if record[2] > record[1] and \
1522
record[3] in (None, '', 0, '0'):
1527
DELETE FROM container WHERE name = ? AND
1531
INSERT INTO container (name, put_timestamp,
1532
delete_timestamp, object_count, bytes_used,
1534
VALUES (?, ?, ?, ?, ?, ?)
1578
1537
max_rowid = max(max_rowid, rec['ROWID'])