volumes have names
This commit is contained in:
parent
c6e8ae8a37
commit
3a57ac389f
5 changed files with 78 additions and 73 deletions
|
@ -301,11 +301,12 @@ class Database(object):
|
||||||
'''CREATE TABLE IF NOT EXISTS volume (
|
'''CREATE TABLE IF NOT EXISTS volume (
|
||||||
site varchar(1024),
|
site varchar(1024),
|
||||||
user varchar(1024),
|
user varchar(1024),
|
||||||
|
name varchar(1024),
|
||||||
path varchar(1024),
|
path varchar(1024),
|
||||||
updated INT,
|
updated INT,
|
||||||
created INT,
|
created INT,
|
||||||
updating INT,
|
updating INT,
|
||||||
UNIQUE(site, user, path))''',
|
UNIQUE(site, user, name))''',
|
||||||
'''CREATE TABLE IF NOT EXISTS derivative (
|
'''CREATE TABLE IF NOT EXISTS derivative (
|
||||||
oshash varchar(16),
|
oshash varchar(16),
|
||||||
name varchar(1024),
|
name varchar(1024),
|
||||||
|
@ -358,7 +359,7 @@ class Database(object):
|
||||||
|
|
||||||
def files(self, site, user, volume, since=None):
|
def files(self, site, user, volume, since=None):
|
||||||
conn, c = self.conn()
|
conn, c = self.conn()
|
||||||
c.execute('SELECT path from volume where site=? AND user=? AND path=?', (site, user, volume))
|
c.execute('SELECT path from volume where site=? AND user=? AND name=?', (site, user, volume))
|
||||||
prefix = None
|
prefix = None
|
||||||
for row in c:
|
for row in c:
|
||||||
prefix = row[0]
|
prefix = row[0]
|
||||||
|
@ -512,27 +513,45 @@ class Database(object):
|
||||||
c.execute('UPDATE file SET deleted=? WHERE path=?', (deleted, f))
|
c.execute('UPDATE file SET deleted=? WHERE path=?', (deleted, f))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
def add_volume(self, site, user, path):
|
def set_location(self, site, user, name, path):
|
||||||
conn, c = self.conn()
|
conn, c = self.conn()
|
||||||
path = os.path.normpath(path)
|
path = os.path.normpath(path)
|
||||||
created = time.mktime(time.localtime())
|
if name in self.volumes(site, user):
|
||||||
t = (site, user, path, created, created)
|
t = (path, site, user, name)
|
||||||
#FIXME: check if site/name exists or deal with error here
|
c.execute(u'UPDATE volume SET path=? WHERE site=? AND user=? and name=?', t)
|
||||||
c.execute(u'INSERT INTO volume values (?, ?, ?, ?, ?, 0)', t)
|
else:
|
||||||
|
created = time.mktime(time.localtime())
|
||||||
|
t = (site, user, name, path, created, created)
|
||||||
|
#FIXME: check if site/name exists or deal with error here
|
||||||
|
c.execute(u'INSERT INTO volume values (?, ?, ?, ?, ?, ?, 0)', t)
|
||||||
|
conn.commit()
|
||||||
|
|
||||||
|
def remove_volume(self, site, user, name):
|
||||||
|
conn, c = self.conn()
|
||||||
|
c.execute('DELETE FROM volume WHERE site=? AND user=? AND name=?', [site, user, name])
|
||||||
|
conn.commit()
|
||||||
|
#fixme, files could be still used by sub volumes
|
||||||
|
#c.execute('DELETE FROM file WHERE path LIKE ?', ["%s%%"%path])
|
||||||
|
|
||||||
|
def rename_volume(self, site, user, name, new_name):
|
||||||
|
conn, c = self.conn()
|
||||||
|
t = (new_name, site, user, name)
|
||||||
|
c.execute(u'UPDATE volume SET name=? WHERE site=? AND user=? and name=?', t)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
def volumes(self, site, user):
|
def volumes(self, site, user):
|
||||||
conn, c = self.conn()
|
conn, c = self.conn()
|
||||||
sql = 'SELECT path FROM volume WHERE site=? AND user=? ORDER BY path';
|
sql = 'SELECT name, path FROM volume WHERE site=? AND user=? ORDER BY name';
|
||||||
c.execute(sql, [site, user])
|
c.execute(sql, [site, user])
|
||||||
volumes = {}
|
volumes = {}
|
||||||
for row in c:
|
for row in c:
|
||||||
path = row[0]
|
name = row[0]
|
||||||
volumes[path] = {}
|
path = row[1]
|
||||||
|
volumes[name] = {}
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
volumes[path]['available'] = True
|
volumes[name]['available'] = True
|
||||||
else:
|
else:
|
||||||
volumes[path]['available'] = False
|
volumes[name]['available'] = False
|
||||||
return volumes
|
return volumes
|
||||||
|
|
||||||
def update_volumes(self, site, user):
|
def update_volumes(self, site, user):
|
||||||
|
@ -556,13 +575,6 @@ class Database(object):
|
||||||
(updated, site, user, '%s%%'%path))
|
(updated, site, user, '%s%%'%path))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
def remove_volume(self, site, user, name):
|
|
||||||
conn, c = self.conn()
|
|
||||||
c.execute('DELETE FROM volume WHERE site=? AND user=? AND name=?', [site, user, name])
|
|
||||||
conn.commit()
|
|
||||||
#fixme, files could be still used by sub volumes
|
|
||||||
#c.execute('DELETE FROM file WHERE path LIKE ?', ["%s%%"%path])
|
|
||||||
|
|
||||||
#web
|
#web
|
||||||
def json_response(request, data):
|
def json_response(request, data):
|
||||||
request.headers['Content-Type'] = 'text/javascript'
|
request.headers['Content-Type'] = 'text/javascript'
|
||||||
|
@ -606,17 +618,32 @@ class OxControl(Resource):
|
||||||
return args
|
return args
|
||||||
|
|
||||||
if request.path == '/add_volume':
|
if request.path == '/add_volume':
|
||||||
args = required_args('site', 'user', 'path')
|
args = required_args('site', 'user', 'name', 'path')
|
||||||
self.db.add_volume(**args)
|
self.db.add_volume(**args)
|
||||||
response = {'status': 'ok'}
|
response = {'status': 'ok'}
|
||||||
return json_response(request, response)
|
return json_response(request, response)
|
||||||
|
|
||||||
|
if request.path == '/set_location':
|
||||||
|
args = required_args('site', 'user', 'name', 'path')
|
||||||
|
self.db.set_location(**args)
|
||||||
|
response = {'status': 'ok'}
|
||||||
|
return json_response(request, response)
|
||||||
|
|
||||||
if request.path == '/remove_volume':
|
if request.path == '/remove_volume':
|
||||||
args = required_args('site', 'user', 'path')
|
args = required_args('site', 'user', 'name')
|
||||||
self.db.remove_volume(**args)
|
self.db.remove_volume(**args)
|
||||||
response = {'status': 'ok'}
|
response = {'status': 'ok'}
|
||||||
return json_response(request, response)
|
return json_response(request, response)
|
||||||
|
|
||||||
|
if request.path == '/rename_volume':
|
||||||
|
args = required_args('site', 'user', 'name', 'new_name')
|
||||||
|
if args['name'] in self.db.volumes(args['site'], args['user']):
|
||||||
|
self.db.rename_volume(**args)
|
||||||
|
response = {'status': 'ok'}
|
||||||
|
else:
|
||||||
|
response = {'status': '404'}
|
||||||
|
return json_response(request, response)
|
||||||
|
|
||||||
if request.path == '/volumes':
|
if request.path == '/volumes':
|
||||||
args = required_args('site', 'user')
|
args = required_args('site', 'user')
|
||||||
response = self.db.volumes(**args)
|
response = self.db.volumes(**args)
|
||||||
|
|
|
@ -120,7 +120,7 @@ OxFF.prototype = {
|
||||||
return "NoAccess";
|
return "NoAccess";
|
||||||
},
|
},
|
||||||
debug: function() {
|
debug: function() {
|
||||||
var msg = "OxFF: ";
|
var msg = this.extensionID + ": ";
|
||||||
for(var i=0;i<arguments.length;i++) {
|
for(var i=0;i<arguments.length;i++) {
|
||||||
msg += arguments[i];
|
msg += arguments[i];
|
||||||
if(i+1<arguments.length)
|
if(i+1<arguments.length)
|
||||||
|
@ -245,43 +245,39 @@ OxFF.prototype = {
|
||||||
this.api('update', callback.callback);
|
this.api('update', callback.callback);
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
setLocation: function(name) {
|
||||||
addVolume: function() {
|
|
||||||
if(!this._access) {
|
if(!this._access) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const nsIFilePicker = Ci.nsIFilePicker;
|
const nsIFilePicker = Ci.nsIFilePicker;
|
||||||
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
|
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
|
||||||
fp.init(this._window, "Add Volume to " + this._site, nsIFilePicker.modeGetFolder);
|
fp.init(this._window, "Set Locatin of "+name+" for " + this._site, nsIFilePicker.modeGetFolder);
|
||||||
fp.appendFilters(nsIFilePicker.filterAll);
|
fp.appendFilters(nsIFilePicker.filterAll);
|
||||||
var rv = fp.show();
|
var rv = fp.show();
|
||||||
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
|
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
|
||||||
var new_location = fp.file.path;
|
var new_location = fp.file.path;
|
||||||
this.api('add_volume', {'path': new_location}, function(result) {});
|
this.api('set_location', {'name': name, 'path': new_location}, function(result) {});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
removeVolume: function(name) {
|
||||||
|
return this.api('remove_volume', {'name': name});
|
||||||
|
},
|
||||||
|
renameVolume: function(name, new_name) {
|
||||||
|
return this.api('rename_volume', {'name': name, 'new_name': new_name});
|
||||||
|
},
|
||||||
volumes: function(callback) {
|
volumes: function(callback) {
|
||||||
return this.api('volumes', callback.callback);
|
return this.api('volumes', callback.callback);
|
||||||
},
|
},
|
||||||
|
|
||||||
//private functions
|
//private functions
|
||||||
permitAccess: function() {
|
permitAccess: function() {
|
||||||
this._access = true;
|
this._access = true;
|
||||||
var conn = oxff.getDB();
|
oxff.access(this._site, this._access);
|
||||||
var q = conn.createStatement("INSERT OR REPLACE INTO site values (:site, 1)");
|
|
||||||
q.params.site = this._site;
|
|
||||||
q.executeStep();
|
|
||||||
q.finalize();
|
|
||||||
},
|
},
|
||||||
denyAccess: function() {
|
denyAccess: function() {
|
||||||
this._access = false;
|
this._access = false;
|
||||||
var conn = oxff.getDB();
|
oxff.access(this._site, this._access);
|
||||||
var q = conn.createStatement("INSERT OR REPLACE INTO site values (:site, 0)");
|
|
||||||
q.params.site = this._site;
|
|
||||||
q.executeStep();
|
|
||||||
q.finalize();
|
|
||||||
},
|
},
|
||||||
startDaemon: function() {
|
startDaemon: function() {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
|
@ -315,37 +311,6 @@ OxFF.prototype = {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
getFormatInfo: function(filename, callback) {
|
|
||||||
var that = this;
|
|
||||||
var get_json = function(data) {
|
|
||||||
var json = {"format": "unknown"};
|
|
||||||
try {
|
|
||||||
json = JSON.parse(data);
|
|
||||||
} catch(e) {
|
|
||||||
json = {"format": "unknown"};
|
|
||||||
}
|
|
||||||
|
|
||||||
var source_file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
|
|
||||||
source_file.initWithPath(filename);
|
|
||||||
// Try to determine the MIME type of the file
|
|
||||||
//json.contentType = that.getMimeType(source_file);
|
|
||||||
return json;
|
|
||||||
}
|
|
||||||
var info_callback = function(data) {
|
|
||||||
callback(get_json(data));
|
|
||||||
}
|
|
||||||
var options = [filename, '--info'];
|
|
||||||
if (callback) {
|
|
||||||
ox.subprocess(this.bin('ffmpeg2theora'), options, callback);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
data = ox.subprocess(this.bin('ffmpeg2theora'), options, false);
|
|
||||||
return get_json(data);
|
|
||||||
},
|
|
||||||
bin: function(cmd) {
|
|
||||||
this._cmd_name = '/usr/local/bin/_cmd_';
|
|
||||||
return this._cmd_name.replace('_cmd_', cmd);
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
//4.0 only
|
//4.0 only
|
||||||
var NSGetFactory = XPCOMUtils.generateNSGetFactory([OxFF]);
|
var NSGetFactory = XPCOMUtils.generateNSGetFactory([OxFF]);
|
||||||
|
|
Binary file not shown.
|
@ -40,5 +40,16 @@ let oxff = {
|
||||||
q.executeStep();
|
q.executeStep();
|
||||||
q.finalize();
|
q.finalize();
|
||||||
},
|
},
|
||||||
|
access: function(site, access) {
|
||||||
|
var conn = oxff.getDB();
|
||||||
|
var q = conn.createStatement("INSERT OR REPLACE INTO site values (:site, :access)");
|
||||||
|
q.params.site = site;
|
||||||
|
if (access)
|
||||||
|
q.params.access = 1;
|
||||||
|
else
|
||||||
|
q.params.access = 0;
|
||||||
|
q.executeStep();
|
||||||
|
q.finalize();
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -16,15 +16,17 @@ interface nsIOxFF : nsISupports
|
||||||
readonly attribute string version;
|
readonly attribute string version;
|
||||||
|
|
||||||
boolean login(in AString user);
|
boolean login(in AString user);
|
||||||
boolean addVolume();
|
|
||||||
string import();
|
|
||||||
float progress(in AString oshash);
|
|
||||||
boolean access([optional] in boolean request);
|
boolean access([optional] in boolean request);
|
||||||
|
boolean logout();
|
||||||
|
|
||||||
|
string volumes(in oxICallback callback);
|
||||||
|
boolean setLocation(in AString name);
|
||||||
|
boolean renameVolume(in AString name, in AString new_name);
|
||||||
|
boolean removeVolume(in AString name);
|
||||||
|
|
||||||
boolean update(in oxICallback callback);
|
boolean update(in oxICallback callback);
|
||||||
string volumes(in oxICallback callback);
|
|
||||||
boolean files(in AString volume, in oxICallback callback);
|
boolean files(in AString volume, in oxICallback callback);
|
||||||
boolean get(in AString oshash, in AString media, in oxICallback callback);
|
boolean get(in AString oshash, in AString media, in oxICallback callback);
|
||||||
boolean extract(in AString oshash, in AString media, in oxICallback callback);
|
boolean extract(in AString oshash, in AString media, in oxICallback callback);
|
||||||
boolean logout();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue