GlisWeb framework
_indirizzi.geocode.php
Vai alla documentazione di questo file.
1 <?php
2 
14  // inclusione del framework
15  if( ! defined( 'CRON_RUNNING' ) ) {
16  require '../../../_src/_config.php';
17  }
18 
19  // inizializzo l'array del risultato
20  $status = array();
21 
22  // status
23  $status['info'][] = 'inizio operazioni di geocode';
24 
25  // lock delle tabelle della coda
26  $lock = mysqlQuery( $cf['mysql']['connection'], 'LOCK TABLES indirizzi WRITE, comuni WRITE, stati WRITE, provincie WRITE, regioni WRITE, zone_cap WRITE' );
27 
28  // se il lock è andato a buon fine
29  if( $lock === true ) {
30 
31  // prelevo un indirizzo dalla coda
32  $geocode = mysqlSelectRow(
33  $cf['mysql']['connection'],
34  'SELECT indirizzi.*, '.
35  'comuni.id_provincia, '.
36  'provincie.sigla, '.
37  'comuni.nome AS comune, '.
38  'stati.iso31661alpha2 AS sigla_stato, '.
39  'stati.nome AS stato '.
40  'FROM indirizzi '.
41  'LEFT JOIN comuni ON comuni.id = indirizzi.id_comune '.
42  'LEFT JOIN provincie ON provincie.id = comuni.id_provincia '.
43  'LEFT JOIN regioni ON regioni.id = provincie.id_regione '.
44  'LEFT JOIN stati ON stati.id = regioni.id_stato '.
45  'WHERE ( latitudine IS NULL OR longitudine IS NULL OR cap IS NULL ) '.
46  'AND ( timestamp_geocode IS NULL OR timestamp_geocode < ? OR timestamp_aggiornamento > timestamp_geocode ) '.
47  'ORDER BY timestamp_geocode ASC '.
48  'LIMIT 1 ',
49  array( array( 's' => strtotime( '-1 day' ) ) )
50  );
51 
52  // debug
53  // echo 'indirizzo: ' . print_r( $geocode, true );
54 
55  // se c'è almeno una geocode da inviare
56  if( ! empty( $geocode ) ) {
57 
58  // status
59  $status['indirizzo'] = $geocode;
60 
61  // inizio la transazione
62  if( mysqlQuery( $cf['mysql']['connection'], 'START TRANSACTION' ) ) {
63 
64  // geolocalizzazione
66  $cf['memcache']['connection'],
67  $cf['mapquest']['server']['key'],
68  $geocode['civico'],
69  $geocode['indirizzo'],
70  $geocode['comune'],
71  $geocode['stato']
72  );
73 
74  // debug
75  // print_r( $gc );
76 
77  // controllo l'esito dell'invio
78  // TODO gestire il caso in cui l'API non restituisca risultati utili
79  // NOTA il meccanismo deve essere in grado di ritardare i tentativi successivi in modo da non bloccare la coda
80  if( ! empty( $gc ) ) {
81 
82  // aggiornamento database
83  mysqlQuery(
84  $cf['mysql']['connection'],
85  'UPDATE indirizzi SET latitudine = ?, longitudine = ?, cap = ?, timestamp_geocode = unix_timestamp() WHERE id = ?',
86  array(
87  array( 'd' => $gc['lat'] ),
88  array( 'd' => $gc['lng'] ),
89  array( 's' => $gc['cap'] ),
90  array( 's' => $geocode['id'] )
91  )
92  );
93 
94  // se l'indirizzo non ha zona
95  if( empty( $geocode['id_zona'] ) ) {
96 
97  $idZona = mysqlSelectValue( $cf['mysql']['connection'], 'SELECT id_zona FROM zone_cap WHERE cap = ?', array( array( 's' => $gc['cap'] ) ) );
98 
99  if( ! empty( $idZona ) ) {
100  mysqlQuery( $cf['mysql']['connection'], 'UPDATE indirizzi SET id_zona = ? WHERE id = ?', array( array( 's' => $idZona ), array( 's' => $geocode['id'] ) ) );
101  }
102 
103  }
104 
105  // commit
106  mysqlQuery( $cf['mysql']['connection'], 'COMMIT' );
107 
108  // log
109  logWrite( 'salvataggio della geolocalizzazione completato', 'geocode', LOG_DEBUG );
110 
111  } else {
112 
113  // aggiornamento database
114  mysqlQuery(
115  $cf['mysql']['connection'],
116  'UPDATE indirizzi SET timestamp_geocode = unix_timestamp() WHERE id = ?',
117  array(
118  array( 's' => $geocode['id'] )
119  )
120  );
121 
122 # // rollback
123 # mysqlQuery( $cf['mysql']['connection'], 'ROLLBACK' );
124 
125  // commit
126  mysqlQuery( $cf['mysql']['connection'], 'COMMIT' );
127 
128  // status
129  $status['info'][] = 'geolocalizzazione fallita';
130 
131  // log
132  logWrite( 'impossibile ottenere la geolocalizzazione', 'geocode', LOG_ERR );
133 
134  }
135 
136  } else {
137 
138  // status
139  $status['info'][] = 'transazione fallita';
140 
141  // log
142  logWrite( 'impossibile avviare la transazione per geolocalizzare un indirizzo', 'geocode', LOG_ERR );
143 
144  }
145 
146  } else {
147 
148  // status
149  $status['info'][] = 'nessun indirizzo in coda';
150 
151  // log
152  logWrite( 'nessun indirizzo in coda da geolocalizzare', 'geocode', LOG_INFO );
153 
154  }
155 
156  // unlock delle tabelle
157  mysqlQuery( $cf['mysql']['connection'], 'UNLOCK TABLES' );
158 
159  // TODO
160  // qui fare l'invio con geocode_send()
161  // NOTA la variabile $geocode è ancora valorizzata
162 
163  } else {
164 
165  // log
166  logWrite( 'impossibile acquisire il lock sulle tabelle di coda', 'geocode', LOG_ERR );
167 
168  }
169 
170 
171  // output
172  buildJson( array( 'status' => 'OK' ) );
173 
174 ?>
mapquestGetCachedCoords( $m, $key, $civico, $indirizzo, $citta, $stato, $t=MEMCACHE_DEFAULT_TTL, $url='http://www.mapquestapi.com/geocoding/v1/address')
mysqlSelectRow( $c, $q, $p=false, &$e=array())
logWrite( $m, $f='site', $l=LOG_NOTICE, $d=DIRECTORY_LOG, $t=CURRENT_LOG_LEVEL, $s=SITE_STATUS)
scrive un messaggio nei log del sito
Definition: _log.utils.php:48
mysqlQuery( $c, $q, $p=false, &$e=array())
$cf['ricerca']['template']
Definition: _030.common.php:7
mysqlSelectValue( $c, $q, $p=false, &$e=array())
if(! defined( 'CRON_RUNNING')) $status
buildJson( $content, $encoding=ENCODING_UTF8, $headers=array())