2022-11-12 21:35:50 +01:00
|
|
|
import os,shutil,hashlib,re
|
|
|
|
from uuid import uuid4
|
|
|
|
import sqlite3 as sql
|
2022-11-16 10:36:34 +01:00
|
|
|
from config import *
|
2022-11-12 21:35:50 +01:00
|
|
|
|
|
|
|
class database():
|
|
|
|
def __init__(self,filepath):
|
|
|
|
self.connection=None
|
|
|
|
self.crsr=None
|
|
|
|
if not os.path.exists(filepath) :
|
|
|
|
self.create_database(filepath)
|
|
|
|
else:
|
|
|
|
self.connection = sql.connect(filepath)
|
|
|
|
self.crsr = self.connection.cursor()
|
2022-11-16 20:18:38 +01:00
|
|
|
|
2022-11-12 21:35:50 +01:00
|
|
|
def add_index(self,vallist):
|
2022-11-16 09:12:37 +01:00
|
|
|
# compile the options into a command for the SQLite database
|
2022-11-12 21:35:50 +01:00
|
|
|
colstring=",".join(self.collist)
|
|
|
|
valstring="'{}'".format("','".join(vallist))
|
|
|
|
self.crsr.execute("""INSERT INTO {table} ({cols})
|
|
|
|
VALUES ({vals});
|
|
|
|
""".format(table=self.name,cols=colstring,vals=valstring))
|
|
|
|
self.connection.commit()
|
2022-11-16 19:30:32 +01:00
|
|
|
|
2022-11-12 21:35:50 +01:00
|
|
|
def create_database(self, filepath):
|
2022-11-16 09:12:37 +01:00
|
|
|
# create the database and tables
|
2022-11-12 21:35:50 +01:00
|
|
|
self.connection = sql.connect(filepath)
|
|
|
|
self.crsr = self.connection.cursor()
|
|
|
|
sqlcommand = """CREATE TABLE FILES(
|
|
|
|
FILE TEXT PRIMARY KEY NOT NULL,
|
|
|
|
HASH TEXT NOT NULL,
|
|
|
|
TITLE TEXT ,
|
|
|
|
SOURCE TEXT ,
|
|
|
|
CATEGORY TEXT NOT NULL,
|
|
|
|
TAGS TEXT ,
|
|
|
|
CONTENT TEXT
|
|
|
|
); """
|
|
|
|
self.crsr.execute(sqlcommand)
|
|
|
|
'''sqlcommand = """CREATE TABLE META(
|
2022-11-17 10:40:38 +01:00
|
|
|
CATEGORY TEXT PRIMARY KEY NOT NULL,
|
|
|
|
ALIAS TEXT,
|
|
|
|
DESC TEXT
|
2022-11-12 21:35:50 +01:00
|
|
|
); """
|
|
|
|
self.crsr.execute(sqlcommand)'''
|
2022-11-16 10:36:34 +01:00
|
|
|
|
|
|
|
def delete_index(self,typ,item):
|
|
|
|
self.crsr.execute("DELETE FROM {} WHERE {}='{}'".format(self.name,typ,item))
|
|
|
|
self.connection.commit()
|
|
|
|
return
|
|
|
|
|
2022-11-12 21:35:50 +01:00
|
|
|
def get_col(self,column = "*"):
|
2022-11-16 09:12:37 +01:00
|
|
|
# get the column of some table. If no options given, return all columns
|
2022-11-12 21:35:50 +01:00
|
|
|
self.crsr.execute("SELECT {} FROM {}".format(column,self.name))
|
2022-11-16 09:12:37 +01:00
|
|
|
tres=self.crsr.fetchall()
|
|
|
|
res=[]
|
|
|
|
for i in tres:
|
|
|
|
res.append(i)
|
|
|
|
# if the table is empty, return ".".
|
|
|
|
#print(column,"res ",res)
|
2022-11-12 21:35:50 +01:00
|
|
|
if not res:
|
|
|
|
res="."
|
|
|
|
return res
|
2022-11-16 19:30:32 +01:00
|
|
|
|
2022-11-16 10:36:34 +01:00
|
|
|
def get_item(self,column,where):
|
2022-11-16 19:30:32 +01:00
|
|
|
tres=[]
|
2022-11-16 09:12:37 +01:00
|
|
|
if column == "*":
|
|
|
|
for col in self.collist:
|
2022-11-16 19:30:32 +01:00
|
|
|
temp_list=[]
|
2022-11-16 09:12:37 +01:00
|
|
|
self.crsr.execute("SELECT * FROM {} WHERE {} GLOB '*{}*'".format(self.name,col,where))
|
2022-11-16 19:30:32 +01:00
|
|
|
temp_list=self.crsr.fetchall()
|
|
|
|
if temp_list:
|
|
|
|
for i in temp_list:
|
|
|
|
if not i in tres:
|
|
|
|
tres.append(i)
|
2022-11-16 09:12:37 +01:00
|
|
|
else:
|
|
|
|
self.crsr.execute("SELECT * FROM {} WHERE {} GLOB '*{}*'".format(self.name,column,where))
|
2022-11-16 19:30:32 +01:00
|
|
|
tres=self.crsr.fetchall()
|
2022-11-16 09:12:37 +01:00
|
|
|
#print("Tres: ",tres)
|
|
|
|
n=0
|
|
|
|
res=[]
|
|
|
|
for i in tres:
|
|
|
|
m=0
|
|
|
|
for j in tres:
|
|
|
|
if i in j and n!=m:
|
|
|
|
continue
|
|
|
|
else:
|
|
|
|
res.append(i)
|
|
|
|
m+=1
|
|
|
|
n+=1
|
|
|
|
#print("RES: ",tres)
|
|
|
|
# if the table is empty, return ".".
|
|
|
|
if not res:
|
|
|
|
return ["."]
|
|
|
|
return res
|
2022-11-16 19:30:32 +01:00
|
|
|
|
|
|
|
def update_index(self,typ,update,filehash):
|
|
|
|
self.crsr.execute("UPDATE {} SET {}='{}' WHERE HASH='{}'".format(self.name,typ,update,filehash))
|
|
|
|
self.connection.commit()
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
2022-11-12 21:35:50 +01:00
|
|
|
class metatable(database):
|
2022-11-16 19:30:32 +01:00
|
|
|
def __init__(self,filepath = CONFIG_DIR + "/index.db"):
|
2022-11-12 21:35:50 +01:00
|
|
|
self.name="META"
|
2022-11-17 10:40:38 +01:00
|
|
|
self.collist=["CATEGORY","ALIAS","DESCRIPTION"]
|
2022-11-12 21:35:50 +01:00
|
|
|
super().__init__(filepath)
|
2022-11-17 10:40:38 +01:00
|
|
|
|
|
|
|
def add_index(self,alias,dirname,desc=""):
|
2022-11-12 21:35:50 +01:00
|
|
|
super().add_index(vallist)
|
|
|
|
|
|
|
|
class filestable(database):
|
2022-11-16 19:30:32 +01:00
|
|
|
def __init__(self,filepath = CONFIG_DIR + "/index.db"):
|
2022-11-12 21:35:50 +01:00
|
|
|
self.name="FILES"
|
|
|
|
self.collist=["FILE","HASH","TITLE","SOURCE","CATEGORY","TAGS","CONTENT"]
|
|
|
|
super().__init__(filepath)
|
2022-11-16 19:30:32 +01:00
|
|
|
|
2022-11-16 09:12:37 +01:00
|
|
|
def add_index(self,filepath,category,title="",source="",tags="",content=""):
|
|
|
|
filehash=self.get_hash(filepath) # make of hash of file before copy
|
2022-11-16 19:30:32 +01:00
|
|
|
n=0
|
2022-11-16 09:12:37 +01:00
|
|
|
category="default" if not category else category
|
|
|
|
if filehash in self.get_col("HASH"):
|
2022-11-12 21:35:50 +01:00
|
|
|
print("This file already exists!")
|
|
|
|
return
|
|
|
|
filetype=os.path.splitext(filepath)[1]
|
|
|
|
filename=str(uuid4()) + filetype
|
|
|
|
if not os.path.exists("{}/{}".format(ROOT_DIR,category)):
|
|
|
|
os.makedirs("{}/{}".format(ROOT_DIR,category))
|
2022-11-16 09:12:37 +01:00
|
|
|
# try to copy the file, return if error.
|
2022-11-12 21:35:50 +01:00
|
|
|
try:
|
|
|
|
shutil.copy(filepath,"{}/{}/{}".format(ROOT_DIR,category,filename))
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
|
|
|
print("COULDN'T COPY FILE TO DESTINATION!")
|
2022-11-16 09:12:37 +01:00
|
|
|
return
|
2022-11-16 19:30:32 +01:00
|
|
|
#print("Executing")
|
2022-11-12 21:35:50 +01:00
|
|
|
vallist=[filename,filehash,title,source,category,tags,content]
|
|
|
|
super().add_index(vallist)
|
2022-11-16 19:30:32 +01:00
|
|
|
|
|
|
|
def check_index(self):
|
|
|
|
hash_list=[]
|
|
|
|
path_list=[]
|
|
|
|
for i in self.get_col():
|
|
|
|
filename=i[0]
|
|
|
|
category=i[4]
|
|
|
|
filehash1=i[1]
|
|
|
|
filepath="{}/{}/{}".format(ROOT_DIR,category,filename)
|
|
|
|
if not os.path.exists(filepath):
|
|
|
|
path_list.append(i)
|
|
|
|
try:
|
|
|
|
filehash2=self.get_hash(filepath)
|
|
|
|
if not filehash1 == filehash2:
|
|
|
|
hash_list.append(i)
|
|
|
|
except Exception:
|
|
|
|
path_list.append(i)
|
|
|
|
|
|
|
|
return hash_list,path_list
|
2022-11-16 10:36:34 +01:00
|
|
|
|
|
|
|
def delete_index(self,sel_list):
|
|
|
|
self.get_item("HASH",sel_list[1])
|
|
|
|
super().delete_index("HASH",sel_list[1])
|
|
|
|
|
2022-11-16 19:30:32 +01:00
|
|
|
def update_index(self,typ,update,sel_list):
|
|
|
|
typ=typ.upper()
|
|
|
|
if typ in ["FILE","HASH"]:
|
|
|
|
print("This type can't be changed!")
|
|
|
|
return 1
|
|
|
|
category=sel_list[4]
|
|
|
|
filehash=sel_list[1]
|
|
|
|
filename=sel_list[0]
|
|
|
|
super().update_index(typ, update, filehash)
|
|
|
|
if typ in ["CATEGORY"]:
|
|
|
|
if not os.path.exists("{}/{}".format(ROOT_DIR,update)):
|
|
|
|
os.makedirs("{}/{}".format(ROOT_DIR,update))
|
|
|
|
shutil.move("{}/{}/{}".format(ROOT_DIR,category,filename), "{}/{}/{}".format(ROOT_DIR,update,filename))
|
|
|
|
|
|
|
|
def sql_compare_list(self,typ,firstlist,secondlist):
|
2022-11-16 09:12:37 +01:00
|
|
|
if firstlist:
|
|
|
|
n=0
|
|
|
|
temp_list=[]
|
|
|
|
if not secondlist:
|
|
|
|
n=0
|
|
|
|
for i in self.get_col(typ):
|
|
|
|
#print(i)
|
|
|
|
success=0
|
|
|
|
for j in firstlist:
|
|
|
|
#print(j)
|
2022-11-17 10:40:38 +01:00
|
|
|
if j in str(i).lower():
|
2022-11-16 09:12:37 +01:00
|
|
|
#print("Yay")
|
|
|
|
if not success == -1:
|
|
|
|
success=1
|
|
|
|
else:
|
|
|
|
success=-1
|
|
|
|
if success > 0:
|
|
|
|
#print("Hey",i[0])
|
|
|
|
if typ == "*":
|
2022-11-16 19:30:32 +01:00
|
|
|
temp_list.append(self.get_item("*",i[0])[0])
|
2022-11-16 09:12:37 +01:00
|
|
|
else:
|
|
|
|
#print("TE",n,self.get_item(typ,i[0])[1])
|
2022-11-16 19:30:32 +01:00
|
|
|
for k in self.get_item(typ,i[0]):
|
2022-11-16 10:36:34 +01:00
|
|
|
if not k in temp_list:
|
|
|
|
temp_list.append(k)
|
2022-11-16 09:12:37 +01:00
|
|
|
#print("Self: ",self.get_item(typ,i[0])[n])
|
2022-11-16 10:36:34 +01:00
|
|
|
#print(temp_list)
|
2022-11-16 09:12:37 +01:00
|
|
|
n+=1
|
2022-11-12 21:35:50 +01:00
|
|
|
|
2022-11-16 09:12:37 +01:00
|
|
|
else:
|
|
|
|
#print("Second: ",secondlist)
|
|
|
|
if not secondlist[0] == ".":
|
|
|
|
for i in secondlist:
|
|
|
|
for j in firstlist:
|
|
|
|
if j in i:
|
|
|
|
temp_list.append(secondlist[n])
|
|
|
|
n+=1
|
|
|
|
else:
|
|
|
|
#print("secondlist")
|
|
|
|
return secondlist
|
2022-11-16 10:36:34 +01:00
|
|
|
#print("Temp_list: ",temp_list)
|
2022-11-16 09:12:37 +01:00
|
|
|
if not temp_list:
|
|
|
|
return ["."]
|
|
|
|
return temp_list
|
|
|
|
return secondlist
|
2022-11-16 19:30:32 +01:00
|
|
|
|
2022-11-12 21:35:50 +01:00
|
|
|
def get_hash(self,filepath):
|
|
|
|
#https://www.quickprogrammingtips.com/python/how-to-calculate-md5-hash-of-a-file-in-python.html
|
|
|
|
md5_hash = hashlib.md5()
|
2022-11-16 09:12:37 +01:00
|
|
|
# hash selected file in chunks of 4KiB, read the link above if you ask why.
|
2022-11-12 21:35:50 +01:00
|
|
|
with open(filepath,"rb") as f:
|
|
|
|
for byte_block in iter(lambda: f.read(4096),b""):
|
|
|
|
md5_hash.update(byte_block)
|
|
|
|
f.close()
|
|
|
|
return str(md5_hash.hexdigest())
|
2022-11-16 19:30:32 +01:00
|
|
|
|
2022-11-16 20:18:38 +01:00
|
|
|
def search_index(self,args,quiet=False):
|
2022-11-16 10:36:34 +01:00
|
|
|
#print(args)
|
2022-11-16 09:12:37 +01:00
|
|
|
####
|
|
|
|
## WARNING!!!!!! UGLY CODE INCOMING!!!!!!
|
|
|
|
####
|
|
|
|
snext="all"
|
|
|
|
shash=[]
|
|
|
|
alle=[]
|
|
|
|
category=[]
|
|
|
|
sfile=[]
|
|
|
|
content=[]
|
|
|
|
source=[]
|
|
|
|
title=[]
|
|
|
|
tags=[]
|
2022-11-16 10:36:34 +01:00
|
|
|
for arg in args:
|
2022-11-17 10:40:38 +01:00
|
|
|
arg=arg.lower()
|
2022-11-16 09:12:37 +01:00
|
|
|
if re.match('^[-]\w{1}$', arg):
|
|
|
|
if arg == "-h":
|
|
|
|
snext="hash"
|
|
|
|
elif arg == "-a": # technically unneeded because of else at the end
|
|
|
|
snext="all"
|
|
|
|
elif arg == "-c":
|
|
|
|
snext="category"
|
|
|
|
elif arg == "-f":
|
|
|
|
snext="file"
|
|
|
|
elif arg == "-i": # Inhalt
|
|
|
|
snext="content"
|
|
|
|
elif arg == "-s":
|
|
|
|
snext="source"
|
|
|
|
elif arg == "-t":
|
|
|
|
snext="title"
|
|
|
|
elif arg == "-g": # Gruppe
|
|
|
|
snext="tags"
|
|
|
|
else:
|
|
|
|
snext="all"
|
|
|
|
continue
|
|
|
|
if snext == "hash":
|
|
|
|
shash.append(arg)
|
|
|
|
elif snext == "all":
|
|
|
|
alle.append(arg)
|
|
|
|
elif snext == "category":
|
|
|
|
category.append(arg)
|
|
|
|
elif snext == "file":
|
|
|
|
sfile.append(arg)
|
|
|
|
elif snext == "content":
|
|
|
|
content.append(arg)
|
|
|
|
elif snext == "source":
|
|
|
|
source.append(arg)
|
|
|
|
elif snext == "title":
|
|
|
|
title.append(arg)
|
|
|
|
elif snext == "tags":
|
|
|
|
tags.append(arg)
|
|
|
|
else:
|
|
|
|
alle.append(arg)
|
|
|
|
# search for the right items
|
|
|
|
selection=[]
|
|
|
|
selection=self.sql_compare_list("*",alle,selection)
|
|
|
|
selection=self.sql_compare_list("HASH",shash,selection)
|
|
|
|
selection=self.sql_compare_list("CATEGORY",category,selection)
|
|
|
|
selection=self.sql_compare_list("FILE",sfile,selection)
|
|
|
|
selection=self.sql_compare_list("CONTENT",content,selection)
|
|
|
|
selection=self.sql_compare_list("SOURCE",source,selection)
|
|
|
|
selection=self.sql_compare_list("TITLE",title,selection)
|
|
|
|
selection=self.sql_compare_list("TAGS",tags,selection)
|
|
|
|
|
|
|
|
#print("Selection: ",selection)
|
|
|
|
if selection:
|
|
|
|
res=[]
|
|
|
|
if len(selection) > 1:
|
|
|
|
n=0
|
2022-11-16 10:36:34 +01:00
|
|
|
print("Found several matches:")
|
2022-11-16 09:12:37 +01:00
|
|
|
for tup in selection:
|
|
|
|
temp_list=[]
|
|
|
|
for j in tup:
|
|
|
|
temp_list.append(j)
|
2022-11-16 10:36:34 +01:00
|
|
|
#print("sdf",temp_list)
|
2022-11-16 09:12:37 +01:00
|
|
|
print("Match [{}]".format(n))
|
|
|
|
print("\tTitle:\t ",temp_list[2])
|
|
|
|
print("\tCategory:",temp_list[4])
|
|
|
|
print("\tTags:\t ",temp_list[5])
|
|
|
|
n+=1
|
2022-11-16 20:18:38 +01:00
|
|
|
eingabe=input("Enter number(s) (0-{}; '*' for all entries): ".format(n-1))
|
|
|
|
if not eingabe:
|
|
|
|
return ["."]
|
|
|
|
num_list=[]
|
|
|
|
if re.match('[*]',eingabe):
|
|
|
|
for i in range(0,n):
|
|
|
|
num_list.append(i)
|
2022-11-16 09:12:37 +01:00
|
|
|
else:
|
2022-11-16 20:18:38 +01:00
|
|
|
num_list=eingabe.split(' ')
|
|
|
|
nminus=0
|
|
|
|
for i in num_list:
|
|
|
|
if int(i) >= n:
|
|
|
|
print("The number {} is too big!".format(i))
|
|
|
|
nminus+=1
|
|
|
|
continue
|
|
|
|
res.append(selection[int(i)])
|
|
|
|
if not quiet:
|
|
|
|
print("\n\nFinal match{}:".format("es" if len(num_list)-nminus > 1 else ""))
|
2022-11-16 09:12:37 +01:00
|
|
|
else:
|
|
|
|
if selection[0] == ".":
|
|
|
|
print("No matching entry found!")
|
|
|
|
return ["."]
|
2022-11-16 20:18:38 +01:00
|
|
|
res=selection
|
2022-11-16 09:12:37 +01:00
|
|
|
print("\nMatch found!")
|
|
|
|
return res
|
|
|
|
return 1
|