Project

General

Profile

Actions

Send JavaScript

function sqlitesync_SyncSendData() {
    sqlitesync_AddLog('<b>Starting sending data</b>');

    sqlitesync_SyncGlobalTableIndex = 0;
    sqlitesync_SyncDataToSend = "<?xml version=\"1.0\" encoding=\"utf-8\"?><SyncData xmlns=\"urn:sync-schema\">";
    sqlitesync_SyncSendTable(sqlitesync_SyncGlobalTableIndex);
}

function sqlitesync_SyncSendTable(tableIndex) {
    var selectAllStatement = "select * from sqlite_master where type='table' and sql like '%RowId%'";
    sqlitesync_DB.transaction(function (tx) {
        tx.executeSql(selectAllStatement, [], function (tx, result) {
            var datasetTables = result.rows;
            var item = datasetTables.item(tableIndex);
            if (item['tbl_name'] != "MergeDelete") {

                sqlitesync_SyncDataToSend += "<tab n=\"" + item['tbl_name'] + "\">";

                var columnParts = datasetTables.item(tableIndex).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(',');
                var columnNames = [];
                for (var col in columnParts) {
                    if (typeof columnParts[col] === 'string')
                        columnNames.push(columnParts[col].split(" ")[0]);
                }

                /*** nowe rekordy***/
                var selectForTable = "select * from " + item['tbl_name'] + " where RowId is null";
                var tableName = item['tbl_name'];
                tx.executeSql(selectForTable, [], function (tx, result) {
                    var datasetTable = result.rows;

                    if (datasetTable.length > 0){
                        sqlitesync_AddLog('Sending a new records for the table: ' + item['tbl_name'] + '');
                    }
                    sqlitesync_SyncDataToSend += "<ins>";
                    for (var i = 0, row = null; i < datasetTable.length; i++) {
                        row = datasetTable.item(i);
                        sqlitesync_SyncDataToSend += "<r>";
                        for (var j = 0; j < columnNames.length; j++) {
                            if (columnNames[j].replace(/"/gi, '') != 'MergeUpdate') {
                                sqlitesync_SyncDataToSend += "<" + columnNames[j].replace(/"/gi, '') + ">";
                                sqlitesync_SyncDataToSend += "<![CDATA[" + row[columnNames[j].replace(/"/gi, '')] + "]]>";
                                sqlitesync_SyncDataToSend += "</" + columnNames[j].replace(/"/gi, '') + ">";
                            }
                        }
                        sqlitesync_SyncDataToSend += "</r>";
                    }
                    sqlitesync_SyncDataToSend += "</ins>";
                    /*** zakutalizowane rekordy***/
                    var selectForUpdateTable = "select * from " + item['tbl_name'] + " where MergeUpdate > 0 and RowId is not null";
                    tx.executeSql(selectForUpdateTable, [], function (tx, result) {
                        datasetTable = result.rows;

                        if (datasetTable.length > 0){
                            sqlitesync_AddLog('Sending updated records for the table: ' + item['tbl_name'] + '');
                        }

                        sqlitesync_SyncDataToSend += "<upd>";
                        for (var i = 0, row = null; i < datasetTable.length; i++) {
                            row = datasetTable.item(i);
                            sqlitesync_SyncDataToSend += "<r>";
                            for (var j = 0; j < columnNames.length; j++) {
                                if (columnNames[j].replace(/"/gi, '') != 'MergeUpdate') {
                                    sqlitesync_SyncDataToSend += "<" + columnNames[j].replace(/"/gi, '') + ">";
                                    sqlitesync_SyncDataToSend += "<![CDATA[" + row[columnNames[j].replace(/"/gi, '')] + "]]>";
                                    sqlitesync_SyncDataToSend += "</" + columnNames[j].replace(/"/gi, '') + ">";
                                }
                            }
                            sqlitesync_SyncDataToSend += "</r>";
                        }
                        sqlitesync_SyncDataToSend += "</upd>";
                        sqlitesync_SyncDataToSend += "</tab>";
                        sqlitesync_SyncGlobalTableIndex++;
                        if (sqlitesync_SyncGlobalTableIndex < datasetTables.length)
                            sqlitesync_SyncSendTable(sqlitesync_SyncGlobalTableIndex);
                        else
                            sqlitesync_SyncSendTableDelete(tx);
                    });
                    /***/
                });
                /***/
            }
            else {
                sqlitesync_SyncGlobalTableIndex++;
                if (sqlitesync_SyncGlobalTableIndex < datasetTables.length)
                    sqlitesync_SyncSendTable(sqlitesync_SyncGlobalTableIndex);
                else
                    sqlitesync_SyncSendTableDelete(tx);
            }
        });
    });
}

/*
 * After synchronization, we need to clear marker for updated records to make sure that we will not send it again
 */
function sqlitesync_SyncClearUpdateMarker() {
    var selectAllStatement = "select * from sqlite_master where type='table' and sql like '%RowId%'";
    sqlitesync_DB.transaction(function (tx) {
        tx.executeSql(selectAllStatement, [], function (tx, result) {
            var datasetTables = result.rows;
            for(var tableIndex=0; tableIndex<datasetTables.length; tableIndex++){
                var item = datasetTables.item(tableIndex);
                if (item['tbl_name'].toString().toLowerCase() == "mergeidentity") {

                    tx.executeSql("update MergeIdentity set MergeUpdate=0 where MergeUpdate > 0;", [],function (transaction, result) {},function (transaction, error) {console.log(error);});
                }

                if (item['tbl_name'] != "MergeDelete" && item['tbl_name'] != "MergeIdentity") {
                    var selectForUpdateTable = "select *, ? as syncTableName from " + item['tbl_name'] + " where MergeUpdate > 0";
                    tx.executeSql(selectForUpdateTable, [item['tbl_name']], function (tx, result) {
                        if(result.rows.length > 0){
                            var syncTableName = result.rows.item(0)['syncTableName'];
                            var selectTriggerStatement = "select * from sqlite_master where type='trigger' and name = 'trMergeUpdate_"+syncTableName+"'";
                            tx.executeSql(selectTriggerStatement, [], function (tx, result) {
                                if(result.rows.length > 0){
                                    var syncTableName = result.rows.item(0)['tbl_name'];
                                    var trigger = result.rows.item(0)['sql'];

                                    tx.executeSql("drop trigger trMergeUpdate_"+syncTableName+";", [],function (transaction, result) {

                                    },
                                    function (transaction, error) {
                                    });
                                    tx.executeSql("update " + syncTableName + " set MergeUpdate=0 where MergeUpdate > 0;", [],function (transaction, result) {

                                    },
                                    function (transaction, error) {
                                    });
                                    tx.executeSql(trigger, [],function (transaction, result) {

                                    },
                                    function (transaction, error) {
                                    });
                                }
                            });
                        }
                    });
                    /***/
                }
            }
        });
    });
}

/*
 * After synchronization, we need to clear marker for deleted records to make sure that we will not send it again
 */
function sqlitesync_SyncClearDeletedRecords() {
    var selectAllStatement = "delete from MergeDelete";
    sqlitesync_DB.transaction(function (tx) {
        tx.executeSql(selectAllStatement, [], function (tx, result) {
        });
    });
}

/*
 * Preparing and sending records deleted on device
 */
function sqlitesync_SyncSendTableDelete(tx) {
    var selectForDelete = "select * from MergeDelete";
    tx.executeSql(selectForDelete, [], function (tx, result) {
        datasetTable = result.rows;
        sqlitesync_SyncDataToSend += "<delete>";
        if (datasetTable.length > 0) {
            sqlitesync_AddLog('Sending records for deleting');
        }
        for (var i = 0, row = null; i < datasetTable.length; i++) {
            row = datasetTable.item(i);
            sqlitesync_SyncDataToSend += "<r>";
            sqlitesync_SyncDataToSend += "<tb>" + row['TableId'] + "</tb>";
            sqlitesync_SyncDataToSend += "<id>" + row['RowId'] + "</id>";
            sqlitesync_SyncDataToSend += "</r>";
        }
        sqlitesync_SyncDataToSend += "</delete>";

        sqlitesync_SyncSendToServer();
    });
}

/*
 * Send packge with changes to server
 */
function sqlitesync_SyncSendToServer() {
    sqlitesync_SyncDataToSend += "</SyncData>";

    $.ajax({
        url: sqlitesync_SyncServerURL + "Send",
        method: 'POST',
        headers: {
                'Content-Type':'application/json'
        },
        cache : false,
        scope:this,
        data: JSON.stringify({ "subscriber" : sqlitesync_syncPdaIdent, "content": sqlitesync_SyncDataToSend , "version" : "3" }),
        dataType: 'json',
        timeout: 5 * 60 * 1000,//10min
        success: function (response, status) { //Success Callback

            sqlitesync_SyncClearUpdateMarker();
            sqlitesync_SyncClearDeletedRecords();

            sqlitesync_AddLog('Sending finished');
            //after success we are getting changes from server
            sqlitesync_SyncTables();
        },
        failure: function (result, request) {
            var statusCode = result.status;
            var responseText = result.responseText;
            sqlitesync_AddLog('<p>Error while syncing with the server ' + responseText + '</p>');
        }
    });
}

Updated by Tomek Dziemidowicz 5 months ago · 2 revisions