CRUD com backUp e restore do banco de dados com C++ e Sqlite

// Olá amigos, o código está funcionando perfeitamente
// Só não sei implementar o backup e a restauração do banco de dados
// Se alguém souber desde já agradeço

/*
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS estudante (
nome VARCHAR ( 50 ) NOT NULL,
roll VARCHAR ( 40 ),
cgpa FLOAT
);
COMMIT;
*/
// colocar os <> depois dos includes, pois não estava aparecendo no post, e tive que retiralos
#include iostream
#include fstream
#include vector
#include string
#include sstream
// colocar os < > nos include acima
using namespace std;

#include "sqlite3.h"
#define DB "sea.s3db"

bool isOpenDB = false;
sqlite3 *dbfile;

bool ConectaDB ();
void DesconectaDB ();
int back_up_database();
int restore_database();

class estudante {
private:
    int id;
    string nome;
    float cgpa;

public:
    estudante() {
        id=0;
        cgpa=0.00;
    }

    estudante(int i, string snome, float f) {
        id=i;
        nome = snome;
        cgpa=f;
    }
    void setid(int i) {
        id=i;
    }
    void setcgpa(float gp) {
        cgpa=gp;
    }
    void setnome(string snome) {
        nome = snome;
    }

    string getnome() {
        return nome;
    }

    int getid() {
        return id;
    }

    float getcgpa() {
        return cgpa;
    }
};


estudante getEstudante() {
    estudante estud;

    int id;
    string nome;
    float gpa;

    cout << " Digite o estudante id :" ;
    cin >> id;
    cout << " Digite o nome : " ;
    cin >> nome;
    cout << " Digite o GPA : " ;
    cin >> gpa;

    estud.setid(id);
    estud.setnome(nome);
    estud.setcgpa(gpa);

    return estud;
}

int addDataRow() {
    // pega dados do estudante pelo uruario usuário
    estudante estud = getEstudante();

    std::stringstream strm;
    strm << "insert into estudante (roll,nome,cgpa) values(" << estud.getid() << ",'" << estud.getnome() << "'," << estud.getcgpa() << ")";

    string s = strm.str();
    char *str = &s[0];

    sqlite3_stmt *statement;
    int result;

    char *query = str; {
        if(sqlite3_prepare(dbfile,query,-1,&statement,0)==SQLITE_OK) {
            int res=sqlite3_step(statement);
            result=res;
            sqlite3_finalize(statement);
        }
        return result;
    }

    return 0;
}



int updateRow() {
    int rollno;
    float gpa;
    cout << "Digite o ID No: ";
    cin >> rollno ;
    cout << "new CGPA : " ;
    cin >> gpa;

    std::stringstream strm;
    strm << "update estudante set cgpa=" << gpa << " where roll=" << rollno ;

    string s = strm.str();
    char *str = &s[0];

    sqlite3_stmt *statement;
    int result;

    char *query = str;

    {
        if(sqlite3_prepare(dbfile,query,-1,&statement,0)==SQLITE_OK) {
            int res=sqlite3_step(statement);
            result=res;
            sqlite3_finalize(statement);
        }
        return result;
    }

    return 0;
}


int deleteRow() {

    int rollno;

    cout << "Digite o ID No: ";
    cin >> rollno ;

    std::stringstream strm;
    strm << "delete from estudante " << " where roll=" << rollno ;

    string s = strm.str();
    char *str = &s[0];

    sqlite3_stmt *statement;
    int result;
    char *query = str;

    {
        if(sqlite3_prepare(dbfile,query,-1,&statement,0)==SQLITE_OK) {
            int res=sqlite3_step(statement);
            result=res;
            sqlite3_finalize(statement);
        }

        return result;
    }

    return 0;
}

void getTableData() {

    sqlite3_stmt *statement;

    char *query = "select * from estudante";

    if ( sqlite3_prepare(dbfile, query, -1, &statement, 0 ) == SQLITE_OK ) {
        int ctotal = sqlite3_column_count(statement);

        int res = 0;

        while ( 1 )

        {
            res = sqlite3_step(statement);

            if ( res == SQLITE_ROW ) {
                for ( int i = 0; i < ctotal; i++ ) {
                    string s = (char*)sqlite3_column_text(statement, i);
                    cout << s << " ";
                }

                cout << endl;
            }

            if ( res == SQLITE_DONE ) {
                cout << "feito ! " << endl;
                break;
            }

        }
    }

}

int main() {

    isOpenDB = ConectaDB();

    if ( isOpenDB )
        cout << "Successo na conexão !" << endl;
    else cout << "conexão falhou ! " << endl;

    estudante st[100];
    while ( 1 ) {
        int escolha;
        cout<<" Escolha Operation " << endl;
        cout << "1. Adicionar estudante"  << endl;
        cout << "2. Listar estudante" << endl;
        cout << "3. Atualizar estudante" << endl;
        cout << "4. Apagar estudante" << endl;
        cout << "5. Sair " << endl;
        cout << "6. Backup do banco de dados " << endl;
        cout << "7. Restaurar banco de dados " << endl;

        cout << "Digite a Operação NO :  ";

        cin >> escolha ;

        if(escolha == 1) {
            int count = addDataRow();

            if ( count == SQLITE_DONE ) {
                cout << "Inserido com sucesso !" << endl;
            }
        }

        if (escolha==2) {
            getTableData();
        }

        if (escolha==3) {
            updateRow();
        }

        if(escolha==4) {
            deleteRow();
        }

        if ( escolha == 5 ) {
            break;
        }

        if ( escolha == 6 ) {
            back_up_database();
        }

        if ( escolha == 7 ) {
            restore_database();
        }

    }
    return 0;
}

bool ConectaDB () {

    if ( sqlite3_open(DB, &dbfile) == SQLITE_OK ) {
        isOpenDB = true;
        return true;
    }


    return false;
}

void DesconectaDB () {

    if ( isOpenDB == true ) {
        sqlite3_close(dbfile);
    }
}

int back_up_database() {

}

int restore_database() {

}