Index: libs/libmythdb/mythdb.cpp
===================================================================
--- libs/libmythdb/mythdb.cpp	(revision 19900)
+++ libs/libmythdb/mythdb.cpp	(working copy)
@@ -570,3 +570,310 @@
     ClearSettingsCache();
 }
 
+void create_temp_table (QString create_table_name,QString like_name)
+{
+MSqlQuery query(MSqlQuery::InitCon());
+query.prepare("create table " +  create_table_name + " like  " +   like_name + ";" );
+    query.exec();
+    if ( like_name == "settings")
+    {
+        query.prepare("Alter table  " + create_table_name +  " add unique ( value ) ; " );
+        query.exec();
+    }
+    query.prepare(" truncate " + create_table_name + ";" );
+    query.exec();
+};
+
+void create_new_table (QString create_table_name,QString like_name)
+{
+    //should check for table before blindly creating it.
+MSqlQuery query(MSqlQuery::InitCon());
+query.prepare("create table " +  create_table_name + " like  " +   like_name + ";" );
+query.exec();
+};
+
+
+void drop_temp_table (QString tname)
+{
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("drop table " +  tname + ";" );
+    query.exec();
+}
+
+
+
+
+void savesettings (QString hname ,QString templatenumber )
+{
+    QString thname;
+    thname=hname;
+    VERBOSE(VB_IMPORTANT, "Saving..." + templatenumber);
+    QString templatename = "settings_" + templatenumber ;
+    create_new_table(templatename,"settings");
+    VERBOSE(VB_IMPORTANT, thname );
+    // Remove old saved values
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("delete from " + templatename +
+                  " where hostname=:HOSTNAME   ;"  );
+    query.bindValue(":HOSTNAME" ,thname);
+    query.exec();
+    //insert all new settings
+    query.prepare( "replace into " + templatename +
+                 " (select * from settings where hostname=:HOSTNAME  ) ;"  ) ;
+    query.bindValue(":HOSTNAME",thname);
+    query.exec();
+
+    // repeat for keybindings
+    templatename = "keybindings_" + templatenumber ;
+    create_new_table(templatename,"keybindings");
+    query.prepare("delete from " + templatename + " where hostname=:HOSTNAME;");
+    query.bindValue(":HOSTNAME",thname);
+    query.exec();
+
+    query.prepare("replace into " + templatename +
+                 " (select * from keybindings  where hostname=:HOSTNAME  );");
+    query.bindValue(":HOSTNAME",thname);
+    query.exec();
+}
+
+void restoresettings (QString hname, QString templatenumber )
+{
+    QString thname;
+    thname=hname;
+    VERBOSE(VB_IMPORTANT, "Restore..." + templatenumber + " " + thname);
+    if ( settings_check ( templatenumber , thname ) )
+    {
+    // DEFAULT settings are handled by the copy from routine
+        MSqlQuery query(MSqlQuery::InitCon());
+        QStringList tablelist ;
+        QStringList::Iterator it;
+        QString current_table;
+        tablelist.append ("settings");
+        tablelist.append ("keybindings");
+        QString templatename;
+        for ( it = tablelist.begin(); it != tablelist.end(); ++it )
+        {
+            current_table = *it ;
+            //find template table to use
+            QString templatename =  current_table + "_" + templatenumber ;
+            QString temptable="temp_table_" + current_table + "_" + thname ;
+
+            // create temp table for merging settings
+            //The merge is needed to account for any new settings.
+            create_temp_table(temptable, current_table );
+
+            // copy in current settings
+            query.prepare( "replace into  " + temptable +
+                        " (select * from  " + current_table +
+                        " where hostname=:HOSTNAME );" );
+            query.bindValue( ":HOSTNAME" ,  thname  );
+            query.exec();
+
+            // copy in stored settings
+            query.prepare("replace into " + temptable +
+                        " (select * from  " + templatename +
+                        " where hostname=:HOSTNAME ); ");
+            query.bindValue(":HOSTNAME",thname );
+            query.exec();
+
+            // remove current settings.
+            //Need to remove because the old table allows for duplicates
+            //and replace into doesn't seem to replace
+            query.prepare("delete from " + current_table +
+                        " where hostname=:HOSTNAME ;");
+            query.bindValue(":HOSTNAME",thname);
+            query.exec();
+
+            // copy new settings from temp to current
+            query.prepare("replace into " + current_table  +
+                        " (select * from  " + temptable + "  );");
+            query.exec();
+            // drop temptable
+            drop_temp_table(temptable);
+        }
+    }
+};
+
+void deletesettings(QString deletehost , QString templatenumber)
+{
+    int tempItem;
+    QString dhostname;
+    dhostname = deletehost;
+
+    VERBOSE(VB_IMPORTANT, "Deleteing..." + templatenumber);
+    QString templatename = "settings_" + templatenumber ;
+    // Remove old saved values
+    MSqlQuery query(MSqlQuery::InitCon());
+    query.prepare("delete from " + templatename + " where hostname=:HOSTNAME ;");
+    query.bindValue(":HOSTNAME" ,dhostname);
+    query.exec();
+    //check if ok to delete table
+    query.prepare( "select count(*) from "  + templatename + ";"  );
+    if (query.exec() && query.isActive() && query.size() > 0)
+    {
+        query.next();
+        tempItem = query.value(0).toInt();
+        if (  tempItem == 0 )
+            drop_temp_table(templatename);
+    }
+
+    // repeat for keybindings
+    templatename = "keybindings_" + templatenumber ;
+    query.prepare("delete from "  + templatename + " where hostname=:HOSTNAME ;");
+    query.bindValue( ":HOSTNAME" ,   dhostname  );
+    query.exec();
+    //check if ok to delete table
+    query.prepare("select count(*) from " + templatename + ";");
+    if (query.exec() && query.isActive() && query.size() > 0)
+    {
+        query.next();
+        tempItem = query.value(0).toInt();
+        if (  tempItem == 0 )
+            drop_temp_table(templatename);
+    }
+}
+
+void c_from(QString copyhost, QString templatenumber, QString hname)
+{
+    VERBOSE(VB_IMPORTANT, "Copy " + copyhost + " " +
+            templatenumber  + "to " + hname );
+
+    if ( settings_check ( templatenumber , copyhost ) ||
+        templatenumber == "Current" ||
+        templatenumber == "Default" || templatenumber == "Default_1"  )
+    {
+        MSqlQuery query(MSqlQuery::InitCon());
+        //Create temp table, copy in settings from host_template
+        //update hostname for new host,copy temp_table to settings.
+        QStringList tablelist ;
+        QStringList::Iterator it;
+        QString current_table ;
+        tablelist.append ("settings");
+        tablelist.append ("keybindings");
+        QString templatename;
+        QString temptable;
+        QString sub_sql;
+        for ( it = tablelist.begin(); it != tablelist.end(); ++it )
+        {
+            current_table = *it ;
+            VERBOSE(VB_IMPORTANT, current_table );
+            //find template table to use
+            if  ( templatenumber == "Current" )
+                templatename =  current_table ;
+            else if ( templatenumber == "Default_1")
+                templatename = current_table + "_" + "Default" ;
+            else
+                templatename =  current_table + "_" + templatenumber ;
+
+            temptable="temp_table_" + current_table + "_" +   hname ;
+            // create temp table for merging settings
+            create_temp_table(temptable, current_table );
+            VERBOSE(VB_IMPORTANT, temptable + " " + current_table);
+            //copy current settings from  this host  into temptable
+            //minus all Mythvantage settings
+            if ( current_table == "settings")
+            {
+                query.prepare( "replace into  " + temptable +
+                    " (select * from  " + current_table +
+                    "  where hostname=:HOSTNAME and value not like 'HOST%' ) ; " );
+                query.bindValue(":HOSTNAME" , hname);
+            }
+            else
+            {
+                query.prepare( "replace into  " + temptable +
+                    " (select * from  " + current_table +
+                    " where hostname=:HOSTNAME );");
+                query.bindValue(":HOSTNAME" , hname);
+            }
+            query.exec();
+
+            // update hostname to match the hostname of the template
+            query.prepare ("update " + temptable + " set hostname=:HOSTNAME; ");
+            query.bindValue(":HOSTNAME" , copyhost );
+            query.exec();
+
+            // copy current settings from copy host into temptable
+            //minus all Mythvantage settings
+            if ( current_table == "settings")
+                query.prepare( "replace into  " + temptable +
+                            " (select * from  " + templatename  +
+                            " where hostname=:HOSTNAME and value not like 'HOST%' ); " );
+            else
+                query.prepare( "replace into  " + temptable +
+                            " (select * from  " + templatename  +
+                            "  where hostname=:HOSTNAME  );");
+            query.bindValue( ":HOSTNAME" , copyhost  );
+            query.exec();
+
+        //update hostname to match current
+            query.prepare ("update " + temptable + " set hostname=:HOSTNAME ;");
+            query.bindValue( ":HOSTNAME" , hname );
+            query.exec();
+
+        // delete old settings from settings table
+            if ( current_table == "settings")
+            {
+                query.prepare( "delete from " + current_table +
+                            " where hostname=:HOSTNAME and value not like 'HOST%' ;" );
+                query.bindValue( ":HOSTNAME" ,   hname  );
+            }
+            else
+            {
+                query.prepare( "delete from " + current_table +
+                            " where hostname=:HOSTNAME ;" );
+                query.bindValue(":HOSTNAME" , hname );
+            }
+            query.exec();
+
+            // copy settings from temptable to settings
+            if ( current_table == "settings")
+                query.prepare( "replace into " + current_table +
+                            " (select * from  " + temptable +
+                            " where value not like 'HOST% ' ) ;"  );
+            else
+                query.prepare( "replace into " + current_table +
+                            " (select * from  " + temptable + " );" );
+
+            query.exec();
+            drop_temp_table(temptable);
+        };
+    };
+};
+
+bool settings_check (QString tname , QString hname)
+{
+    int tempItem;
+    bool returncode = FALSE ;
+    QString real_tname;
+    if ( tname != "settings" )
+        real_tname="settings_"+tname;
+
+    QString thname;
+    thname = hname;
+
+QString sub_sql;
+    MSqlQuery query(MSqlQuery::InitCon());
+    sub_sql="SELECT count(data) from ";
+    sub_sql+=real_tname;
+    sub_sql+=" where hostname=:HOSTNAME ; ";
+    query.prepare(sub_sql);
+    query.bindValue(":HOSTNAME" , thname );
+
+    if (query.exec() && query.isActive() && query.size() > 0 )
+    {
+        while (query.next())
+        {
+            tempItem = query.value(0).toInt();
+            if (  tempItem >= 5 )
+                returncode = TRUE;
+            else
+                VERBOSE(VB_IMPORTANT,tname +
+                        " Group does not contain valid settings for " + thname);
+
+
+        }
+    }
+    else
+        VERBOSE(VB_IMPORTANT,"Couldn't find " + real_tname );
+    return returncode;
+}
Index: libs/libmythdb/mythdb.h
===================================================================
--- libs/libmythdb/mythdb.h	(revision 19900)
+++ libs/libmythdb/mythdb.h	(working copy)
@@ -71,4 +71,10 @@
 MPUBLIC MythDB *GetMythDB();
 MPUBLIC void DestroyMythDB();
 
+void savesettings(QString,QString);
+void restoresettings(QString,QString);
+void deletesettings(QString,QString);
+void c_from(QString,QString="Current", QString="" );
+bool settings_check (QString,QString);
+
 #endif

