· 8 years ago · Jul 24, 2018, 01:16 PM
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3
4import datetime
5import os
6import sqlite3
7import sys
8
9import fsscan
10
11
12class EntriesDB:
13
14 def __init__(self, database):
15 self.database = database
16 self.connection = sqlite3.connect(database)
17
18 def __repr__(self):
19 return "<%s(%s)>" % (self.__class__.__name__, self.database)
20
21 def __del__(self):
22 self.close()
23
24 def close(self):
25 self.connection.close()
26
27 def table_already_exists(self):
28 query = """
29 SELECT name
30 FROM sqlite_master
31 WHERE type='table' AND name='entries';
32 """
33 with self.connection:
34 cursor = self.connection.execute(query)
35 result = cursor.fetchone()
36 return result and 'entries' in result
37
38 def create_new_table(self):
39 self.delete_table()
40 self.create_table()
41
42 def delete_table(self):
43 query = """DROP TABLE IF EXISTS entries;"""
44 self.execute(query)
45
46 def create_table(self):
47 query = """
48 CREATE TABLE entries (
49 disk TEXT,
50 directory TEXT,
51 partition TEXT,
52 prof NUMERIC,
53 path TEXT,
54 name TEXT,
55 lien TEXT,
56 size NUMERIC,
57 created TEXT,
58 accessed TEXT,
59 modified TEXT
60 );
61 """
62 self.execute(query)
63
64 def create_index(self):
65 query = """
66 CREATE UNIQUE INDEX cle_unique
67 ON entries (disk, partition, prof, path);
68 """
69 self.execute(query)
70
71 def insert_rows(self, rows):
72 query = """INSERT INTO entries VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
73"""
74 self.execute_many(query, rows)
75
76 def execute(self, query):
77 with self.connection:
78 self.connection.execute(query)
79
80 def execute_many(self, query, params):
81 with self.connection:
82 self.connection.executemany(query, params)
83
84
85def get_path_stats(entries, disk, directory, partition):
86 fse = sys.getfilesystemencoding()
87 for entry in entries:
88
89 try:
90 # Some entries are no decodable
91 entry = str(entry).encode(fse, errors="strict").decode(fse)
92 except UnicodeEncodeError:
93 # Replace non decodable characters with '?'
94 entry = str(entry).encode(fse, errors="replace").decode(fse)
95 print("Encoding error with %s" % entry, file=sys.stderr)
96 continue
97
98 entry_name = os.path.basename(entry)
99 stats = os.stat(entry, follow_symlinks=False)
100# stats = os.lstat(entry)
101 if os.path.islink(entry):
102 link = os.readlink(entry)
103 else:
104 link = ' '
105 profondeur = len(entry.split('/')) -1
106 ctime = datetime.datetime.fromtimestamp(stats.st_ctime)
107 atime = datetime.datetime.fromtimestamp(stats.st_atime)
108 mtime = datetime.datetime.fromtimestamp(stats.st_mtime)
109 yield (
110 disk, directory, partition, profondeur, entry, entry_name, link,
111 stats.st_size, ctime, atime, mtime
112 )
113
114
115def main():
116 database = "fsscan_entries8.db"
117 db = EntriesDB(database)
118
119 if not db.table_already_exists():
120 db.create_table()
121 db.create_index()
122
123 config = {
124 # "current_working_dir": os.getcwd(),
125 "HGST_HTS_721010A9E630": "/media/anne/f63e1378-ada9-43db-8136-4f55c6b6fb4e",
126 # "HGST_HTS_721010A9E630": "/media/anne/Donnees1", out
127 # "HGST_HTS_721010A9E630": "/media/anne/310a972d-cffe-44dc-9b48-6b56a0539158",
128 # "WDC_WD20_EFRX-68EUZN0": "/media/anne/e63b0852-e3c8-4690-b779-28a6f785210c",
129 # "WDC_WD20_EFRX-68EUZN0": "/media/anne/80853608-8605-4222-998e-c0956aacc251",
130 # "WDC_WD20_EFRX-68EUZN0": "/media/anne/38ab3048-75e5-49e0-8f94-b914befdc246",
131 # "WDC_WD20_EFRX-68EUZN0": "/media/anne/Donnees1",
132 # "WDC_WD20_EFRX-68EUZN0": "/media/anne/Donnees2",
133 # "disk2": "path_to_directory_2",
134 }
135
136 for disk, directory in config.items():
137
138 partition = os.path.basename(directory)
139 os.chdir( directory )
140 directory1 = "."
141
142 time0 = datetime.datetime.utcnow()
143
144 entries = fsscan.run(directory1, recursive=True)
145 entries = get_path_stats(entries, disk, directory, partition)
146
147 db.insert_rows(entries)
148
149 # SELECT COUNT(*) as nbEnregistrements FROM entries
150
151 time1 = datetime.datetime.utcnow()
152 print("Done ! (%s - %s)" % ((time1 - time0), directory))
153
154
155if __name__ == '__main__':
156 main()