ps: don't use os.getcwd() + '/applications/' + request.application . Use request.folder.
On Monday, October 29, 2012 12:08:27 PM UTC+1, peter wrote: > > 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 > > > --