[Glpi-dev] Ticket #3460 : Use LDAP paged results available in PHP 5.4

2012-04-10 Thread Walid nouh

Bonjour à tous,

J'ai commencé à implémenter cette nouvelle fonctionnalité PHP 5.4 qui va 
permettre enfin de contourner ces problèmes de sizelimit LDAP.
J'ai donc ajouté une option qui permet de définir si on utilise les 
résultats par page (c'est à dire si on peut, si on est en PHP 5.4) et si 
oui de définir la taille de la page.


J'ai testé sur un openldap avec 1600 users (et une limite de recherche 
niveau serveur à 500 entrées), en récupérant par page de 200.
Je n'ai pas encore modifié tous les ldap_search, ça va venir rapidement 
(il en reste 2).


Walid.

Index: trunk/install/mysql/glpi-0.84-empty.sql
===
--- trunk/install/mysql/glpi-0.84-empty.sql	(revision 18209)
+++ trunk/install/mysql/glpi-0.84-empty.sql	(revision 18210)
@@ -71,6 +71,8 @@
   `email2_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
   `email3_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
   `email4_field` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
+  `pagesize` int(11) NOT NULL DEFAULT '0',
+  `can_support_pagesize` tinyint(1) NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`),
   KEY `date_mod` (`date_mod`),
   KEY `is_default` (`is_default`),
Index: trunk/install/update_0831_084.php
===
--- trunk/install/update_0831_084.php	(revision 18209)
+++ trunk/install/update_0831_084.php	(revision 18210)
@@ -1481,8 +1481,9 @@
   $migration-dropField('glpi_profiles', 'view_ocsng');
   $migration-dropField('glpi_profiles', 'clean_ocsng');
}
-
-
+   $migration-addField('glpi_authldaps', 'pagesize', 'integer');
+   $migration-addField('glpi_authldaps', 'can_support_pagesize', 'bool');
+   
//  Keep it at the end **
//TRANS: %s is the table or item to migrate
$migration-displayMessage(sprintf(__('Data migration - %s'), 'glpi_displaypreferences'));
Index: trunk/inc/authldap.class.php
===
--- trunk/inc/authldap.class.php	(revision 18209)
+++ trunk/inc/authldap.class.php	(revision 18210)
@@ -134,6 +134,8 @@
 $this-fields['entity_field']  = 'ou';
 $this-fields['entity_condition']  = '(objectclass=organizationalUnit)';
 $this-fields['use_dn']= 1 ;
+$this-fields['can_support_pagesize']  = 1 ;
+$this-fields['pagesize']  = '1000';
 break;
 
  default:
@@ -318,6 +320,23 @@
   echo/td/tr;
 
   echo tr class='tab_bg_1';
+  echo td . __('Use paged results') . /tdtd;
+  if (self::isLdapPageSizeAvailable(false, false)) {
+ Dropdown::showYesNo('can_support_pagesize', $this-fields[can_support_pagesize]);
+  } else {
+ echo input type='hidden' name='can_support_pagesize' value='0'.__('No');
+  }
+  echo /td;
+  if (self::isLdapPageSizeAvailable(false, false)) {
+ echo td . __('Page size') . /tdtd;
+ Dropdown::showInteger(pagesize, $this-fields['pagesize'], 100, 10, 100);
+  } else {
+ echo /td;
+ echo input type='hidden' name=pagesize' value='0';
+  }
+  echo/td/tr;
+  
+  echo tr class='tab_bg_1';
   echo td . __('How LDAP aliases should be handled') . /tdtd colspan='4';
   $alias_options[LDAP_DEREF_NEVER] = __('Never dereferenced (default)');
   $alias_options[LDAP_DEREF_ALWAYS]= __('Always dereferenced');
@@ -330,7 +349,9 @@
   echo tr class='tab_bg_2'td class='center' colspan='4';
   echo input type='submit' name='update' class='submit' value=\.__s('Save').\;
   echo /td/tr;
+  
   echo /table/form/div;
+
}
 
 
@@ -1090,6 +,67 @@
}
 
 
+   static function searchForUsers($ds, $values, $filter, $attrs, $limitexceeded, $user_infos,
+  $ldap_users, $config_ldap) {
+
+  //If paged results cannot be used (PHP  5.4)
+  $cookie   = '';
+  do {
+ if (self::isLdapPageSizeAvailable($config_ldap)) {
+ldap_control_paged_result($ds, $config_ldap-fields['pagesize'], true,$cookie);
+ }
+ $sr = @ldap_search($ds, $values['basedn'], $filter, $attrs);
+ if ($sr) {
+if (in_array(ldap_errno($ds),array(4,11))) {
+   // openldap return 4 for Size limit exceeded
+   $limitexceeded = true;
+}
+$info = self::get_entries_clean($ds, $sr);
+if (in_array(ldap_errno($ds),array(4,11))) {
+   $limitexceeded = true;
+}
+//$user_infos = array();
+ 
+for ($ligne = 0 ; $ligne  $info[count] ; $ligne++) {
+   //If ldap add
+   if ($values['mode'] == self::ACTION_IMPORT) {
+  if (in_array($config_ldap-fields['login_field'], $info[$ligne])) {
+ 

Re: [Glpi-dev] Ticket #3460 : Use LDAP paged results available in PHP 5.4

2012-04-10 Thread Julien Dombre

Salut,

c'est une évolution intéressante pour ceux qui seront en PHP 5.4 
effectivement.


++

Julien


Le 10/04/2012 10:28, Walid nouh a écrit :

Bonjour à tous,

J'ai commencé à implémenter cette nouvelle fonctionnalité PHP 5.4 qui 
va permettre enfin de contourner ces problèmes de sizelimit LDAP.
J'ai donc ajouté une option qui permet de définir si on utilise les 
résultats par page (c'est à dire si on peut, si on est en PHP 5.4) et 
si oui de définir la taille de la page.


J'ai testé sur un openldap avec 1600 users (et une limite de recherche 
niveau serveur à 500 entrées), en récupérant par page de 200.
Je n'ai pas encore modifié tous les ldap_search, ça va venir 
rapidement (il en reste 2).


Walid.



___
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev


___
Glpi-dev mailing list
Glpi-dev@gna.org
https://mail.gna.org/listinfo/glpi-dev