Advertisement
Guest User

Untitled

a guest
Jul 27th, 2018
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QML 18.34 KB | None | 0 0
  1. import QtQuick 2.5
  2. import QtQuick.LocalStorage 2.0
  3.  
  4. Item {
  5.     id : localStorage
  6.  
  7.     property var doctors : []
  8.     property var aoe : []   //areas of expertise
  9.  
  10.     readonly property int newData: 1
  11.     readonly property int updateData: 2
  12.     readonly property int sameData: 0
  13.  
  14.     function fetchData(url) {
  15.         request(url, function (resp) {
  16.             if (resp.responseText.length > 0) {
  17.                 var md5Hash = resp.getResponseHeader("Content-MD5");
  18.  
  19.                 //strip from html tags (ez regex)
  20.                 var clean = resp.responseText.replace(/<\/?[^>]+(>|$)/g, "");
  21.  
  22.                 try {
  23.                     //translate response into object
  24.                     var response = JSON.parse(clean);
  25.                     try {
  26.                         switch(dbCheckHash(md5Hash)) {
  27.                         case newData:
  28.                             //insert md5 hash into hash table
  29.                             dbInsertHash(md5Hash);
  30.  
  31.                             //insert data into docs table
  32.                             for(var i = 0; i < response.aerzte.length; i++) {
  33.                                 dbInsert('Doctors', response.aerzte[i]);
  34.                             }
  35.  
  36.                             //insert data into aoe table
  37.                             for(i = 0; i < response.fachgebiete.length; i++) {
  38.                                 dbInsert('AreaOfExpertise',
  39.                                          response.fachgebiete[i]);
  40.                             }
  41.                             break;
  42.                         case updateData:
  43.                             dbCheckUpdate('Doctors', response.aerzte);
  44.                             dbCheckUpdate('AreaOfExpertise',
  45.                                           response.fachgebiete);
  46.                             dbUpdate('md5hash', md5Hash);
  47.                             break;
  48.                         default:    //sameData
  49.                             break;
  50.                         }
  51.                         template_.readDB();
  52.                     }
  53.                     catch(err) {
  54.                         console.log("Error during inserting! Err.: " + err)
  55.                         template_.readDB();
  56.                     }
  57.                 }
  58.                 catch (err) {
  59.                     //db finished populating -> fill arrays
  60.                     template_.readDB();
  61.                 }
  62.             }
  63.         });
  64.     }
  65.  
  66.     function request(url, callback) {
  67.         var xhr = new XMLHttpRequest();
  68.         xhr.onreadystatechange = (function(myxhr) {
  69.             return function() {
  70.                 callback(myxhr);
  71.             }
  72.         })(xhr);
  73.         xhr.open("GET", url + ((/\?/).test(url) ? "&" : "?") +
  74.                  (new Date()).getTime());
  75.         xhr.send('');
  76.     }
  77.  
  78.     function dbInit(tableName) {
  79.         var db = dbGetHandle();
  80.  
  81.         try {
  82.             if (tableName === "Doctors") {
  83.                 db.transaction(function (sqlExec) {
  84.                     sqlExec.executeSql('CREATE TABLE IF NOT EXISTS ' +
  85.                                        tableName + ' (
  86.                                        id text,
  87.                                        vorname text,
  88.                                        nachname text,
  89.                                        titel text,
  90.                                        titel_nachstehend text,
  91.                                        geschlecht text,
  92.                                        foto text,
  93.                                        fachgebiete text,
  94.                                        ebene_de text,
  95.                                        ebene_en text,
  96.                                        website text,
  97.                                        email text,
  98.                                        telefon text,
  99.                                        mobil text,
  100.                                        fax text)');
  101.                 })
  102.             }
  103.             else if (tableName === "AreaOfExpertise") {  //AreaOfExpertise
  104.                 db.transaction(function (sqlExec) {
  105.                     sqlExec.executeSql('CREATE TABLE IF NOT EXISTS ' +
  106.                                        tableName + ' (
  107.                                        id text,
  108.                                        name_de text,
  109.                                        name_en text,
  110.                                        name_ro text,
  111.                                        name_ru text,
  112.                                        subfachgebiete text,
  113.                                        anzeigen text)');
  114.                 })
  115.             }
  116.             else {  //md5hash
  117.                 db.transaction(function (sqlExec) {
  118.                     sqlExec.executeSql('CREATE TABLE IF NOT EXISTS ' +
  119.                                        tableName + ' (
  120.                                        hash text)');
  121.                 })
  122.             }
  123.         }
  124.         catch(err) {
  125.             console.log("Error creating table in database: " + err)
  126.         }
  127.     }
  128.  
  129.     function dbGetHandle()
  130.     {
  131.         try {
  132.             var db = LocalStorage.openDatabaseSync("DoctorsList",
  133.                                                    "0.1",
  134.                                                    "List of available Doctors and AOEs",
  135.                                                    20000)
  136.         } catch (err) {
  137.             console.log("Error opening database: " + err)
  138.         }
  139.         return db
  140.     }
  141.  
  142.     function dbInsert(tableName, item)
  143.     {
  144.         if (!dbCheckContent(tableName, item.id))
  145.             return;
  146.  
  147.         var db = dbGetHandle()
  148.         var rowid = 0;
  149.  
  150.         if (tableName === 'Doctors') {
  151.             db.transaction(function (sqlExec) {
  152.                 sqlExec.executeSql('INSERT INTO ' + tableName +
  153.                                    ' VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
  154.                                    [item.id,
  155.                                     item.vorname,
  156.                                     item.nachname,
  157.                                     item.titel,
  158.                                     item.titel_nachstehend,
  159.                                     item.geschlecht,
  160.                                     item.foto,
  161.                                     convertArrayToString(item.fachgebiete),
  162.                                     item.ebene_de,
  163.                                     item.ebene_en,
  164.                                     item.website,
  165.                                     item.email,
  166.                                     item.telefon,
  167.                                     item.mobil,
  168.                                     item.fax])
  169.  
  170.                 var result = sqlExec.executeSql('SELECT last_insert_rowid()')
  171.                 rowid = result.insertId
  172.             })
  173.         }
  174.         else {  //AreasOfExpertise
  175.             db.transaction(function (sqlExec) {
  176.                 sqlExec.executeSql('INSERT INTO ' + tableName +
  177.                                    ' VALUES(?, ?, ?, ?, ?, ?, ?)',
  178.                                    [item.id,
  179.                                     item.name_de,
  180.                                     item.name_en,
  181.                                     item.name_ro,
  182.                                     item.name_ru,
  183.                                     JSON.stringify(item.subfachgebiete),
  184.                                     item.anzeigen])
  185.  
  186.                 var result = sqlExec.executeSql('SELECT last_insert_rowid()')
  187.                 rowid = result.insertId
  188.             })
  189.         }
  190.  
  191.         return rowid;
  192.     }
  193.  
  194.     function dbCheckUpdate(tableName, data) {
  195.         var db = dbGetHandle();
  196.         var results;
  197.  
  198.         //check if something new or changed
  199.         for(var i = 0; i < data.length; i++) {
  200.             db.transaction(function (sqlExec) {
  201.                 results = sqlExec.executeSql('SELECT * FROM ' + tableName +
  202.                                              ' WHERE id LIKE ' + data[i].id);
  203.             })
  204.  
  205.             if (results.rows.length === 0) { //new entry
  206.                 console.log("New Entry " + tableName);
  207.                 dbInsert(tableName, data[i]);
  208.             }
  209.             else {  //check if changed
  210.                 if (!itemExists(tableName, data, results.rows.item(0))) {
  211.                     console.log("Update " + tableName);
  212.                     dbUpdate(tableName, data[i]);
  213.                 }
  214.             }
  215.         }
  216.  
  217.         db.transaction(function (sqlExec) {
  218.             results = sqlExec.executeSql('SELECT * FROM ' + tableName);
  219.         })
  220.  
  221.         //check if something to delete
  222.         for(var j = 0; j < results.rows.length; j++) {
  223.             if (!itemToDelete(data, results.rows.item(j))) {
  224.                 console.log("Delete " + tableName);
  225.                 dbDelete(tableName, results.rows.item(j));
  226.             }
  227.         }
  228.     }
  229.  
  230.     function itemExists(tableName, newData, refData) {
  231.         var found = false;
  232.         for(var i = 0; i < newData.length; i++) {
  233.             if (sameItem(tableName, newData[i], refData)) {
  234.                 found = true;
  235.                 break;
  236.             }
  237.         }
  238.  
  239.         return found;
  240.     }
  241.  
  242.     function sameItem(tableName, newData, refData) {
  243.         //strip null to be able to compare with ""
  244.         for(var key in refData) {
  245.             if (!refData[key]) refData[key] = '';
  246.         }
  247.  
  248.         if (tableName === 'Doctors') {
  249.             if (newData.vorname === refData.vorname &&
  250.                     newData.nachname === refData.nachname &&
  251.                     newData.titel === refData.titel &&
  252.                     newData.titel_nachstehend === refData.titel_nachstehend &&
  253.                     newData.geschlecht === refData.geschlecht &&
  254.                     newData.foto === refData.foto &&
  255.                     convertArrayToString(newData.fachgebiete) ===
  256.                     refData.fachgebiete &&
  257.                     newData.ebene_de === refData.ebene_de &&
  258.                     newData.ebene_en === refData.ebene_en &&
  259.                     newData.website === refData.website &&
  260.                     newData.email === refData.email &&
  261.                     newData.telefon === refData.telefon &&
  262.                     newData.mobil === refData.mobil &&
  263.                     newData.fax === refData.fax) {
  264.                 return true
  265.             }
  266.             return false;
  267.         }
  268.         else if (tableName === 'AreaOfExpertise') {
  269.             if (newData.name_de === refData.name_de &&
  270.                     newData.name_en === refData.name_en &&
  271.                     newData.name_ro === refData.name_ro &&
  272.                     newData.name_ru === refData.name_ru &&
  273.                     newData.subfachgebiete === refData.subfachgebiete &&
  274.                     newData.anzeigen === refData.anzeigen) {
  275.                 return true
  276.             }
  277.             return false;
  278.         }
  279.     }
  280.  
  281.     function dbUpdate(tableName, data) {
  282.         var db = dbGetHandle();
  283.         var results;
  284.  
  285.         if (tableName === "md5hash") {
  286.             db.transaction(function (sqlExec) {
  287.                 sqlExec.executeSql('UPDATE ' + tableName +
  288.                                    ' SET hash = ' + "'" + data + "'")
  289.             })
  290.         }
  291.         else if (tableName === "Doctors") {
  292.             db.transaction(function (sqlExec) {
  293.                 sqlExec.executeSql('UPDATE ' + tableName +
  294.                        ' SET vorname = ' + "'" + data.vorname + "', " +
  295.                        'nachname = ' + "'" + data.nachname + "', " +
  296.                        'titel = ' + "'" + data.titel + "', " +
  297.                        'titel_nachstehend = ' + "'" + data.titel_nachstehend +
  298.                        "', " +
  299.                        'geschlecht = ' + "'" + data.geschlecht + "', " +
  300.                        'foto = ' + "'" + data.foto + "', " +
  301.                        'fachgebiete = ' + "'" + data.fachgebiete + "', " +
  302.                        'ebene_de = ' + "'" + data.ebene_de + "', " +
  303.                        'ebene_en = ' + "'" + data.ebene_en + "', " +
  304.                        'website = ' + "'" + data.website + "', " +
  305.                        'email = ' + "'" + data.email + "', " +
  306.                        'telefon = ' + "'" + data.telefon + "', " +
  307.                        'mobil = ' + "'" + data.mobil + "', " +
  308.                        'fax = ' + "'" + data.fax + "'" +
  309.                        " WHERE id LIKE " + data.id);
  310.             })
  311.         }
  312.         else {  //update aoe
  313.             db.transaction(function (sqlExec) {
  314.                 sqlExec.executeSql('UPDATE ' + tableName +
  315.                        ' SET name_de = ' + "'" + data.name_de + "', " +
  316.                        'name_en = ' + "'" + data.name_en + "', " +
  317.                        'name_ro = ' + "'" + data.name_ro + "', " +
  318.                        'name_ru = ' + "'" + data.name_ru + "', " +
  319.                        'subfachgebiete = ' + "'" + data.subfachgebiete + "', " +
  320.                        'anzeigen = ' + "'" + data.anzeigen + "'" +
  321.                        " WHERE id LIKE " + data.id);
  322.             })
  323.         }
  324.     }
  325.  
  326.     function itemToDelete(refData, dbItem) {
  327.         var found = false;
  328.         for(var i = 0; i < refData.length; i++) {
  329.             if (refData[i].id === dbItem.id) {
  330.                 found = true;
  331.                 break;
  332.             }
  333.         }
  334.  
  335.         return found
  336.     }
  337.  
  338.     function dbDelete(tableName, data) {
  339.         var db = dbGetHandle();
  340.  
  341.         console.log("Delete: " + data.name_de);
  342.         db.transaction(function (sqlExec) {
  343.             sqlExec.executeSql('DELETE FROM ' + tableName +
  344.                                ' WHERE id LIKE ' + data.id);
  345.         })
  346.     }
  347.  
  348.     function dbInsertHash(hash) {
  349.         var db = dbGetHandle()
  350.         db.transaction(function (sqlExec) {
  351.             sqlExec.executeSql('INSERT INTO md5hash VALUES(?)', [hash])
  352.         })
  353.     }
  354.  
  355.     //check if item.id already exists in table
  356.     function dbCheckContent(tableName, id) {
  357.         var db = dbGetHandle();
  358.         var length = 0;
  359.  
  360.         db.transaction(function (sqlExec) {
  361.             var results = sqlExec.executeSql('SELECT id FROM ' + tableName +
  362.                                              ' WHERE id LIKE ' + id)
  363.             length = results.rows.length
  364.         })
  365.  
  366.         if (length > 0)
  367.             return false;   //already in DB
  368.  
  369.         return true;
  370.     }
  371.  
  372.     function dbCheckHash(hash) {
  373.         var db = dbGetHandle();
  374.         var results;
  375.  
  376.         db.transaction(function (sqlExec) {
  377.             results = sqlExec.executeSql('SELECT hash FROM md5hash')
  378.         })
  379.  
  380.         if (results.rows.length === 0)
  381.             return newData;   //no hash stored -> insert first time
  382.  
  383.         //hash already stored -> check if update is needed
  384.         if (results.rows.length > 0) {
  385.             if (results.rows.item(0).hash !== hash)
  386.                 return updateData;   //new hash -> update db
  387.         }
  388.  
  389.         return sameData;   //nothing to do. same hash
  390.     }
  391.  
  392.     function dbReadAll(tableName)
  393.     {
  394.         var db = dbGetHandle()
  395.         var results;
  396.         db.transaction(function (sqlExec) {
  397.             if (tableName === 'Doctors') {
  398.                 results = sqlExec.executeSql('SELECT * FROM ' + tableName +
  399.                                              ' order by nachname asc')
  400.  
  401.                 var lastLetter = "";
  402.                 var first = "1";
  403.  
  404.                 doctors.splice(0, doctors.length);
  405.                 for (var i = 0; i < results.rows.length; i++) {
  406.  
  407.                     //new first letter
  408.                     if (results.rows.item(i).nachname[0] !== lastLetter)
  409.                         first = results.rows.item(i).nachname[0];
  410.                     else
  411.                         first = "0";
  412.  
  413.                     doctors.push({"first" : first,
  414.                                      "id" : results.rows.item(i).id,
  415.                                      "vorname" : results.rows.item(i).vorname,
  416.                                      "nachname" : results.rows.item(i).nachname,
  417.                                      "titel" : results.rows.item(i).titel,
  418.                                      "titel_nachstehend" :
  419.                                      results.rows.item(i).titel_nachstehend,
  420.                                      "geschlecht" : results.rows.item(i).geschlecht,
  421.                                      "foto" : results.rows.item(i).foto,
  422.                                      "fachgebiete" : results.rows.item(i).fachgebiete,
  423.                                      "ebene_de" : results.rows.item(i).ebene_de,
  424.                                      "ebene_en" : results.rows.item(i).ebene_en,
  425.                                      "website" : results.rows.item(i).website,
  426.                                      "email" : results.rows.item(i).email,
  427.                                      "telefon" : results.rows.item(i).telefon,
  428.                                      "mobil" : results.rows.item(i).mobil,
  429.                                      "fax" : results.rows.item(i).fax});
  430.  
  431.                     lastLetter = results.rows.item(i).nachname[0];
  432.                 }
  433.             }
  434.             else {  //AreasOfExpertise
  435.                 results = sqlExec.executeSql('SELECT * FROM ' + tableName)
  436.  
  437.                 aoe.splice(0, aoe.length);
  438.                 for (var j = 0; j < results.rows.length; j++) {
  439.                     aoe.push(results.rows.item(j));
  440.                 }
  441.             }
  442.  
  443.             //console.log(tableName + " entries: " + results.rows.length);
  444.         })
  445.     }
  446.  
  447.     function dbDropTable(dbTableName) {
  448.         var db = dbGetHandle()
  449.         db.transaction(function (sqlExec) {
  450.             var results = sqlExec.executeSql('DROP TABLE IF EXISTS ' +
  451.                                              dbTableName)
  452.  
  453.             console.log("DELETED DB " + dbTableName);
  454.         })
  455.     }
  456.  
  457.     function dbDrop(dbName) {
  458.         var db = dbGetHandle()
  459.         db.transaction(function (sqlExec) {
  460.             var results = sqlExec.executeSql('DROP DATABASE IF EXISTS ' +
  461.                                              dbName)
  462.  
  463.             console.log("DROP DB " + dbName);
  464.         })
  465.     }
  466.  
  467.     //convert array to string/text; sqlite does not support arrays
  468.     function convertArrayToString(array) {
  469.         var result = "";
  470.         for(var i = 0; i < (array.length - 1); i++) {
  471.             result += array[i] + ",";
  472.         }
  473.  
  474.         result += array[array.length - 1];
  475.  
  476.         return result;
  477.     }
  478. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement