database is now a class, and the file is in ~/.config.

This commit is contained in:
Yann Leboulanger
2012-10-29 12:33:47 +01:00
parent f38cac838f
commit 004b68bdd8
4 changed files with 211 additions and 206 deletions

View File

@@ -2,16 +2,23 @@ import sqlite3
from common import gajim from common import gajim
import sys import sys
import os import os
path = sys.path[1]
path = path + '/file_sharing/' + 'shared_files.db'
db_exist = os.path.exists(path)
conn = sqlite3.connect(path)
# Enable foreign keys contraints
conn.cursor().execute("pragma foreign_keys = on")
# NOTE: Make sure we are getting and setting the requester without its resource class FilesharingDatabase:
def create_database(): def __init__(self, plugin):
c = conn.cursor() self.plugin = plugin
path_l = os.path.split(plugin.config.FILE_PATH)
path = os.path.join(path_l[0], 'shared_files.db')
db_exist = os.path.exists(path)
print path
self.conn = sqlite3.connect(path)
# Enable foreign keys contraints
self.conn.cursor().execute("pragma foreign_keys = on")
if not db_exist:
self.create_database()
# NOTE: Make sure we are getting and setting the requester without its resource
def create_database(self):
c = self.conn.cursor()
# Create tables # Create tables
c.execute("CREATE TABLE permissions" + c.execute("CREATE TABLE permissions" +
"(fid integer REFERENCES files(fid) ON DELETE CASCADE, " + "(fid integer REFERENCES files(fid) ON DELETE CASCADE, " +
@@ -21,11 +28,11 @@ def create_database():
" file_path text, relative_path text, hash_sha1 text," + " file_path text, relative_path text, hash_sha1 text," +
"size numeric, description text, mod_date text, is_dir boolean)") "size numeric, description text, mod_date text, is_dir boolean)")
# Save (commit) the changes # Save (commit) the changes
conn.commit() self.conn.commit()
c.close() c.close()
def get_toplevel_files(account, requester): def get_toplevel_files(self, account, requester):
c = conn.cursor() c = self.conn.cursor()
data = (account, requester) data = (account, requester)
c.execute("SELECT relative_path, hash_sha1, size, description, mod_date," + c.execute("SELECT relative_path, hash_sha1, size, description, mod_date," +
" is_dir FROM (files JOIN permissions ON" + " is_dir FROM (files JOIN permissions ON" +
@@ -35,8 +42,8 @@ def get_toplevel_files(account, requester):
c.close() c.close()
return result return result
def get_files_from_dir(account, requester, dir_): def get_files_from_dir(self, account, requester, dir_):
c = conn.cursor() c = self.conn.cursor()
data = (account, requester, dir_ + '/%') data = (account, requester, dir_ + '/%')
c.execute("SELECT relative_path, hash_sha1, size, description, mod_date," + c.execute("SELECT relative_path, hash_sha1, size, description, mod_date," +
" is_dir FROM (files JOIN permissions ON" + " is_dir FROM (files JOIN permissions ON" +
@@ -51,7 +58,7 @@ def get_files_from_dir(account, requester, dir_):
fresult.append(r) fresult.append(r)
return fresult return fresult
def get_files(account, requester): def get_files(self, account, requester):
""" """
>>> file_ = ('file_path', 'relative_path', 'hash', 999, 'description', \ >>> file_ = ('file_path', 'relative_path', 'hash', 999, 'description', \
'date', False) 'date', False)
@@ -61,7 +68,7 @@ def get_files(account, requester):
1 1
>>> _delete_file(1) >>> _delete_file(1)
""" """
c = conn.cursor() c = self.conn.cursor()
data = (account, requester) data = (account, requester)
c.execute("SELECT relative_path, hash_sha1, size, description, mod_date," + c.execute("SELECT relative_path, hash_sha1, size, description, mod_date," +
" is_dir FROM (files JOIN permissions ON" + " is_dir FROM (files JOIN permissions ON" +
@@ -70,8 +77,8 @@ def get_files(account, requester):
c.close() c.close()
return result return result
def get_file(account, requester, hash_, name): def get_file(self, account, requester, hash_, name):
c = conn.cursor() c = self.conn.cursor()
if hash_: if hash_:
data = (account, requester, hash_) data = (account, requester, hash_)
sql = "SELECT relative_path, hash_sha1, size, description, mod_date," + \ sql = "SELECT relative_path, hash_sha1, size, description, mod_date," + \
@@ -92,14 +99,14 @@ def get_file(account, requester, hash_, name):
else: else:
return result[0] return result[0]
def get_files_name(account, requester): def get_files_name(self, account, requester):
result = get_files(account, requester) result = self.get_files(account, requester)
flist = [] flist = []
for r in result: for r in result:
flist.append(r[0]) flist.append(r[0])
return flist return flist
def add_file(account, requester, file_): def add_file(self, account, requester, file_):
""" """
>>> file_ = ('file_path', 'relative_path', 'hash', 999, 'description', \ >>> file_ = ('file_path', 'relative_path', 'hash', 999, 'description', \
'date', False) 'date', False)
@@ -107,9 +114,9 @@ def add_file(account, requester, file_):
1 1
>>> _delete_file(1) >>> _delete_file(1)
""" """
_check_duplicate(account, requester, file_) self._check_duplicate(account, requester, file_)
requester = gajim.get_jid_without_resource(requester) requester = gajim.get_jid_without_resource(requester)
c = conn.cursor() c = self.conn.cursor()
c.execute("INSERT INTO files (file_path, " + c.execute("INSERT INTO files (file_path, " +
"relative_path, hash_sha1, size, description, mod_date, " + "relative_path, hash_sha1, size, description, mod_date, " +
" is_dir) VALUES (?,?,?,?,?,?,?)", " is_dir) VALUES (?,?,?,?,?,?,?)",
@@ -117,12 +124,12 @@ def add_file(account, requester, file_):
fid = c.lastrowid fid = c.lastrowid
permission_data = (fid, account, requester) permission_data = (fid, account, requester)
c.execute("INSERT INTO permissions VALUES (?,?,?)", permission_data) c.execute("INSERT INTO permissions VALUES (?,?,?)", permission_data)
conn.commit() self.conn.commit()
c.close() c.close()
return fid return fid
def _check_duplicate(account, requester, file_): def _check_duplicate(self, account, requester, file_):
c = conn.cursor() c = self.conn.cursor()
data = (account, requester, file_[1]) data = (account, requester, file_[1])
c.execute("SELECT * FROM (files JOIN permissions ON" + c.execute("SELECT * FROM (files JOIN permissions ON" +
" files.fid=permissions.fid) WHERE account=? AND requester=?" + " files.fid=permissions.fid) WHERE account=? AND requester=?" +
@@ -138,26 +145,26 @@ def _check_duplicate(account, requester, file_):
raise Exception('Duplicated entry') raise Exception('Duplicated entry')
c.close() c.close()
def _delete_file(fid): def _delete_file(self, fid):
c = conn.cursor() c = self.conn.cursor()
data = (fid, ) data = (fid, )
c.execute("DELETE FROM files WHERE fid=?", data) c.execute("DELETE FROM files WHERE fid=?", data)
conn.commit() self.conn.commit()
c.close() c.close()
def _delete_dir(dir_, account, requester): def _delete_dir(self, dir_, account, requester):
c = conn.cursor() c = self.conn.cursor()
data = (account, requester, dir_, dir_ + '/%') data = (account, requester, dir_, dir_ + '/%')
sql = "DELETE FROM files WHERE fid IN " + \ sql = "DELETE FROM files WHERE fid IN " + \
" (SELECT files.fid FROM files, permissions WHERE" + \ " (SELECT files.fid FROM files, permissions WHERE" + \
" files.fid=permissions.fid AND account=?"+ \ " files.fid=permissions.fid AND account=?"+ \
" AND requester=? AND (relative_path=? OR relative_path LIKE ?))" " AND requester=? AND (relative_path=? OR relative_path LIKE ?))"
c.execute(sql, data) c.execute(sql, data)
conn.commit() self.conn.commit()
c.close() c.close()
def delete(account, requester, relative_path): def delete(self, account, requester, relative_path):
c = conn.cursor() c = self.conn.cursor()
data = (account, requester, relative_path) data = (account, requester, relative_path)
c.execute("SELECT files.fid, is_dir FROM (files JOIN permissions ON" + c.execute("SELECT files.fid, is_dir FROM (files JOIN permissions ON" +
" files.fid=permissions.fid) WHERE account=? AND requester=? AND " + " files.fid=permissions.fid) WHERE account=? AND requester=? AND " +
@@ -165,22 +172,20 @@ def delete(account, requester, relative_path):
result = c.fetchone() result = c.fetchone()
c.close() c.close()
if result[1] == 0: if result[1] == 0:
_delete_file(result[0]) self._delete_file(result[0])
else: else:
_delete_dir(relative_path, account, requester) self._delete_dir(relative_path, account, requester)
def delete_all(account, requester): def delete_all(self, account, requester):
c = conn.cursor() c = self.conn.cursor()
data = (account, requester) data = (account, requester)
sql = "DELETE FROM files WHERE fid IN (SELECT fid FROM permissions" + \ sql = "DELETE FROM files WHERE fid IN (SELECT fid FROM permissions" + \
" WHERE account=? AND requester=?)" " WHERE account=? AND requester=?)"
c.execute(sql, data) c.execute(sql, data)
conn.commit() self.conn.commit()
c.close() c.close()
if not db_exist:
create_database()
if __name__ == "__main__": if __name__ == "__main__":
""" """
DELETE DATABASE FILE BEFORE RUNNING TESTS DELETE DATABASE FILE BEFORE RUNNING TESTS

View File

@@ -1,4 +1,3 @@
import database
import gtk import gtk
import gobject import gobject
from common import gajim from common import gajim
@@ -219,7 +218,7 @@ class FileShareWindow(gtk.Window):
file_ = (f, relative_name, '', size, '', mod_date, is_dir) file_ = (f, relative_name, '', size, '', mod_date, is_dir)
requester = self.cbb_contacts.get_active_text() requester = self.cbb_contacts.get_active_text()
try: try:
fid = database.add_file(self.account, requester, file_) fid = self.plugin.database.add_file(self.account, requester, file_)
except Exception, e: except Exception, e:
if e == 'Duplicated entry': if e == 'Duplicated entry':
print 'Error: ' + e print 'Error: ' + e
@@ -263,7 +262,7 @@ class FileShareWindow(gtk.Window):
self.contacts_rows.append(r) self.contacts_rows.append(r)
self.manage_vbox2.set_sensitive(True) self.manage_vbox2.set_sensitive(True)
self.bt_remove.set_sensitive(False) self.bt_remove.set_sensitive(False)
self.add_file_list(database.get_files_name(self.account, self.add_file_list(self.plugin.database.get_files_name(self.account,
gajim.get_jid_without_resource(contact.get_full_jid())), gajim.get_jid_without_resource(contact.get_full_jid())),
self.ts_files self.ts_files
) )
@@ -281,7 +280,7 @@ class FileShareWindow(gtk.Window):
# If the contact in the comboboxentry is include inside of the # If the contact in the comboboxentry is include inside of the
# combobox # combobox
if contact == self.ts_contacts.get_value(i, 0): if contact == self.ts_contacts.get_value(i, 0):
self.add_file_list(database.get_files_name(self.account, self.add_file_list(self.plugin.database.get_files_name(self.account,
contact), contact),
self.ts_files self.ts_files
) )
@@ -295,13 +294,13 @@ class FileShareWindow(gtk.Window):
sel = self.treeSelection_files.get_selected() sel = self.treeSelection_files.get_selected()
relative_name = self.ts_files.get_value(sel[1], 0) relative_name = self.ts_files.get_value(sel[1], 0)
self.ts_files.remove(sel[1]) self.ts_files.remove(sel[1])
database.delete(self.account, contact, relative_name) self.plugin.database.delete(self.account, contact, relative_name)
widget.set_sensitive(False) widget.set_sensitive(False)
def remove_all_clicked(self, widget, data=None): def remove_all_clicked(self, widget, data=None):
entry = self.cbb_contacts.child entry = self.cbb_contacts.child
contact = entry.get_text() contact = entry.get_text()
database.delete_all(self.account, contact) self.plugin.database.delete_all(self.account, contact)
self.ts_files.clear() self.ts_files.clear()
def row_selected(self, widget, data=None): def row_selected(self, widget, data=None):

View File

@@ -30,11 +30,12 @@ class FileSharePlugin(GajimPlugin):
self.config_dialog = None self.config_dialog = None
home_path = os.path.expanduser('~/') home_path = os.path.expanduser('~/')
self.config_default_values = {'incoming_dir': (home_path, '')} self.config_default_values = {'incoming_dir': (home_path, '')}
self.database = database.FilesharingDatabase(self)
# Create one protocol handler per account # Create one protocol handler per account
accounts = gajim.contacts.get_accounts() accounts = gajim.contacts.get_accounts()
for account in gajim.contacts.get_accounts(): for account in gajim.contacts.get_accounts():
FileSharePlugin.prohandler[account] = \ FileSharePlugin.prohandler[account] = \
fshare_protocol.protocol(account) fshare_protocol.Protocol(account, self)
self.events_handlers = { self.events_handlers = {
'raw-iq-received': (ged.CORE, self._nec_raw_iq) 'raw-iq-received': (ged.CORE, self._nec_raw_iq)
} }
@@ -122,7 +123,7 @@ class FileSharePlugin(GajimPlugin):
file_info = self._get_file_info(hash_, name) file_info = self._get_file_info(hash_, name)
if file_info: if file_info:
return file_info return file_info
raw_info = database.get_file(account, peerjid, hash_, name) raw_info = self.database.get_file(account, peerjid, hash_, name)
file_info = {'name': raw_info[0], file_info = {'name': raw_info[0],
'file-name' : raw_info[5], 'file-name' : raw_info[5],
'hash' : raw_info[1], 'hash' : raw_info[1],

View File

@@ -3,14 +3,14 @@ from common import helpers
from common import gajim from common import gajim
from common import XMPPDispatcher from common import XMPPDispatcher
from common.xmpp import Hashes from common.xmpp import Hashes
import database
# Namespace for file sharing # Namespace for file sharing
NS_FILE_SHARING = 'http://gajim.org/protocol/filesharing' NS_FILE_SHARING = 'http://gajim.org/protocol/filesharing'
class protocol(): class Protocol():
def __init__(self, account): def __init__(self, account, plugin):
self.account = account self.account = account
self.plugin = plugin
self.conn = gajim.connections[self.account] self.conn = gajim.connections[self.account]
# get our jid with resource # get our jid with resource
self.ourjid = gajim.get_jid_from_account(self.account) self.ourjid = gajim.get_jid_from_account(self.account)
@@ -52,12 +52,12 @@ class protocol():
if req.getTag('directory') and not \ if req.getTag('directory') and not \
req.getTag('directory').getChildren(): req.getTag('directory').getChildren():
# We just received a toplevel directory request # We just received a toplevel directory request
files = database.get_toplevel_files(self.account, jid) files = self.plugin.database.get_toplevel_files(self.account, jid)
response = self.offer(stanza.getID(), fjid, files) response = self.offer(stanza.getID(), fjid, files)
self.conn.connection.send(response) self.conn.connection.send(response)
elif req.getTag('directory') and req.getTag('directory').getTag('name'): elif req.getTag('directory') and req.getTag('directory').getTag('name'):
dir_ = req.getTag('directory').getTag('name').getData()[1:] dir_ = req.getTag('directory').getTag('name').getData()[1:]
files = database.get_files_from_dir(self.account, jid, dir_) files = self.plugin.database.get_files_from_dir(self.account, jid, dir_)
response = self.offer(stanza.getID(), fjid, files) response = self.offer(stanza.getID(), fjid, files)
self.conn.connection.send(response) self.conn.connection.send(response)