Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

CrazyLOL

Funcoes javascript async

Recommended Posts

Galera, nao sei se o nome do topico seja o que realmente preciso mas.... Espero que possam me ajudar.

 

Estou desenvolvendo um aplicativo em HTml5 com Phonegap e certo momento preciso que meu aplicativo atualize a database interna dela (sqlite) atraves de uma base em um servidor externo (mysql), ate ai esta ok.

 

Para automatizar fiz da seguinte maneira...

 

Meu arquivo PHP hospedado em um servidor:

<?php
include_once 'Config.php';
include_once 'DataBase.php';

$DB = new DataBase();

$request = $_SERVER['REQUEST_METHOD'] == 'GET' ? $_GET : $_POST;

switch ($request['acao']) {
	
	case 'PopularDados':
		
		$arr = array();
		$tabela = addslashes($request['tabela']);

		$sth = $DB->query("select count(*) from ".$tabela);

		//se possuir dados
		if($sth->fetchColumn() > 0){

			$arr['result'] = true;
			$arr['msg'] = '';

			$sth = $DB->query("select * from ".$tabela);
			$sthQ = $DB->query("describe ".$tabela);
			//
			$i = 0; //controlador
			$a = 0; //colunas

			$chave = '';
			$valor = '';

			while($row = $sth->fetch(PDO::FETCH_ASSOC)){
				$chave = '';
				$valor = '';
				foreach ($row as $key => $value) {
					$chave .= $key.",";
					$valor .= "'".$value."',";
				}

				$chave = substr($chave, 0, -1);
				$valor = substr($valor, 0, -1);

				$arr['dados'][$i] = "insert into ".$tabela;
				$arr['dados'][$i] .= " (".$chave.") values";
				$arr['dados'][$i] .= " (".$valor.");";

				$i++;
			}


		}else{
			$arr['result'] = false;
			$arr['msg'] = 'Sem dados';
		}
		

		echo json_encode($arr);
	break;

	case 'CriarTabelas':

		$arr = array();
		
		$sth = $DB->query("show tables");

		$i = 0;
		$a = 0;

		//percorrer todas as tabelas
		while($obj = $sth->fetch(PDO::FETCH_OBJ)){
			//nome da tabela
			$tabela = $obj->Tables_in_smovlex;
			$arr['tabelas'][$a] = $tabela;

			//seleciona a tabela para criar
			$sthQ = $DB->query("DESCRIBE ".$tabela);

			$arr['dados'][$i]  = "CREATE TABLE IF NOT EXISTS ".$tabela." (";

			while($key = $sthQ->fetch(PDO::FETCH_OBJ)){
				$chave = explode("(",$key->Type);

				switch ($chave[0]) {
					case 'int':
						$tipo = 'INTEGER';
						break;

					case 'varchar':
						$tipo = 'TEXT';
						break;
					
					default:
						$tipo = $chave[0];
						break;
				}

				$arr['dados'][$i] .= $key->Field." ".$tipo.",";
			}

			$arr['dados'][$i] = substr($arr['dados'][$i], 0, -1);
			$arr['dados'][$i] .= ");";
			
			$i++;
			$a++;

		}

		echo json_encode($arr);
	break;

	case 'VerificarTabelas':
		
		$arr = array();

		$sth = $DB->query("show tables");

		$i = 0;

		while($obj = $sth->fetch(PDO::FETCH_OBJ)){
			$arr['dados'][$i] = $obj->Tables_in_smovlex;
			$i++;
		}

		echo json_encode($arr);
	break;
}

?>

Meu arquivo JS que faço as chamadas do App para Servidor Externo.

var db;
var dataset;
var _totalUsuario = 0, _totalTabela = 0, _tabela = null;
var NomeBase = 'AppLocal';
var VersaoDB = '1.0';
var url = 'http://localhost/AppProc/';

$.support.cors=true;                     
$.mobile.allowCrossDomainPages = true; 

/*
* Iniciar a base
*/
function initDatabase() {
  
    try {
        if (!window.openDatabase) {
            alert('Navegador sem Suporte');
        } else {
            var shortName = NomeBase;
            var version = '1.0';
            var displayName = 'Banco de dados AppLocal';
            //var maxSizeInBytes = 655365;
            var maxSizeInBytes = 60 * 1024 * 1024;
            db = openDatabase(shortName, version, displayName, maxSizeInBytes);

           //criar banco de dados
           criarBanco();
           //zera as variaveis
           zerarVar();
        }
    } catch(e) {
        if (e == 2) {
            alert('Versao invalida');
        } else {
            alert('erro encontrado: ' + e);
        }
        return;
    }
}

/**
* Criar as tabelas no banco de dados
*/
function criarBanco() {
    //Funcoes.showLoad();
    $.ajax({
            url : url+"procDB.php",
            type: "POST",
            dataType : "json",
            data: {
                acao: 'CriarTabelas'
            },
            success : function(json){
                db.transaction(function (tx) {
                    $.each(json.dados,function(i,obj){
                        //alert(obj);
                        tx.executeSql(obj, [], successShow, handleErrors);
                    });
                });
                //Funcoes.hideLoad();
            },
            error: function(){
               //finaliza transaction
               alert("ERRO para importar a base");
               //Funcoes.hideLoad();
            }
    });
}

/**
* Verificar se existe dados na tabelas
* caso nao exista sera necessario realizar a importacao
* dos dados
*/
function verificarTabelaExiste(tabela){
    var sql = "select * from "+tabela+" limit 10";
    console.log(sql);
    _tabela = tabela;
    
     db.transaction(
        function (tx) {
            tx.executeSql(sql, [], _tabelaExiste, handleErrors);
        }
     );
}

function _tabelaExiste(tx, results){
  dataset = results.rows;
  //console.log(dataset.length);
  if (dataset.length > 0) {
    //existe dados
  } else {
    //nao existe dados importa
     inserirDados(_tabela);
  }
}

/**
* Verificar se existe dados na base
* caso nao exista sera necessario realizar a importacao
* dos dados
*/
function verificarDados(){
    //Funcoes.showLoad();
    $.ajax({
            url : url+"procDB.php",
            type: "POST",
            dataType : "json",
            data: {
                acao: 'VerificarTabelas'
            },
            success : function(json){
               $.each(json.dados,function(i,obj){
                    alert(obj);
                    verificarTabelaExiste(obj);
                });
             //Funcoes.hideLoad();
            },
            error: function(){
               //finaliza transaction
               alert("Erro para verificar os dados da base");
             //Funcoes.hideLoad();
            }
    });
}

/**
 * Total de registro em uma tabela
 */
function totalRegistro(tabela){
    var sql = "SELECT * from "+tabela+" limit 10";
    
    db.transaction(function (tx) {
                   tx.executeSql(sql, [], function (tx, result) {
                                 dataset = results.rows;
                                 alert(dataset.length);
                        });
                   });
}

/**
* Inserir dados vindo de servidor externo
* para SQlite
*/
function inserirDados(tabela) {
    //Funcoes.showLoad();
    $.ajax({
            url : url+"procDB.php",
            type: "POST",
            dataType : "json",
            data: {
                acao: 'PopularDados',
                tabela: tabela
            },
            success : function(json){
                //possui dados
                if(json.result == true){
                    db.transaction(
                        function (tx) {
                            $.each(json.dados,function(i,obj){
                              alert(obj);
                               tx.executeSql(obj, [], successShow, handleErrors);
                            });
                    });
                }else{  
                    //
                }
                //Funcoes.hideLoad();
            },
            error: function(){
               //finaliza transaction
               alert("ERRO para adicionar valores em: "+tabela);
               //Funcoes.hideLoad();
            }
    });
}

function successShow(){
   // alert('sucesso');
}

function handleErrors(transaction, error) {
    //alert(error.code);
    alert(error.message);
    return true; //rollback
}

/**
* Zerar variaveis
*/
function zerarVar(){
    _totalUsuario = 0;
    _totalTabela = 0;
}

Uma preve explicaco do que estou fazendo...

Na hora que eu chamo a funcao:

verificarDados();

A ideia é que traga todas as tabelas do meu banco Mysql, logo apos isso eu chamo a funcao

verificarTabelaExiste();

No qual vejo se na minha base local (Sqlite) possui alguma informacao, caso possua eu ignoro e continuo o processo porem se nao tiver eu preciso inserir as informacoes que estao no Mysql.

 

O problema todo esta sendo no ponto em que inicia a verificaçao das tabelas, vamos supor que meu banco hoje possui 10 tabelas na hora que chamo a primeira funcao entramos nesse bloco:

$.each(json.dados,function(i,obj){
                    alert(obj);
                    verificarTabelaExiste(obj);
                });

Que cada vez que repetir vamos ter uma tabela, porem o processo é executado muito rapido, nao da tempo de verificar se existe dados na minha base SQlite,e se caso nao tiver Inserir dados (pode ter casos que uma tabela tenha 100 registros por exemplo).

 

A solucao logica que teria seria...

Tabela 1 -> chama a funcao verificarTabelaExiste() -> Vejo se possui alguma informacao no Sqlite -> Nao possui -> chama a funcao InserirDados -> Inseriu tudo? - > Se a resposta for Sim vai para a Tabela 2 .... e assim por diante.

mas todo esse processo seria a partir da funcao (verificarDados) e como disse tentei fazer de uma forma mais automatica possivel...

 

Bom espero que a minha duvida esteja clara e agradeço desde ja a ajuda!

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.