I thought I would share some routines I find useful for backing up sqlite
to dropbox I believe safely.
The nice thing about backing up to dropbox, is that the backup ends up on
your local machine and so can be backed up more safely from there.
First execute 'setup_dropbox'. This should only need to be done once per
application.
Then run copy_to_backup
and finally backup_to_dropbox
This copies storage.sqlite in what I believe is a safe way, it is easy to
get a corrupted fileif you do not do it right like below. The file is
copied to a backup directory
def copy_database():
import os, sqlite3, shutil, time
source=os.getcwd()+'/applications/'+request.application+'/databases/storage.sqlite'
target_dir=os.getcwd()+'/applications/'+request.application+'/backup'
db = sqlite3.connect (source)
backupfile = os.path.join (target_dir, os.path.basename(source) +
time.strftime(".%Y%m%d-%H%M") )
cur = db.cursor ()
cur.execute ('begin immediate')
shutil.copyfile (source, backupfile)
db.rollback()
return dict()
This routines zips files except any ending in '.sqlite', and copies them to
the target directory
def do_zip_except_sqlite(target_dir, file_name):
import os, zipfile
zip = zipfile.ZipFile(file_name, 'w', zipfile.ZIP_DEFLATED)
rootlen = len(target_dir) + 1
print rootlen
for base, dirs, files in os.walk(target_dir):
print dir
for file in files:
if file.find('.sqlite',len(file)-7) ==-1:
fn = os.path.join(base, file)
zip.write(fn, fn[rootlen:])
zip.close()
return dict()
This uses both routines to copy the database files to the backup directory.
It time stamps their names.
def copy_to_backup():
import os, time
base='applications/'+request.application
backupfile = os.path.join (base, 'backup/databases.zip' +
time.strftime(".%Y%m%d-%H%M") )
do_zip_except_sqlite(os.path.join(base,'databases'),backupfile)
copy_database()
return dict()
This copies files from backup folder to dropbox..
It assumes the dropbox access token has been written to the file
applications/my_app/dropbox_token.txt
Writing it to this file means that permission only has to be given once per
application. This seems appropriate for backing up.
def backup_to_dropbox():
import os, zipfile
from gluon import current
from dropbox import client, rest, session
token=current.session.token
# Get your app key and secret from the Dropbox developer website
APP_KEY = 'put_your_key_here'
APP_SECRET = 'put_your_secret_here'
ACCESS_TYPE = 'app_folder'
token_file = 'applications/'+request.application+'/dropbox_token.txt'
token_file = open(token_file)
token_key,token_secret = token_file.read().split('|')
token_file.close()
sess = session.DropboxSession(APP_KEY,APP_SECRET, ACCESS_TYPE )
sess.set_token(token_key,token_secret)
client = client.DropboxClient(sess)
target_dir = 'applications/'+request.application+'/backup'
rootlen = len(target_dir) + 1
for base, dirs, files in os.walk(target_dir):
for file in files:
f = open(target_dir+'/'+file)
client.put_file('f1/'+file,f)
f.close()
return dict()
To setup dropbox you need two routines. One to do the initial setting up,
and one to 'redirect' to after the permission has been granted.
def setup_dropbox():
from gluon import current
# Include the Dropbox SDK libraries
from dropbox import client, rest, session
# Get your app key and secret from the Dropbox developer website
APP_KEY = 'put_your_key_here'
APP_SECRET ='put_your_secret_here'
ACCESS_TYPE = 'app_folder'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
request_token = sess.obtain_request_token()
url = sess.build_authorize_url(request_token,
URL('finish_setup_dropbox', scheme=True, host=True))
current.session.token=(request_token.key,request_token.secret)
TOKENS = 'applications/'+request.application+'/dropbox_tokenr.txt'
token_file = open(TOKENS,'w')
token_file.write("%s|%s" % (request_token.key,request_token.secret) )
token_file.close()
redirect(url)
return
This routine catches the redirection after the permission has been given
def finish_setup_dropbox():
from dropbox import client, rest, session
APP_KEY = 'put_your_key_here'
APP_SECRET = 'put_your_secret_here'
ACCESS_TYPE = 'app_folder'
sess = session.DropboxSession(APP_KEY, APP_SECRET, ACCESS_TYPE)
request_token = sess.obtain_request_token()
TOKENS = 'applications/'+request.application+'/dropbox_tokenr.txt'
token_file = open(TOKENS)
request_token.key,request_token.secret = token_file.read().split('|')
token_file.close()
access_token = sess.obtain_access_token(request_token)
TOKENS = 'applications/'+request.application+'/dropbox_token.txt'
token_file = open(TOKENS,'w')
token_file.write("%s|%s" % (access_token.key,access_token.secret) )
token_file.close()
client = client.DropboxClient(sess)
# print "linked account:", client.account_info()
return
--