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
>
>
>
--