| <?php | 
 | /******************************************************************************* | 
 |  * Copyright (c) 2014 Eclipse Foundation and others. | 
 | * All rights reserved. This program and the accompanying materials | 
 | * are made available under the terms of the Eclipse Public License v1.0 | 
 | * which accompanies this distribution, and is available at | 
 | * http://www.eclipse.org/legal/epl-v10.html | 
 | * | 
 | * Contributors: | 
 | *    Wayne Beaton (Eclipse Foundation)- initial API and implementation | 
 | *******************************************************************************/ | 
 |  | 
 | /* | 
 |  * Export committer information from the Foundation database. The information | 
 |  * includes the name, committer id, email addresses, and project affiliations. | 
 |  * | 
 |  * e.g. http://www.eclipse.org/projects/export/committers.json.php | 
 |  * | 
 |  * INTERNAL USE ONLY: restricted to callers within the Eclipse Foundation. | 
 |  */ | 
 | require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php"); | 
 | $App = new App(); | 
 | require_once(dirname(__FILE__) . "/../classes/common.php"); | 
 | require_once(dirname(__FILE__) . "/../classes/debug.php"); | 
 |  | 
 | mustBeEclipseFoundationCaller(); | 
 |  | 
 | $data = array(); | 
 |  | 
 | $data['_comment'] = 'This data is Eclipse Foundation confidential and may only be used as authorized by the Eclipse Foundation.'; | 
 |  | 
 | /* | 
 |  * TODO Do a better job of tracking organization affiliation. | 
 |  * | 
 |  * Unfortunately, the Foundation database does not track dates for organization | 
 |  * affiliation. Further, we only have the ability to affiliate with one company. | 
 |  * In light of this, we do a best guess as the active/inactive dates for affilation | 
 |  * by using--when available--the EntryDate and ExpireDate for the organization | 
 |  * membership as the active/inactive date for the committer. | 
 |  * | 
 |  * Bug 484377 There are some cases where the organization may have more than | 
 |  * one entry in the database (e.g. they changed membership classes). In these | 
 |  * cases, it is probable that only one of the records will contain an empty | 
 |  * inactive date, and so--depending on the order returned by the sort--we may | 
 |  * incorrectly list an inactive date for a company. The query gets a little | 
 |  * twisted to account for this. | 
 |  * | 
 |  * There's two nested queries here. The first makes the data from the organization | 
 |  * tables content consistent for our purposes. If, for example, an inactive date | 
 |  * is null (or otherwise empty), a very large value (Captain Kirk's birthday) is | 
 |  * used in place to allow for a max query in the outer scope. That very large value | 
 |  * is replaced will null before it is used in the query result. | 
 |  * | 
 |  * This is far from ideal, but it's the best information that we have. | 
 |  */ | 
 | $sql = " | 
 |     select | 
 |         p.PersonId as id, p.FName, p.LName, p.Email, pe.Email as secondary, p.comments, | 
 |         a.CCode as CCode, | 
 |         pp.ProjectId, pp.ActiveDate, pp.InactiveDate, | 
 |         org.id as OrganizationId, org.name as OrganizationName, | 
 |         org.isMember as isMember, | 
 |         org.active as OrgActiveDate, | 
 |         org.inactive as OrgInactiveDate | 
 |     from People as p | 
 |         left join PeopleProjects as pp on p.PersonId = pp.PersonId and pp.Relation='CM' | 
 |         left join | 
 |             (select | 
 |                 pa.PersonId, | 
 |                 upper(CCode) as CCode | 
 |             from PeopleAddresses as pa | 
 |             join | 
 |                 (select | 
 |                    PersonId, | 
 |                    max(AddressId) as AddressId | 
 |                 from PeopleAddresses group by PersonId) as id | 
 |             on pa.PersonId=id.PersonId and pa.AddressId=id.AddressId) as a on p.PersonId=a.PersonId | 
 |         left join PeopleEmails as pe on p.PersonId=pe.PersonId | 
 |         left join OrganizationContacts as oc on p.PersonId = oc.PersonId and oc.Relation='EMPLY' | 
 |         left join ( | 
 |             select | 
 |                 id, name, | 
 |                 min(active) as active, | 
 |                 if(date(max(inactive))=date('2233-03-22'),null,max(inactive)) as inactive, | 
 |                 active is not null and date(max(inactive))=date('2233-03-22') as isMember | 
 |             from ( | 
 |                 select | 
 |                     o.OrganizationId as id, o.Name1 as name, | 
 |                     if (om.EntryDate='' OR om.EntryDate='0000-00-00' OR om.EntryDate IS NULL, null, om.EntryDate) as active, | 
 |                     if (om.ExpiryDate='' OR om.ExpiryDate='0000-00-00' OR om.ExpiryDate IS NULL, date('2233-03-22'), om.ExpiryDate) as inactive | 
 |                 from Organizations as o | 
 |                     left join OrganizationMemberships as om on o.OrganizationId=om.OrganizationId | 
 |                 ) as orgs | 
 |             group by id | 
 |         ) as org on oc.OrganizationId=org.id | 
 | 	where OrganizationId is not null or ProjectId is not null"; | 
 | $result = $App->foundation_sql($sql); | 
 |  | 
 | function addEmail(&$committer, $email) { | 
 |     if (!$email) return; | 
 |     $email = utf8_encode($email); | 
 |     if (empty($committer['email'])) $committer['email'] = array(); | 
 |     if (in_array($email, $committer['email'])) return; | 
 |     $committer['email'][] = $email; | 
 | } | 
 |  | 
 | while ($row=mysql_fetch_assoc($result)) { | 
 |     $id = utf8_encode($row['id']); | 
 |     $data['committers'][$id]['id'] = $id; | 
 |     $data['committers'][$id]['first'] = utf8_encode($row['FName']); | 
 | 	$data['committers'][$id]['last'] = utf8_encode($row['LName']); | 
 | 	$data['committers'][$id]['primary'] = $row['Email']; | 
 | 	$data['committers'][$id]['country'] = $row['CCode']; | 
 | 	addEmail($data['committers'][$id], $row['Email']); | 
 |     addEmail($data['committers'][$id], $row['secondary']); | 
 |     if (preg_match_all('/alt-email:(\S+)/i', $row['comments'], $matches)) { | 
 |         foreach($matches[1] as $email) { | 
 |             addEmail($data['committers'][$id], $email); | 
 |         } | 
 |     } | 
 |     if (isset($row['ProjectId'])) { | 
 | 	    $data['committers'][$id]['projects'][$row['ProjectId']] = array( | 
 | 	        'active' => $row['ActiveDate'], | 
 | 	        'inactive' => isset($row['InactiveDate']) ? $row['InactiveDate'] : null | 
 | 	    ); | 
 |     } | 
 |     if (isset($row['OrganizationId'])) { | 
 |         $data['committers'][$id]['affiliations'][$row['OrganizationId']] = array( | 
 |             'name' => $row['OrganizationName'], | 
 |             'active' => $row['OrgActiveDate'], | 
 |             'inactive' => $row['OrgInactiveDate'] | 
 |         ); | 
 |  | 
 |         $orgId = $row['OrganizationId']; | 
 |         $isMember = $row['isMember']; | 
 |         $data['organizations'][$orgId] = array( | 
 |          'id' => $orgId, | 
 |          'name' => $row['OrganizationName'], | 
 |          'isMember' => $isMember, | 
 |          'active' => $row['OrgActiveDate'], | 
 |          'inactive' => $row['OrgInactiveDate'], | 
 |          'url' => $isMember ? "http://eclipse.org/membership/showMember.php?member_id=$orgId" : null, | 
 |          'image' => $isMember ? "http://eclipse.org/membership/scripts/get_image.php?id=$orgId&size=small" : null | 
 |         ); | 
 |     } | 
 | } | 
 |  | 
 | $sql = "select user_uid as id, user_mail as email from users_emailhistory"; | 
 | $result = $App->eclipse_sql($sql); | 
 | while ($row=mysql_fetch_assoc($result)) { | 
 |     $id = $row['id']; | 
 |     if (!$id) continue; | 
 |     if (!isset($data['committers'][$id])) continue; | 
 |     addEmail($data['committers'][$id], $row['email']); | 
 | } | 
 |  | 
 | echo json_encode($data); | 
 | ?> |