| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673 |
- <?php
- /**
- * @file
- * Install, update and uninstall functions for the location module.
- */
- /**
- * Implements of hook_uninstall().
- */
- function location_uninstall() {
- // Delete variables.
- variable_del('location_default_country');
- variable_del('location_display_location');
- variable_del('location_usegmap');
- variable_del('location_locpick_macro');
- // Delete geocoder settings.
- db_delete('variable')
- ->condition('name', db_like('location_geocode_') . '%', 'LIKE')
- ->execute();
- // Delete maxnum settings.
- db_delete('variable')
- ->condition('name', db_like('location_maxnum_') . '%', 'LIKE')
- ->execute();
- cache_clear_all('variables', 'cache_bootstrap');
- }
- /**
- * Implements of hook_schema().
- */
- function location_schema() {
- $schema['location'] = array(
- 'description' => 'Locational data managed by location.module.',
- 'fields' => array(
- 'lid' => array(
- 'description' => 'Primary Key: Unique location ID.',
- 'type' => 'serial',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- ),
- 'name' => array(
- 'description' => 'Place Name.',
- 'type' => 'varchar',
- 'length' => 255,
- 'default' => '',
- 'not null' => TRUE,
- ),
- 'street' => array(
- 'description' => 'Street address, line 1.',
- 'type' => 'varchar',
- 'length' => 255,
- 'default' => '',
- 'not null' => TRUE,
- ),
- 'additional' => array(
- 'description' => 'Street address, line 2.',
- 'type' => 'varchar',
- 'length' => 255,
- 'default' => '',
- 'not null' => TRUE,
- ),
- 'city' => array(
- 'description' => 'City.',
- 'type' => 'varchar',
- 'length' => 255,
- 'default' => '',
- 'not null' => TRUE,
- ),
- 'province' => array(
- 'description' => 'State / Province code.',
- 'type' => 'varchar',
- 'length' => 16,
- 'default' => '',
- 'not null' => TRUE,
- ),
- 'postal_code' => array(
- 'description' => 'Postal / ZIP code.',
- 'type' => 'varchar',
- 'length' => 16,
- 'default' => '',
- 'not null' => TRUE,
- ),
- 'country' => array(
- 'description' => 'Two letter ISO country code.',
- 'type' => 'char',
- 'length' => 2,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'latitude' => array(
- 'description' => 'Location latitude (decimal degrees).',
- 'type' => 'numeric',
- 'precision' => 10,
- // @todo Shouldn't these all be 7?
- 'scale' => 6,
- 'not null' => TRUE,
- 'default' => 0.0,
- ),
- 'longitude' => array(
- 'description' => 'Location longitude (decimal degrees).',
- 'type' => 'numeric',
- 'precision' => 10,
- 'scale' => 6,
- 'not null' => TRUE,
- 'default' => 0.0,
- ),
- 'source' => array(
- 'description' => 'Source of the latitude and longitude data (Geocoder, user entered, invalid, etc.)',
- 'type' => 'int',
- 'size' => 'tiny',
- 'default' => 0,
- 'not null' => TRUE,
- ),
- // @@@ Historical civicrm field that isn't applicable to location, I think..
- 'is_primary' => array(
- 'description' => 'Is this the primary location of an object? (unused, civicrm legacy field?).',
- 'type' => 'int',
- 'size' => 'tiny',
- 'default' => 0,
- 'not null' => TRUE,
- ),
- ),
- 'primary key' => array('lid'),
- );
- $schema['location_instance'] = array(
- 'description' => 'N:M join table to join locations to other tables.',
- 'fields' => array(
- 'nid' => array(
- 'description' => 'Reference to {node}.nid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'vid' => array(
- 'description' => 'Reference to {node_revision}.vid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'uid' => array(
- 'description' => 'Reference to {users}.uid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'genid' => array(
- 'description' => 'Generic reference key.',
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'lid' => array(
- 'description' => 'Reference to {location}.lid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- ),
- 'indexes' => array(
- 'nid' => array('nid'),
- 'vid' => array('vid'),
- 'uid' => array('uid'),
- 'genid' => array('genid'),
- 'lid' => array('lid'),
- ),
- );
- $schema['zipcodes'] = array(
- 'description' => 'Location.module zipcode database.',
- 'fields' => array(
- 'zip' => array(
- 'description' => 'Postal / ZIP code.',
- 'type' => 'varchar',
- 'length' => 16,
- 'not null' => TRUE,
- 'default' => '0',
- ),
- 'city' => array(
- 'description' => 'City.',
- 'type' => 'varchar',
- 'length' => 30,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'state' => array(
- 'description' => 'Province / State.',
- 'type' => 'varchar',
- 'length' => 30,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'latitude' => array(
- 'description' => 'Location latitude (decimal degrees).',
- 'type' => 'numeric',
- 'precision' => 10,
- 'scale' => 6,
- 'not null' => TRUE,
- 'default' => 0.0,
- ),
- 'longitude' => array(
- 'description' => 'Location longitude (decimal degrees).',
- 'type' => 'numeric',
- 'precision' => 10,
- 'scale' => 6,
- 'not null' => TRUE,
- 'default' => 0.0,
- ),
- // @@@ Not used, an artifact of the original data dump format.
- 'timezone' => array(
- 'description' => 'Timezone (unused).',
- 'type' => 'int',
- 'size' => 'tiny',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- // @@@ Not used, an artifact of the original data dump format.
- 'dst' => array(
- 'description' => 'Daylight Savings Time (unused).',
- 'type' => 'int',
- 'size' => 'tiny',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'country' => array(
- 'description' => 'Two letter ISO country code.',
- 'type' => 'char',
- 'length' => 2,
- 'not null' => TRUE,
- 'default' => '',
- ),
- ),
- // @@@ This pk is invalid, see issue queue.
- // 'primary key' => array('country', 'zip').
- // @@@ These need reworked.
- 'indexes' => array(
- 'pc' => array('country', 'zip'),
- 'zip' => array('zip'),
- // @@@ No combined one?
- 'latitude' => array('latitude'),
- 'longitude' => array('longitude'),
- 'country' => array('country'),
- ),
- );
- // Copied from system.module.
- $schema['cache_location'] = array(
- 'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.',
- 'fields' => array(
- 'cid' => array(
- 'description' => 'Primary Key: Unique cache ID.',
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'data' => array(
- 'description' => 'A collection of data to cache.',
- 'type' => 'blob',
- 'not null' => FALSE,
- 'size' => 'big',
- ),
- 'expire' => array(
- 'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'created' => array(
- 'description' => 'A Unix timestamp indicating when the cache entry was created.',
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'headers' => array(
- 'description' => 'Any custom HTTP headers to be added to cached data.',
- 'type' => 'text',
- 'not null' => FALSE,
- ),
- 'serialized' => array(
- 'description' => 'A flag to indicate whether content is serialized (1) or not (0).',
- 'type' => 'int',
- 'size' => 'small',
- 'not null' => TRUE,
- 'default' => 0
- )
- ),
- 'indexes' => array('expire' => array('expire')),
- 'primary key' => array('cid'),
- );
- // New location country table (needed for sorting).
- $schema['location_country'] = array(
- 'description' => 'Country data managed by location.module.',
- 'fields' => array(
- 'code' => array(
- 'description' => 'Primary Key: Two letter ISO Country Code',
- 'type' => 'char',
- 'length' => 2,
- 'not null' => TRUE,
- ),
- 'name' => array(
- 'description' => 'Full Country Name ',
- 'type' => 'varchar',
- 'length' => 255,
- 'default' => '',
- 'not null' => TRUE,
- ),
- ),
- 'primary key' => array('code'),
- );
- return $schema;
- }
- /**
- * Legacy update 1.
- *
- * Convert tables to utf8.
- */
- function location_update_1() {
- }
- /**
- * Legacy update 2.
- *
- * Fix a bug with the "us" entry in the "location_configured_countries" var.
- */
- function location_update_2() {
- $configured_countries = variable_get('location_configured_countries', array());
- if ($configured_countries['us']) {
- $configured_countries['us'] = 'us';
- variable_set('location_configured_countries', $configured_countries);
- }
- return array();
- }
- /**
- * Legacy update 3.
- *
- * Allow for postgresql support by renaming the oid column, which is a reserved
- * name on postgresql.
- */
- function location_update_3() {
- db_change_field(
- 'location',
- 'oid',
- 'eid',
- array(
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- )
- );
- if (module_exists('views')) {
- views_invalidate_cache();
- }
- return t(
- "The schema for location module has been updated. The update is such that you may want to re-resave any views you have that may include locations."
- );
- }
- /***************************************************************
- * PostgreSQL must be supported in all updates after this comment
- ***************************************************************/
- /**
- * Legacy update 4.
- *
- * Add "lid" as the new location key.
- */
- function location_update_4() {
- db_add_field(
- 'location',
- 'lid',
- array(
- 'type' => 'serial',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'description' => 'Primary Key: Unique location ID.',
- )
- );
- $result = db_query("SELECT eid, type FROM {location}");
- $next_id = 0;
- foreach ($result as $row) {
- $next_id++;
- db_update('location')
- ->fields(
- array(
- 'lid' => $next_id,
- )
- )
- ->condition('eid', $row->eid)
- ->condition('type', $row->type)
- ->execute();
- }
- db_drop_primary_key('location');
- db_add_primary_key('location', array('lid'));
- db_insert('sequences')
- ->fields(
- array(
- 'name' => '{location}_lid',
- 'id' => $next_id,
- )
- )
- ->execute();
- db_add_field(
- 'location',
- 'is_primary',
- array(
- 'description' => 'Is this the primary location of an object? (unused, civicrm legacy field?).',
- 'type' => 'int',
- 'size' => 'tiny',
- 'default' => 0,
- 'not null' => TRUE,
- )
- );
- db_update('location')
- ->fields(
- array(
- 'is_primary' => 1,
- )
- )
- ->condition('type', 'user')
- ->execute();
- foreach (node_type_get_types() as $type) {
- $new_setting = variable_get('location_' . $type->type, 0) ? 1 : 0;
- variable_del('location_' . $type->type);
- variable_set('location_maxnum_' . $type->type, $new_setting);
- variable_set('location_defaultnum_' . $type->type, $new_setting);
- }
- }
- /**
- * Legacy update 5.
- *
- * Postgresql support that was missing from previous update.
- *
- * This update is redundant now that we have db api functions
- * that are database independant.
- */
- function location_update_5() {
- }
- /**
- * Legacy update 6.
- *
- * Use correct country code for Sweeden.
- */
- function location_update_6() {
- db_update('location')
- ->fields(
- array(
- 'country' => 'se',
- )
- )
- ->condition('country', 'sw')
- ->execute();
- }
- /**
- * Update 7 (Location 2.x).
- *
- * Generalize google geocoding so you don't have to enter the api key over and over.
- */
- function location_update_7() {
- $services = array('google');
- $general_geocoders_in_use = array();
- $result = db_query("SELECT * FROM {variable} WHERE name REGEXP '^location_geocode_[a-z][a-z]$'");
- foreach ($result as $row) {
- $value_decoded = unserialize($row->value);
- if (!in_array($value_decoded, $services)) {
- db_update('variable')
- ->fields(
- array(
- 'value' => serialize($value_decoded . '|' . substr($row->name, 17)),
- )
- )
- ->condition('name', $row->name)
- ->execute();
- }
- else {
- $general_geocoders_in_use[$value_decoded] = $value_decoded;
- }
- }
- $key = db_query(
- "SELECT value FROM {variable} WHERE name REGEXP '^location_geocode_[a-z][a-z]_google_apikey$'"
- )->fetchField();
- db_delete('variable')
- ->where("name REGEXP '^location_geocode_[a-z][a-z]_google_apikey$'")
- ->execute();
- db_insert('variable')
- ->fields(
- array(
- 'name' => 'location_geocode_google_apikey',
- 'value' => $key,
- )
- )
- ->execute();
- db_delete('cache')
- ->condition('cid', 'variables')
- ->execute();
- variable_set('location_general_geocoders_in_use', $general_geocoders_in_use);
- }
- /**
- * Location 3.x update 1.
- *
- * Add location specific cache table.
- */
- function location_update_5300() {
- $schema['cache_location'] = array(
- 'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.',
- 'fields' => array(
- 'cid' => array(
- 'description' => 'Primary Key: Unique cache ID.',
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'data' => array(
- 'description' => 'A collection of data to cache.',
- 'type' => 'blob',
- 'not null' => FALSE,
- 'size' => 'big',
- ),
- 'expire' => array(
- 'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'created' => array(
- 'description' => 'A Unix timestamp indicating when the cache entry was created.',
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'headers' => array(
- 'description' => 'Any custom HTTP headers to be added to cached data.',
- 'type' => 'text',
- 'not null' => FALSE,
- ),
- ),
- 'indexes' => array('expire' => array('expire')),
- 'primary key' => array('cid'),
- );
- db_create_table('cache_location', $schema['cache_location']);
- }
- /**
- * Location 3.x update 2.
- *
- * Normalize the location table.
- * This allows:
- * - Making the loading and saving code cleaner.
- * - Fixing a longstanding bug with revisions.
- * - Having the same location on multiple nodes/users/both.
- * - Garbage collecting unused locations periodically.
- * - Having full support for deletions.
- * - Full revisions support.
- * Note that the location_instance table does NOT have a primary key.
- * This is on purpose. It's a N:M join table.
- */
- function location_update_5301() {
- $schema['location_instance'] = array(
- 'description' => 'N:M join table to join locations to other tables.',
- 'fields' => array(
- 'nid' => array(
- 'description' => 'Reference to {node}.nid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'vid' => array(
- 'description' => 'Reference to {node_revision}.vid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'uid' => array(
- 'description' => 'Reference to {users}.uid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'genid' => array(
- 'description' => 'Generic reference key.',
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'lid' => array(
- 'description' => 'Reference to {location}.lid.',
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- ),
- ),
- 'indexes' => array(
- 'nid' => array('nid'),
- 'vid' => array('vid'),
- 'uid' => array('uid'),
- 'genid' => array('genid'),
- 'lid' => array('lid'),
- ),
- );
- db_create_table('location_instance', $schema['location_instance']);
- // Synthesise node location data based on what we have.
- // Storage of locations was previously stored against node revision, BUT the
- // data was not properly duplicated by revision (i.e. only the latest revision
- // carried the data.)
- // Joining like this allows us to backfill all the old revisions with the current
- // data, which is not nice but better than having no data at all when viewing
- // old revisions.
- $query = db_select('node_revision', 'nr');
- $query->join('node_revision', 'nr2', 'nr.nid = nr2.nid');
- $query->join('location', 'l', "nr2.vid = l.eid AND l.type = 'node'");
- $query->addField('nr', 'nid');
- $query->addField('nr', 'vid');
- $query->addField('l', 'lid');
- db_insert('location_instance')
- ->fields(array('nid', 'vid', 'lid'))
- ->from($query)
- ->execute();
- // Users is much simpler.
- $query = db_select('location', 'l');
- $query->addField('l', 'eid');
- $query->addField('l', 'lid');
- $query->condition('type', 'user');
- db_insert('location_instance')
- ->fields(array('uid', 'lid'))
- ->from($query)
- ->execute();
- // Aug 18 2008:
- // Save everything else in genid.
- $query = db_select('location', 'l');
- $query->addExpression("CONCAT(l.type, ':', l.eid)");
- $query->addField('l', 'lid');
- $query->condition('type', 'user', '<>');
- $query->condition('type', 'node', '<>');
- db_insert('location_instance')
- ->fields(array('genid', 'lid'))
- ->from($query)
- ->execute();
- // Remove now unused columns.
- db_drop_field('location', 'type');
- db_drop_field('location', 'eid');
- // General cleanup.
- // Removed in favor of permission check.
- variable_del('location_user');
- // Variable consolidation (as part of the element based system)
- // We're doing this "raw" so we can be sure we got everything moved over,
- // INCLUDING content types that were deleted in the past.
- // This will let us do better cleanup sometime in the future.
- $data = array();
- $todelete = array();
- foreach (array(
- 'name',
- 'street',
- 'additional',
- 'city',
- 'province',
- 'postal_code',
- 'country',
- 'phone',
- 'fax',
- ) as $field) {
- $result = db_query("SELECT name, value FROM {variable} WHERE name > :name", array(':name' => "location_$field%"));
- foreach ($result as $row) {
- $data[substr($row->name, strlen($field) + 10)][$field] = (string) (int) unserialize($row->value);
- $todelete[] = $row->name;
- }
- }
- foreach ($data as $type => $value) {
- // We aren't going to trust that hook_locationapi is operational.
- // So, stick with some conservative defaults.
- $value = array_merge(
- array(
- 'name' => '1',
- 'street' => '1',
- // Additional is left out of this list intentionally.
- 'city' => '0',
- 'province' => '0',
- 'postal_code' => '0',
- 'country' => '1',
- ),
- $value
- );
- if (!isset($value['additional'])) {
- // Initialize additional to match street.
- $value['additional'] = $value['street'];
- }
- variable_set('location_fields_' . $type, $value);
- }
- foreach ($todelete as $key) {
- variable_del($key);
- }
- // This update was retrofitted on Aug 18, 2008. Set a flag for use by
- // the next update in order to handle the case where someone has already
- // updated to EXACTLY schema revision 5301 before the retrofit took effect.
- // People who migrated past this point before that date may have the following
- // inconsistencies:
- // A) location_{field}_{type} variables were not collected for content types
- // that had been deleted in the past.
- // B) Any locations with the 'type' field set to something other than 'node'
- // or 'user' did not get entries in {location_instance}.
- variable_set('location_update_5301_retrofit', TRUE);
- }
- /**
- * Location 3.x update 3.
- *
- * Add genid to {location_instance}.
- */
- function location_update_5302() {
- // OK, here's the deal. I retrofitted 5301 on Aug 18 2008 to integrate the genid.
- // This was needed to fix the pre location 3.x todo item regarding keeping non
- // user, non node data intact. People doing an update after Aug 18 will already
- // have the genid column in place, so it can be safely skipped.
- if (!variable_get('location_update_5301_retrofit', FALSE)) {
- db_add_field(
- 'location_instance',
- 'genid',
- array(
- 'description' => 'Generic reference key.',
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- db_add_index('location_instance', 'genid', array('genid'));
- }
- }
- /**
- * Location 3.x update 4.
- *
- * Shuffle more variables around.
- */
- function location_update_5303() {
- $types = array();
- $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_display_teaser_%'");
- foreach ($result as $row) {
- $type = substr($row->name, 24);
- $types[$type]['teaser'] = variable_get('location_display_teaser_' . $type, TRUE);
- $types[$type]['full'] = variable_get('location_display_full_' . $type, TRUE);
- $types[$type]['weight'] = variable_get('location_display_weight_' . $type, 0);
- // @@@ Combine location_suppress_country and country require settings to set this up?
- $types[$type]['hide'] = array();
- }
- foreach ($types as $type => $value) {
- variable_set("location_display_$type", $value);
- variable_del("location_display_teaser_$type");
- variable_del("location_display_full_$type");
- variable_del("location_display_weight_$type");
- }
- }
- // @@@ Does 5303 need rerun in some circumstances?
- /**
- * Drupal 6 location 3.x update.
- */
- function location_update_6301() {
- $message = '';
- // Update cache table.
- db_drop_table('cache_location');
- $schema['cache_location'] = array(
- 'description' => 'Generic cache table for caching things not separated out into their own tables. Contributed modules may also use this to store cached items.',
- 'fields' => array(
- 'cid' => array(
- 'description' => 'Primary Key: Unique cache ID.',
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- ),
- 'data' => array(
- 'description' => 'A collection of data to cache.',
- 'type' => 'blob',
- 'not null' => FALSE,
- 'size' => 'big',
- ),
- 'expire' => array(
- 'description' => 'A Unix timestamp indicating when the cache entry should expire, or 0 for never.',
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'created' => array(
- 'description' => 'A Unix timestamp indicating when the cache entry was created.',
- 'type' => 'int',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- 'headers' => array(
- 'description' => 'Any custom HTTP headers to be added to cached data.',
- 'type' => 'text',
- 'not null' => FALSE
- ),
- 'serialized' => array(
- 'description' => 'A flag to indicate whether content is serialized (1) or not (0).',
- 'type' => 'int',
- 'size' => 'small',
- 'not null' => TRUE,
- 'default' => 0,
- )
- ),
- 'indexes' => array('expire' => array('expire')),
- 'primary key' => array('cid'),
- );
- db_create_table('cache_location', $schema['cache_location']);
- // LID 0 causes all sorts of issues, and will break our update routine
- // unless we handle it beforehand.
- // Since we're so nice, we're gonna renumber it for the user.
- $has_rows = (bool) db_query_range('SELECT 1 FROM {location} WHERE lid = 0', 0, 1)->fetchField();
- if ($has_rows) {
- $lid = 1 + db_query('SELECT MAX(lid) FROM {location}')->fetchField();
- $message = t(
- 'Note: A location with lid 0 was found in your database. It has been moved to lid %lid. You may wish to verify it manually, as lid 0 is usually a corrupt entry.',
- array('%lid' => $lid)
- );
- db_update('location')
- ->fields(
- array(
- 'lid' => $lid,
- )
- )
- ->condition('lid', 0)
- ->execute();
- db_update('location_instance')
- ->fields(
- array(
- 'lid' => $lid,
- )
- )
- ->condition('lid', 0)
- ->execute();
- }
- // Field changes.
- // {location}.lid -- Becomes a serial.
- db_drop_primary_key('location');
- db_change_field(
- 'location',
- 'lid',
- 'lid',
- array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
- array('primary key' => array('lid'))
- );
- // The rest of the changes to this table were moved to update 6302 due to a bug.
- // {location_instance}
- // Fix oddly named indexes -- Was using the postgresql method for both.
- db_drop_index('location_instance', '{location_instance}_nid_idx');
- db_drop_index('location_instance', '{location_instance}_vid_idx');
- db_drop_index('location_instance', '{location_instance}_uid_idx');
- db_drop_index('location_instance', '{location_instance}_genid_idx');
- db_drop_index('location_instance', '{location_instance}_lid_idx');
- db_drop_index('location_instance', 'nid');
- db_drop_index('location_instance', 'vid');
- db_drop_index('location_instance', 'uid');
- db_drop_index('location_instance', 'genid');
- db_drop_index('location_instance', 'lid');
- // Fill in nulls.
- db_update('location_instance')
- ->fields(
- array(
- 'nid' => 0,
- )
- )
- ->isNull('nid')
- ->execute();
- db_update('location_instance')
- ->fields(
- array(
- 'vid' => 0,
- )
- )
- ->isNull('vid')
- ->execute();
- db_update('location_instance')
- ->fields(
- array(
- 'uid' => 0,
- )
- )
- ->isNull('uid')
- ->execute();
- db_update('location_instance')
- ->fields(
- array(
- 'genid' => 0,
- )
- )
- ->isNull('genid')
- ->execute();
- // {location_instance}.nid
- db_change_field(
- 'location_instance',
- 'nid',
- 'nid',
- array(
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- )
- );
- // {location_instance}.vid
- db_change_field(
- 'location_instance',
- 'vid',
- 'vid',
- array(
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- )
- );
- // {location_instance}.uid
- db_change_field(
- 'location_instance',
- 'uid',
- 'uid',
- array(
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- )
- );
- // {location_instance}.genid
- db_change_field(
- 'location_instance',
- 'genid',
- 'genid',
- array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location_instance}.lid
- db_change_field(
- 'location_instance',
- 'lid',
- 'lid',
- array(
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'not null' => TRUE,
- 'default' => 0,
- )
- );
- // Readd indexes.
- db_add_index('location_instance', 'nid', array('nid'));
- db_add_index('location_instance', 'vid', array('vid'));
- db_add_index('location_instance', 'uid', array('uid'));
- db_add_index('location_instance', 'genid', array('genid'));
- db_add_index('location_instance', 'lid', array('lid'));
- // {zipcodes}
- // Drop primary key.
- db_drop_primary_key('zipcodes');
- if ($message) {
- $message .= '<br /><br />';
- }
- return $message . t(
- 'Note: Location.module update 6301 will generate several warnings/failures regarding indexes and primary keys if you are upgrading from one of the 6.x test releases. These warnings can be safely disregarded in this case.'
- );
- }
- /**
- * Drupal 6 location 3.x update, part 2.
- */
- function location_update_6302() {
- // OK, here's the update to fix the previous update which had a few problems
- // when upgrading from pre-rc 6.x versions.
- // The "mismatch between mysql and postgresql" was actually applicable to
- // 6.x-3.0 pre-rc1 as well, but I didn't notice because I accidentally added
- // the not null when reformatting the schema.
- db_update('location')
- ->fields(
- array(
- 'is_primary' => 0,
- )
- )
- ->isNull('is_primary')
- ->execute();
- db_change_field(
- 'location',
- 'is_primary',
- 'is_primary',
- array(
- 'type' => 'int',
- 'size' => 'tiny',
- 'default' => 0,
- 'not null' => TRUE,
- )
- );
- // Fix zipcode mismatches caused by the same problem.
- // There shouldn't be any rows like this, but it doesn't hurt to be sure.
- db_update('zipcodes')
- ->fields(
- array(
- 'zip' => 0,
- )
- )
- ->isNull('zip')
- ->execute();
- // Set not null.
- db_change_field(
- 'zipcodes',
- 'zip',
- 'zip',
- array(
- 'type' => 'varchar',
- 'length' => 16,
- 'not null' => TRUE,
- 'default' => '0',
- )
- );
- // Prepare latitude and longitude for the same.
- db_update('zipcodes')
- ->fields(
- array(
- 'latitude' => 0.0,
- )
- )
- ->isNull('latitude')
- ->execute();
- db_update('zipcodes')
- ->fields(
- array(
- 'longitude' => 0.0,
- )
- )
- ->isNull('longitude')
- ->execute();
- // Set not null.
- db_change_field(
- 'zipcodes',
- 'latitude',
- 'latitude',
- array(
- 'type' => 'numeric',
- 'not null' => TRUE,
- 'default' => 0,
- 'precision' => 10,
- 'scale' => 6,
- )
- );
- db_change_field(
- 'zipcodes',
- 'longitude',
- 'longitude',
- array(
- 'type' => 'numeric',
- 'not null' => TRUE,
- 'default' => 0,
- 'precision' => 10,
- 'scale' => 6,
- )
- );
- // Prepare country.
- update_sql("UPDATE {zipcodes} SET country = '' WHERE country IS NULL");
- db_update('zipcodes')
- ->fields(
- array(
- 'country' => '',
- )
- )
- ->isNull('country')
- ->execute();
- // Set not null.
- db_change_field(
- 'zipcodes',
- 'country',
- 'country',
- array(
- 'type' => 'char',
- 'length' => 2,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // Fix up possible {location} problems from previous update that could be caused if you had NULLed fields.
- // Set defaults.
- $fields = array(
- 'name' => '',
- 'street' => '',
- 'additional' => '',
- 'city' => '',
- 'province' => '',
- 'postal_code' => '',
- 'latitude' => 0.0,
- 'longitude' => 0.0,
- 'source' => 0,
- );
- foreach ($fields as $field => $value) {
- db_update('location')
- ->fields(
- array(
- $field => $value,
- )
- )
- ->isNull($field)
- ->execute();
- }
- // {location}.name -- NOT NULL.
- db_change_field(
- 'location',
- 'name',
- 'name',
- array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.street -- NOT NULL.
- db_change_field(
- 'location',
- 'street',
- 'street',
- array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.additional -- NOT NULL.
- db_change_field(
- 'location',
- 'additional',
- 'additional',
- array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.city -- NOT NULL.
- db_change_field(
- 'location',
- 'city',
- 'city',
- array(
- 'type' => 'varchar',
- 'length' => 255,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.province -- NOT NULL.
- db_change_field(
- 'location',
- 'province',
- 'province',
- array(
- 'type' => 'varchar',
- 'length' => 16,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.postal_code -- NOT NULL.
- db_change_field(
- 'location',
- 'postal_code',
- 'postal_code',
- array(
- 'type' => 'varchar',
- 'length' => 16,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.country -- NOT NULL.
- db_change_field(
- 'location',
- 'country',
- 'country',
- array(
- 'type' => 'char',
- 'length' => 2,
- 'not null' => TRUE,
- 'default' => '',
- )
- );
- // {location}.latitude.
- db_change_field(
- 'location',
- 'latitude',
- 'latitude',
- array(
- 'type' => 'numeric',
- 'precision' => 10,
- 'scale' => 6,
- 'not null' => TRUE,
- 'default' => 0.0,
- )
- );
- // {location}.longitude.
- db_change_field(
- 'location',
- 'longitude',
- 'longitude',
- array(
- 'type' => 'numeric',
- 'precision' => 10,
- 'scale' => 6,
- 'not null' => TRUE,
- 'default' => 0.0,
- )
- );
- // {location}.source.
- db_change_field(
- 'location',
- 'source',
- 'source',
- array(
- 'type' => 'int',
- 'size' => 'tiny',
- 'not null' => TRUE,
- 'default' => 0,
- )
- );
- }
- /**
- * Drupal 6 location 3.x update, part 3.
- */
- function location_update_6303() {
- if (!variable_get('location_update_5304_done', FALSE)) {
- // Do the same updates as 5304.
- // Delete unused variables.
- variable_del('location_configured_countries');
- variable_del('location_garbagecollect');
- // Update province code for Italy/Forlì-Cesena.
- db_update('location')
- ->fields(
- array(
- 'province' => 'FC',
- )
- )
- ->condition('country', 'it')
- ->condition('province', 'FO')
- ->execute();
- // Update province code for Italy/Pesaro e Urbino.
- db_update('location')
- ->fields(
- array(
- 'province' => 'PU',
- )
- )
- ->condition('country', 'it')
- ->condition('province', 'PS')
- ->execute();
- // Do one final garbage collection by hand.
- $query = db_select('location_instance', 'li')
- ->addField('li', 'lid');
- db_delete('location')
- ->condition('lid', $query, 'NOT IN')
- ->execute();
- // Garbage collect {location_phone} by hand.
- if (db_table_exists('location_phone')) {
- $query = db_select('location', 'l')
- ->addField('l', 'lid');
- db_delete('location_phone')
- ->condition('lid', $query, 'NOT IN')
- ->execute();
- }
- // Garbage collect {location_fax} by hand.
- if (db_table_exists('location_fax')) {
- $query = db_select('location', 'l')
- ->addField('l', 'lid');
- db_delete('location_fax')
- ->condition('lid', $query, 'NOT IN')
- ->execute();
- }
- variable_del('location_update_5304_done');
- }
- }
- /**
- * Upgrade all of the settings variables to the new unified system.
- */
- function location_update_6304() {
- // Skip this update if it was already done on the 5.x side.
- if (variable_get('location_update_5305_done', FALSE)) {
- variable_del('location_update_5305_done');
- return array();
- }
- $variables = array();
- $todelete = array();
- $base = array(
- 'multiple' => array(
- 'min' => 0,
- 'max' => 0,
- 'add' => 3,
- ),
- 'form' => array(
- 'weight' => 0,
- 'collapsible' => TRUE,
- 'collapsed' => TRUE,
- 'fields' => array(),
- ),
- 'display' => array(
- 'weight' => 0,
- 'hide' => array(),
- ),
- );
- // Pull in user settings.
- $variables['location_settings_user'] = $base;
- $tmp = & $variables['location_settings_user'];
- // Users previously could not have multiple locations, initialize with those
- // settings.
- $tmp['multiple'] = array(
- 'min' => 0,
- 'max' => 1,
- 'add' => 3,
- );
- $tmp['form']['weight'] = variable_get('location_user_weight', 9);
- $tmp['form']['collapsible'] = variable_get('location_user_collapsible', TRUE);
- $tmp['form']['collapased'] = variable_get('location_user_collapsed', TRUE);
- $tmp['form']['fields'] = variable_get('location_user_fields', array());
- // Pull in node settings.
- $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_maxnum_%'");
- foreach ($result as $row) {
- $type = substr($row->name, 16);
- $todelete[] = $type;
- $variables["location_settings_node_$type"] = $base;
- $tmp = & $variables["location_settings_node_$type"];
- // Old behavior was to have the first one be required.
- $tmp['multiple']['min'] = 1;
- $tmp['multiple']['max'] = variable_get("location_maxnum_$type", 0);
- $tmp['multiple']['add'] = variable_get("location_defaultnum_$type", 3);
- $tmp['form']['weight'] = variable_get("location_weight_$type", 9);
- $tmp['form']['collapsible'] = variable_get("location_collapsible_$type", TRUE);
- $tmp['form']['collapsed'] = variable_get("location_collapsed_$type", TRUE);
- $tmp['form']['fields'] = variable_get("location_fields_$type", array());
- $tmp['rss']['mode'] = variable_get("location_rss_$type", 'simple');
- $tmp['display'] = variable_get(
- "location_display_$type",
- array(
- 'teaser' => TRUE,
- 'full' => TRUE,
- 'weight' => 0,
- 'hide' => array(),
- )
- );
- }
- foreach ($variables as $name => $value) {
- variable_set($name, $value);
- }
- // Delete old node variables.
- foreach ($todelete as $key) {
- variable_del("location_weight_$key");
- variable_del("location_collapsible_$key");
- variable_del("location_collapsed_$key");
- variable_del("location_fields_$key");
- variable_del("location_rss_$key");
- variable_del("location_display_$key");
- }
- // Delete old user variables.
- variable_del('location_user_weight');
- variable_del('location_user_collapsible');
- variable_del('location_user_collapsed');
- variable_del('location_user_fields');
- }
- /**
- * Disabled due to some typos, moved to 6306.
- */
- function location_update_6305() {
- return array();
- }
- /**
- * Add per-location-field weights and defaults.
- */
- function location_update_6306() {
- // Skip this update if it was already done on the 5.x side.
- if (variable_get('location_update_5306_done', FALSE)) {
- variable_del('location_update_5306_done');
- return array();
- }
- $result = db_query("SELECT name FROM {variable} WHERE name LIKE 'location_settings_%'");
- foreach ($result as $row) {
- $var = variable_get($row->name, array());
- $collect = $var['form']['fields'];
- $var['form']['fields'] = array();
- foreach ($collect as $k => $v) {
- $var['form']['fields'][$k]['collect'] = $v;
- }
- // Country 3 has changed to 4 to make requirements code easier.
- if (isset($var['form']['fields']['country']['collect']) && $var['form']['fields']['country']['collect'] == 3) {
- $var['form']['fields']['country']['collect'] = 4;
- }
- // Weight and default values don't need to get set for now.
- variable_set($row->name, $var);
- }
- }
- /**
- * Tell users about the new location_user module and enable it.
- */
- function location_update_6307() {
- $message = t(
- "Note: Location module has now split off user location support into a separate module, called <em>User Locations</em>. It has been enabled for you. If you don't want user locations, visit the <a href='!url'>modules page</a> and disable it.",
- array('!url' => url('admin/modules'))
- );
- if (module_exists('location')) {
- module_enable(array('location_user'));
- }
- else {
- $message .= '<br />' . t(
- "Note: Refusing to enable location_user.module, as location.module is not currently enabled."
- );
- }
- return $message;
- }
- /**
- * Tell users about the new location_node module and enable it.
- */
- function location_update_6308() {
- $message = t(
- "Note: Location module has now split off node location support into a separate module, called <em>Node Locations</em>. It has been enabled for you. If you don't want node locations, visit the <a href='!url'>modules page</a> and disable it.",
- array('!url' => url('admin/modules'))
- );
- if (module_exists('location')) {
- module_enable(array('location_node'));
- }
- else {
- $message .= '<br />' . t(
- "Note: Refusing to enable location_node.module, as location.module is not currently enabled."
- );
- }
- return $message;
- }
- /**
- * There has been a change in the options for the views distance/proximity filter.
- *
- * The old options need to be migrated into the new.
- */
- function location_update_6309() {
- $updated_views = array();
- if (module_exists('views')) {
- $views = views_get_all_views();
- foreach ($views as $view) {
- $modified = FALSE;
- // For each view check all filters of all displays for the distance field filter.
- foreach ($view->display as $did => $display) {
- if (isset($display->display_options['filters']) && !empty($display->display_options['filters'])) {
- foreach ($display->display_options['filters'] as $fid => $filter) {
- if ($filter['table'] == 'location' && $filter['field'] == 'distance') {
- // Set the origin (new option) from the type (old option).
- $origin = '';
- switch ($filter['type']) {
- case 'latlon':
- $origin = 'static';
- break;
- case 'postal':
- case 'postal_default':
- case 'latlon_gmap':
- $origin = $filter['type'];
- break;
- }
- if ($origin) {
- $view->display[$did]->display_options['filters'][$fid]['origin'] = $origin;
- unset($view->display[$did]->display_options['filters'][$fid]['type']);
- $modified = TRUE;
- }
- }
- }
- }
- }
- // Save the view if we changed any options on any displays.
- // Views caches are cleared during save so we don't have to do it.
- if ($modified) {
- $updated_views[] = $view->name;
- $view->save();
- }
- }
- }
- if (!empty($updated_views)) {
- return t(
- "Note: The 'Form type' option for the 'Location: Distance / Proximity' filter in views has been changed and is now the 'Origin' option. The following views were using that setting and have been updated to use the new setting: %views.",
- array('%views' => implode(', ', $updated_views))
- );
- }
- }
- /**
- * Updates the ISO code for United Kingdom from 'uk' to 'gb'.
- *
- * In the location table, the zipcodes table, and for any variable names
- * and variable values where it is used.
- */
- function location_update_7301() {
- db_update('location')
- ->fields(
- array(
- 'country' => 'gb',
- )
- )
- ->condition('country', 'uk')
- ->execute();
- db_update('zipcodes')
- ->fields(
- array(
- 'country' => 'gb',
- )
- )
- ->condition('country', 'uk')
- ->execute();
- $uk = variable_get('location_geocode_uk', '');
- $gb = variable_get('location_geocode_gb', '');
- if ($uk) {
- variable_set('location_geocode_gb', $uk);
- }
- $uk = variable_get('location_map_link_uk', '');
- $gb = variable_get('location_map_link_gb', '');
- if ($uk) {
- variable_set('location_map_link_gb', $uk);
- }
- cache_clear_all('*', 'cache_location', TRUE);
- return;
- }
- /**
- * Adds the Country code to name table "location_country".
- *
- * It is created from the included array country array.
- */
- function location_update_7302() {
- // Create the new table.
- drupal_load('module', 'location');
- $schema = location_schema();
- if (!db_table_exists('location_country')) {
- db_create_table('location_country', $schema['location_country']);
- }
- else {
- db_truncate('location_country')->execute();
- }
- $countries = location_get_iso3166_list();
- foreach ($countries as $code => $name) {
- db_insert('location_country')
- ->fields(
- array(
- 'code' => $code,
- 'name' => $name,
- )
- )
- ->execute();
- }
- }
|