mercredi 6 juin 2012

Piwik error after update from 1.7.1 to 1.8.2

Erreur après la mise à jour de piwik depuis la version 1.7.1 vers 1.8.2


Une petite erreur rencontrée lors de la mise à jour automatique de piwik après la mise à jour de la base de données :

SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'piwik'@'localhost' to database 'piwik'
 Go to Piwik
 Login
 Backtrace:

 #0 /var/www/piwik-1.5.1/core/PluginsFunctions/Sql.php(51): Zend_Db_Adapter_Pdo_Abstract->exec('LOCK TABLES pwk...')
 #1 /var/www/piwik-1.5.1/core/PluginsFunctions/Sql.php(205): Piwik_Sql::exec('LOCK TABLES pwk...')
 #2 /var/www/piwik-1.5.1/core/PluginsFunctions/Sql.php(359): Piwik_Sql::lockTables('pwk_archive_num...', 'pwk_archive_num...')
 #3 /var/www/piwik-1.5.1/core/ArchiveProcessing.php(688): Piwik_LockTables('pwk_archive_num...', 'pwk_archive_num...')
 #4 /var/www/piwik-1.5.1/core/ArchiveProcessing.php(533): Piwik_ArchiveProcessing->loadNextIdarchive()
 #5 /var/www/piwik-1.5.1/core/ArchiveProcessing.php(472): Piwik_ArchiveProcessing->initCompute()
 #6 /var/www/piwik-1.5.1/core/Archive/Single.php(226): Piwik_ArchiveProcessing->launchArchiving()
 #7 /var/www/piwik-1.5.1/core/Archive/Array/IndexedBySite.php(192): Piwik_Archive_Single->prepareArchive()
 #8 /var/www/piwik-1.5.1/core/Archive/Array/IndexedBySite.php(131): Piwik_Archive_Array_IndexedBySite->getArchiveIdsAfterLaunching(Array)
 #9 /var/www/piwik-1.5.1/core/Archive/Array/IndexedBySite.php(108): Piwik_Archive_Array_IndexedBySite->loadValuesFromDB(Array)
 #10 /var/www/piwik-1.5.1/core/Archive/Array/IndexedBySite.php(73): Piwik_Archive_Array_IndexedBySite->getValues(Array)
 #11 /var/www/piwik-1.5.1/plugins/MultiSites/API.php(120): Piwik_Archive_Array_IndexedBySite->getDataTableFromNumeric(Array)
 #12 /var/www/piwik-1.5.1/plugins/MultiSites/Controller.php(65): Piwik_MultiSites_API->getAll('day', '2012-06-06', false)
 #13 /var/www/piwik-1.5.1/plugins/MultiSites/Controller.php(37): Piwik_MultiSites_Controller->getSitesInfo(Object(Piwik_View))
 #14 [internal function]: Piwik_MultiSites_Controller->index()
 #15 /var/www/piwik-1.5.1/core/FrontController.php(138): call_user_func_array(Array, Array)
 #16 /var/www/piwik-1.5.1/index.php(53): Piwik_FrontController->dispatch()



La ligne #0 du log indique que l'utilisateur MySQL 'piwik' n'a pas le droit de poser de verrous (privilège '__LOCK TABLES__' ) sur les tables de la base 'piwik'.

Ce qui est normal puisque je ne lui ai pas donné ce droit ;)

Donc, en plus de privilèges existants, à savoir :
* SELECT
* INSERT
* UPDATE
* DELETE
* CREATE
* DROP
* INDEX
* ALTER
* CREATE VIEW
* SHOW VIEW

Il faut ajouter le privilège d'administration  LOCK TABLES  :

REVOKE ALL PRIVILEGES ON `piwik`.* FROM 'piwik'@'localhost';
 GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES, CREATE VIEW, SHOW VIEW
ON `piwik`.* TO 'piwik'@'localhost';

 
Et on oublie pas de recharger les privilèges, ca ne coute rien !
FLUSH PRIVILEGES ;
 
Et c'est reparti !

En résumé, il s'agit plus d'un problème de droits MySQL (un peu trop stricts) que d'un bug de Piwik. D’ailleurs, la FAQ de Piwik est claire sur ce point :

The Mysql USER should have the permission to SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, LOCK.

Have fun !

mardi 24 avril 2012

Initialiser une base PostgreSQL/PostGIS

 

 

 

 

 

Prérequis

  • Une instance PostGreSQL fonctionnelle
  • Le cartouche PostGIS installé

Préparation de la base

su postgres
createdb mabase
createlang plpgsql mabase
psql -d mabase -f /path/to/postgresql/version/share/contrib/postgis.sql
psql -d mabase -f /path/to/postgresql/version/share/contrib/spatial_ref_sys.sql

Création des tables

psql mabase
CREATE TABLE test (id serial PRIMARY KEY,genre text);

Ajout de la colonne géométrique à la table - AddGeometryColumn()

Pour l'instant notre table est vide, nous allons lui ajouter une troisième colonne où seront stockées nos données géométriques.

Nous aurons recours pour cela à la fonction AddGeometryColumn() de PostGIS dont la synthaxe générale est :

AddGeometryColumn( Table, 
                    Colonne_Geometrique, 
                    SRID, 
                    Type_Geometrie, 
                    Dimension);

  • Table est le nom de la table à laquelle doit être ajoutée la colonne géométrique;
  • Colonne_Geometrique est le nom de la colonne géométrique;
  • Type_Geometrie est le le type de géométrie possible:
  • SRID est l'identifiant spatial de projection selon le système de projection choisi.
    A titre d'exemple pour le Lambert II Carto Etendu, srid=27852;
  • Dimension est la dimension des objets géométriques 2D ou 3D ou 4D;
Dans notre cas, nous saisirons :

SELECT AddGeometryColumn( 'test', 'geom', -1, 'GEOMETRY', 2 );
 
 
Avec cette requête, nous avons ajouté la Colonne géométrique geom à la Table 'test'.

Comme nous n'utilisons ici aucun système de projection référencé, nous restons donc dans le plan 2D orthonormal par défaut, nous précisons juste SRID=-1.

Le type de données géométriques (Type_Geometrie) que nous souhaitons enregistrer peut-être de n'importe quel type. Nous préciserons donc par défaut GEOMETRY.
Enfin, nous sommes en 2 Dimensions.

Note
Il aurait été tout à fait possible de créer la table test en faisant directement

CREATE TABLE test (id serial PRIMARY KEY,genre TEXT,geom GEOMETRY);

Mais il y aurait alors eu un perte concernant les méta-données sur les objets géométriques concernant le type, le srid, la dimension.
Il est donc préférable d'avoir recours à la fonction AddGeometryColumn() pour pouvoir tirer profit de ces métadonnées.