Anki/aqt/dropbox.py
Damien Elmes 103871a5b1 refactor file layout
- ankiqt->aqt
- move all the files in ui into the top level
- move icons_rc.py into aqt/forms, and the qrc into designer/
- remove setuptools
2011-04-28 09:26:45 +09:00

76 lines
2.6 KiB
Python

#!/usr/bin/env python
# stripped down version of http://dl.dropbox.com/u/552/pyDropboxPath/1.0.1/index.html
import imp, os, sys, sqlite3
from base64 import b64encode, b64decode
from pickle import dumps, loads
def GetDbFolder():
if sys.platform == 'win32':
assert os.environ.has_key('APPDATA'), Exception('APPDATA env variable not found')
dbpath = os.path.join(os.environ['APPDATA'],'Dropbox')
elif sys.platform in ('linux2','darwin'):
assert os.environ.has_key('HOME'), Exception('HOME env variable not found')
dbpath = os.path.join(os.environ['HOME'],'.dropbox')
else: # FIXME other archs?
raise Exception('platform %s not known, please report' % sys.platform)
if os.path.isfile(os.path.join(dbpath,'config.db')):
dbfn, dbfnver = os.path.join(dbpath,'config.db'), 1
elif os.path.isfile(os.path.join(dbpath, 'dropbox.db')):
dbfn, dbfnver = os.path.join(dbpath,'dropbox.db'), 0
else:
raise Exception('Dropbox database not found, is dropbox installed?')
return (dbfn, dbfnver)
def GetConn(dbfile):
lastdir = os.getcwd()
os.chdir(os.path.dirname(dbfile))
connection = sqlite3.connect(os.path.basename(dbfile), isolation_level=None)
os.chdir(lastdir)
return connection
def ReadDbLocation(dbfile, dbfnver):
connection = GetConn(dbfile)
cursor = connection.cursor()
if dbfnver == 0: # dropbox.db, old-style
dbver = 0
elif dbfnver == 1: # config.db, can be upgraded, lets check schema
cursor.execute('SELECT value FROM config WHERE key="config_schema_version"')
row = cursor.fetchone()
dbver = row[0]
# dup code now, but maybe someday it will be confusing
if dbver == 0:
cursor.execute('SELECT value FROM config WHERE key="dropbox_path"')
elif dbver == 1:
cursor.execute('SELECT value FROM config WHERE key="dropbox_path"')
else:
raise Exception('Unhandled DB schema version %d' % dbver)
row = cursor.fetchone()
cursor.close()
connection.close()
if row is None:
if sys.platform == 'win32':
import ctypes
dll = ctypes.windll.shell32
buf = ctypes.create_string_buffer(300)
dll.SHGetSpecialFolderPathA(None, buf, 0x0005, False)
dbfolder = os.path.join(buf.value,'My Dropbox')
elif sys.platform in ('linux2','darwin'):
dbfolder = os.path.join(os.environ['HOME'],'Dropbox')
else:
raise Exception('platform %s not known, please report' % sys.platform)
#print 'No dropbox path defined in config, using default location %s' % dbfolder
else:
if dbver == 0: # always b64encoded
dbfolder = loads(b64decode(row[0]))
elif dbver == 1: # normal
dbfolder = row[0]
else:
raise Exception('Unhandled DB schema version %d' % dbver)
return (dbfolder, dbver)
def getPath():
return ReadDbLocation(*GetDbFolder())[0]