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


-- 



Reply via email to