Edição de Setembro

... revista mensal de programação Open Source

Uma edição repleta de artigos inovadores, redigidos por profissionais, com especial detaque em PHP e PHP-GTK !
  Artigos :
- Design Patterns
- Cross Site Request
- Optimização de código
- Web Services
- Manuel Lemos em entrevista
-
Parceiros :
- Yahoo
- DRI
- Adianti
- PHPClasses
A Revista PHP é distribuida por universidades, instituições e empresas
Solicite-nos informação para publicidade a preços reduzidos !


Artigo 1 / 58

SQLite - Base de dados em forma de livraria


Tags :
sqlite,database, php db, select, php.ini,query, SQLite library


Quando apereceu o SQLite poucos acreditavam que essa tecnologia tivesse sucesso, mas surpreendentemente , ela rápidamente se integrou juntamente com as outras linguagens de programação existentes. No PHP4 era necessário configurar o php.ini para trabalhar com a livraria mas o PHP5 traz tudo pronto a funcionar.Esta base dados é uma base de dados relacional a nível de arquitectura , sendo que todos os processos necessários ao seu funcionamento (tabelas, informação , indices...) ,estão contidos em apenas um unico ficheiro contido e manipulado directamente no sistema, ou seja , é um sistema embebido, cujo motor SQL não necessita de alguma configuração.O SQLite é uma pequena livraria escrita em C escrita por Richard Hipp, e a padronização de acesso e mainupulação de dados é o SQL.A ideia que se matinha de que uma base de dados é uma aplicação do tipo cliente-servidor, cujo protocolo de comunicação TCP-IP atrás de uma porta qualquer, foi posta de lado por esta nova tecnologia que funciona como um ficheiro (na verdade é-o) , no qual toda a informação relativa a uma determinada funcionalidade ou objectivo está contido sob a forma de base de dados.Algumas propriedades do SQLite são no mínimo interessantes:
# Transacções atómicas, consistentes, isoladas, e duráveis (ACID) mesmo até quando o sistemas falha devido a quebra de energia.
Nenhuma configuração - não necessita instalação ou pianel de controlo
Implementa a maioria das normas padrão SQL92.
Uma base d eaddos completa é armazenada num simples ficheiro
As base de dados podem ser partilhadas ente máquinas com diferente ordem de bits
Suporta base d edados acima dos 2 tebibytes (241 bytes) em tamanho
Strings e BLOBs acima dos 2 gibibytes (231 bytes) em tamanho
# Arquitectura base necessária bastante reduzida 400Kib
Mais rápido face aos sistemas de base dados cliente/servidor na maioria das operações
# API de fácil uso
# Implementações TCL incluídas As implementações para as várias linguagens estão disponiveis de forma separada.
Código bem comentado e testado com cobertura d etestes superior a 95%
# Sem dependências
Código fonte de dominio público. Pode usá-lo para o que quiser.

O prestigio reconhecido a esta tecnologia atinguí o apogeu quando o seu criador Richard Hipp, foi reconhecido com o prémio atribuido pela Google e pela colossal editora O´REILLY com o prémio "Open Source Award Winner" em 2005.
Este feito foi o projectar para que muitos utilizadores passasem a pelo menos testar e verifcar as funcionalidades que a tecnologia proporcionava, e o certo é que muitos passaram a utilizá-la com frequência, não só devido à facilidade de gestão mas à sua rápidez e portabilidade.
om o surgimento do PHP- GTK (a livraria que permite criar aplicações gráficas), o SQLite, teve junto dos programadores PHP o merecido reconhecimento e passou a ser utilizado em massa.


    <?php

    
/**
     * @version 1.0
     * @author   : José Augusto Ferreira Franco <guto.onidesk@gmail.com>
      * @Webname :  Webmaster Guto Ferreira
      * @ PHPClasses  Inovation Award Winner Dec 2005
      */


    /***
       *@  Definição da classe
       *@
     *@  Class defenition
     **/

    
class DB{

     var 
$conn;
     var 
$table;

    
/***
      *@ Método constructor
      *@
      *@  Constructor method
      **/

     
function db()
     {
     
$this->connNULL;
     }
 
     
/***
      *@ Cria  a base de dados
      *@
      *@ Builds database
      **/

 
     
function Create_db($dbase)
     {
     if(
$this->isExtension($dbase)==true){
     
$this->conn = @sqlite_open($dbase,0666,$error);
     }
     
$conn $this->conn;
     if(!
is_resource($this->conn)&&(!file_exists($dbase)))
     {
         unset(
$this->conn);
     @
unlink(basename($dbase));
     die(
$this->alert(10));
    }

     return 
$conn;
     }
 
 
     
/**@
      *@ (pt) Limita o número de extensões para a base de addos
      *@ (en) Limits databases extensions
      **/

      
function isExtension($db)
      {
       list(
$db1,$db2) = array('db','txt');
       if(
is_string($db)){
       list(
$name,$ext) = explode(".",$db);
       if((
$ext != $db1) && ($ext != $db2)){
       die(
$this->alert(11));
       }else{
       return 
true;
           }
         }
     }
 
    
/**@
      *@ (pt) Cria a tabela e respectivos campos
      *@ (en) Creates table and respective fields
      **/
      
function Create_Table($values){
     foreach(
$values as $Rows => $Type){
     
$arrfields[] = $Rows;
     
$dataType[]  = $Type;
     
$arrValues[] = "".$Rows." ".$Type."";
     }
 
  
/// nome da tabela
 
$table $values["TABLE"];
 
 
$arr_rows implode(", ",$arrfields);

 
///// nome dos campos da tabela
$this->fields substr($arr_rows,10,strlen($arr_rows));


$strFields implode(", ",$arrValues);

 
/// campos e tipo de dados
$Fields substr($strFields,strlen($table)+7,strlen($strFields));

if(
$this->Check_Table($table)!=true){
$gen_table $this->Exec_Query("CREATE TABLE ".$table." (".$Fields.")");
}
 
// corecção : se a tabela já existisse este alert era imprimido na mesma
  
if(!$gen_table && !DB::Check_Table($table)){
  print 
$this->alert(12);
  }
  return 
$gen_table;
 } 
/**
  *@ Insere os dados na tabela
  *@ Inserts data on table
  **/
 
 
function Insert($table,$args){

 foreach(
$args as $x => $k){
  
$arrX[] = $x;
  
$arrK[] = "'".$k."'"
}

$strRows   implode(",",$arrX);
$strValues implode(",",$arrK);

$insert DB::Exec_Query("INSERT INTO {$table} ( $strRows ) VALUES ( $strValues )"); 

 if(!
$insert){
 print 
$this->alert(13);
  }
 return 
$insert;
 }



 function 
Select($args){
  if(
$args["ORDER"]!=''){
  
$order "ORDER BY ".$args["ORDER"];    /////  $args["ORDER"] podemos informar também a disposição aquí ex. "ORDER"=>"name ASC"
  
}
  if(
is_array($args)){
  if(
is_resource($args["RESOURCE"])){
  switch(
$args["QUERY"]){
  case 
1:
  
$query "SELECT ".$args["ROWS"]." FROM ".$args["TABLE"]." WHERE ".$args["AFFECT"]." ='".$args["CURRENT"]."' ".$order.";";
  break;
  case 
2:
  
$query "SELECT ".$args["ROWS"]." FROM ".$args["TABLE"]." WHERE ".$args["AFFECT"]." ='".$args["CURRENT"]."' AND ".$args["NEWAFFECT"]."='".$args["NEWCURRENT"]."' ".$order.";";
   
///// PODEMOS CONTINUAR A CONSTRUIR AS CONSULTAS(queries) DESEJADAS
  
break;
  case 
3:
  
$query "SELECT * FROM ".$args["TABLE"].";";
  break;
  default:
  
$query $args["SQL"];
  }
  return 
$query;
    }
  }else{
  return 
false;
  }
}



function 
Get_NumRows($sql){
$query DB::Exec_Query($sql);
$n_rows sqlite_num_rows($n_rows);
return 
$n_rows 
}


function 
GetData($query,$rows=array()){
$temp = array();

while(
$data=sqlite_fetch_array($query,SQLITE_ASSOC)) {
    foreach(
$rows as $lines ){
        
$temp[] = $data[$lines];
    }
   @
sqlite_next($query);
}
return 
$temp;
}
 
/**@
  *@ (pt)  Executa uma pedido à base de dados
  *@ (en) Performs a query to database
  **/
 
 
function Exec_Query($sql)
 {
  return 
sqlite_query($this->conn,$sql);
 }
 
 
 
/**
  *@ (pt)  Permite fazer uma alteração à tabela
  *@ (en) Allows to altear the table
      **/
   
function  Alter_Table($args=array())
     {

      
$strRows $this->Data_Types($args['rows']);
      
$rows ereg_replace("[ \t]+|[()0-9]*","",$strRows); // retira os caracteres tipo (int)


   
$query .= "BEGIN TRANSACTION;";
   
$query .= "CREATE TEMPORARY TABLE {$args['table']}_bkp ({$args['rows']});";
   
$query .= "INSERT INTO {$args['table']}_bkp SELECT {$args['save']} FROM {$args['table']};";
   
$query .= "DROP TABLE $this->table;";
   
$query .= "CREATE TABLE {$args['table']} ({$args['rows']});";
   
$query .= "INSERT INTO {$args['table']} SELECT {$rows} FROM {$args['table']}_bkp;";
   
$query .= "DROP TABLE {$args['table']}_bkp;";
   
$query .= "COMMIT;";

       
$_query explode(";",$query);
        for(
$i=0;$i<8;$i++)
        {
         
$transaction $_query[$i];
         
$exec $this->Exec_Query($transaction);
        }
       
$results $this->Fetch_Results($exec,0);
       return 
$results;
     }



/**
  *@ (pt) Permite 'varrer' de dados permitidos no SQLite
  *@ (en) Allows 'to sweep' all data types allowed on SQLite
  **/

   
function Data_Types($arr_rows)
     {
       
$Data_Types = array("INTEGER"   => "",
                           
"FLOAT"     => "",
                           
"BLOB"      => "",
                           
"BOOLEAN"   => "",
                           
"CHARACTER" => "",
                           
"CLOB"      => "",
                           
"KEY"       => "",
                           
"NATIONAL"  => "",
                           
"NUMERIC"   => "",
                           
"NVARCHAR"  => "",
                           
"PRIMARY"   => "",
                           
"TEXT"      => "",
                           
"TIMESTAMP" => "",
                           
"UNIQUE"    => "",
                           
"VARCHAR"   => "",
                           
"VARYING"   => "");

       
$rows strtr($arr_rows,$Data_Types);

       return 
$rows;

      }
      
      



 
 

/**@
  *@ (pt) Avalia a existência da tabela
  *@ (en) Checks for table existence
  **/

   
function Check_Table($table)
      {
       
$result $this->Exec_Query("SELECT name FROM sqlite_master WHERE type='table' AND name='".$table."'");
       if(
sqlite_num_rows($result) > 0){
       return 
true;
       }
      }
      
 
/**
  *@ (pt) Forma como os dados são devolvidos
  *@ (en) Way as data is returned
  **/
  
function Fetch_Results($query,$type)
      {
       switch(
$type){
       case 
'0':  # retorna os indices associativos (campos nomeados)
       
$result sqlite_fetch_all($query,SQLITE_ASSOC);
       break;
       case 
'1'# retorna apenas os indices numéricos
       
$result sqlite_fetch_all($query,SQLITE_NUM);
       break;
       case 
'2':  # retorna os indices associativos ou numéricos
       
$result sqlite_fetch_all($query,SQLITE_BOTH);
       break;
       case 
'3'#Returna um array de tipo de colunas de determinda tabela
       
$result sqlite_fetch_column_types($this->table,$this->handleSQLITE_ASSOC);
       break;
       case 
'4':
       
$result sqlite_fetch_single($query);
       break;
       default:
       return 
true;
       }
       return 
$result;
     }


/**
  *@ (pt)  Aumenta a performance do SQLite
  *@ (en)  Increase the performance of SQLite
  **/
   
function Turbo()
     {
      
$maxMode $this->Exec_Query($this->Pragma(10,'off'));
      
$maxMode $this->Exec_Query($this->Pragma(11,'off'));
      
$maxMode $this->Exec_Query($this->Pragma(12,'true'));
      return 
$maxMode;
     }


/**
  *@ (pt) Generaliza as claúsulas para performance do SQLITE
  *@ (en) Generalizes Pragma statements for SQLITE performance
  **/
  
function Pragma($num,$arg='')
    {
     
$pragma[10]= "PRAGMA default_synchronous = ".$arg;
     
$pragma[11]= "PRAGMA empty_result_callbacks = ".$arg;
     
$pragma[12]= "PRAGMA auto_vacuum = ".$arg;
     return 
$pragma[$num];
    }



/**@
  *@ (pt) Fecha a ligação com  a base de dados
  *@ (en) Closes the connection with database
  **/

   
function Close()
     {
      return 
sqlite_close($this->conn);
     }

    
/**@
      *@ (pt) Apaga o valor das váriáveis da memória
      *@ (en) Deletes the variables values from memory
       **/

       
function noBuffer()
     {
       unset(
$this->conn);
       unset(
$this->db);
       unset(
$this->table);
       unset(
$this->fields);
     }

    
/**@
      *@ (pt) Define as mensagens utilizadas na classe
      *@ (en) Defines messages used on this class
      **/

 
 
  
function alert($num)
      {
       switch(
lang){
      case 
'pt':
       
$alert[10]= "Erro ao tentar criar a base de dados";
       
$alert[11]= "Apenas as extensões *.db e *.txt são válidas";
       
$alert[12]= "Erro ao tentar criar a tabela";
       
$alert[13]= "Erro ao inserir";
       break;
       case 
'en':
       
$alert[10]= "Error when trying to create database";
       
$alert[11]= "Only extensions *.db and *.txt are valid";
       
$alert[12]= "Error when trying to buil table";
       
$alert[13]= "Error on inserting";
       break;
       default:
       
$alert[10]= "Erro ao tentar criar a base de dados";
       
$alert[11]= "Apenas as extensões *.db e *.txt são válidas";
       
$alert[12]= "Erro ao tentar criar a tabela";
       
$alert[13]= "Erro ao inserir";
         }
       return 
$alert[$num];
      }


    }
// fecha a classe


    
?>


Comentários
Nome
Email
Comentário

+=
Não existem comentários para este artigo

Links patrocinados

Sponsors

Revista PHP Edição online
 Estão online 2 utilizadores !
38.103.63.61

Artigos publicados online

  • em breve
  • Publicidade
  • eXTReMe Tracker

Promove-te

A Revista PHP, está a receber propostas para edição em edições seguintes. Os teus artigos serão revistos por uma equipa profissional, e publicados de acordo com o grau de profissionalismo. A revista tem um ISSN associado, o que significa que os artigos aquí publicados serão de interesse ciêntifico, podendo ser utilizados em trabalhos de pesquisa tecnologica desde que citada a fonte !