--- /cygdrive/c/www/webroot/drupal_master/modules/browscap/browscap.module 2007-01-08 19:01:45.687500000 -0500 +++ browscap.module 2007-01-09 00:04:09.296875000 -0500 @@ -80,7 +80,7 @@ */ function _browscap_import() { // Politely check the version for updates before fetching the file - $versionpage = drupal_http_request('http://www.garykeith.com/browsers/version.asp'); + $versionpage = drupal_http_request('http://browsers.garykeith.com/version.asp'); if ($versionpage->error) { watchdog('browscap', "Couldn't check version: ".$versionpage->error); return; @@ -92,7 +92,6 @@ watchdog('browscap', 'No new version of browscap to import'); return; } - // Fetch the new version, and dump it in the temp directory $server = $_SERVER['SERVER_NAME']; $path = variable_get('file_directory_temp', '/tmp'); @@ -101,7 +100,7 @@ // If we can, download the zipped version and extract the file if (is_callable('zip_open')) { $browscapzipfile = "$path/csv_browscap_$server.zip"; - $browscapzip = drupal_http_request('http://www.garykeith.com/browsers/stream.asp?CSV_BrowsCapZIP'); + $browscapzip = drupal_http_request('http://browsers.garykeith.com/stream.asp?CSV_BrowsCapZIP'); if ($browscapzip->error or !trim($browscapzip->data)) { watchdog('browscap', "Couldn't retrieve updated browscap: ".$browscapzip->error); return; @@ -126,7 +125,7 @@ unlink($browscapzipfile); // Can't handle zip, get the unzipped version } else { - $browscap = drupal_http_request('http://www.garykeith.com/browsers/stream.asp?BrowsCapCSV'); + $browscap = drupal_http_request('http://browsers.garykeith.com/stream.asp?BrowsCapCSV'); if ($browscap->error or !trim($browscap->data)) { watchdog('browscap', "Couldn't retrieve updated browscap: ".$browscap->error); return; @@ -143,77 +142,110 @@ // Ignore the first two rows (column headers & version info) fgetcsv($browscapfp, 1000); fgetcsv($browscapfp, 1000); while (($browserinfo = fgetcsv($browscapfp, 1000)) != FALSE) { - // Strip brackets - $useragent = substr($browserinfo[0], 1, -1); - // Replace wildcards with SQL equivalents - $useragent = strtr($useragent, '*?', '%_'); - $parent = $browserinfo[1]; - $browser = $browserinfo[2]; - $version = $browserinfo[3]; - $majorversion = $browserinfo[4]; - $minorversion = $browserinfo[5]; - $platform = $browserinfo[6]; - $authenticodeupdate = $browserinfo[7]; - if ($browserinfo[8] == 'default') { - $cssversion = -1; - } else { - $cssversion = $browserinfo[8]; - } - $frames = _browscap_boolean($browserinfo[9]); - $iframes = _browscap_boolean($browserinfo[10]); - $htmltables = _browscap_boolean($browserinfo[11]); - $cookies = _browscap_boolean($browserinfo[12]); - $backgroundsounds = _browscap_boolean($browserinfo[13]); - $vbscript = _browscap_boolean($browserinfo[14]); - $javascript = _browscap_boolean($browserinfo[15]); - $javaapplets = _browscap_boolean($browserinfo[16]); - $activexcontrols = _browscap_boolean($browserinfo[17]); - $cdf = _browscap_boolean($browserinfo[18]); - $aol = _browscap_boolean($browserinfo[19]); - $beta = _browscap_boolean($browserinfo[20]); - $win16 = _browscap_boolean($browserinfo[21]); - $crawler = _browscap_boolean($browserinfo[22]); - $stripper = _browscap_boolean($browserinfo[23]); - $wap = _browscap_boolean($browserinfo[24]); - $netclr = _browscap_boolean($browserinfo[25]); - - db_query('REPLACE {browscap} (useragent,parent,browser,version,'. - 'majorversion,minorversion,platform,authenticodeupdate,'. - 'cssversion,frames,iframes,htmltables,cookies,backgroundsounds,'. - 'vbscript,javascript,javaapplets,activexcontrols,cdf,aol,'. - 'beta,win16,crawler,stripper,wap,netclr) '. - "VALUES('%s','%s','%s','%s','%s','%s','%s','%s',%d,%d,%d,%d,%d,". - '%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)', - $useragent, $parent, $browser, $version, - $majorversion, $minorversion, $platform, $authenticodeupdate, - $cssversion, $frames, $iframes, $htmltables, $cookies, $backgroundsounds, - $vbscript, $javascript, $javaapplets, $activexcontrols, $cdf, $aol, - $beta, $win16, $crawler, $stripper, $wap, $netclr); + + $parent = $browserinfo[0]; + + // Strip brackets + $useragent = substr($browserinfo[1], 1, -1); + // Replace wildcards with SQL equivalents + $useragent = strtr($useragent, '*?', '%_'); + + $browser = $browserinfo[2]; + $version = $browserinfo[3]; + $majorver = $browserinfo[4]; + $minorver = $browserinfo[5]; + $platform = $browserinfo[6]; + $alpha = _browscap_boolean($browserinfo[7]); + $beta = _browscap_boolean($browserinfo[8]); + $win16 = _browscap_boolean($browserinfo[9]); + $win32 = _browscap_boolean($browserinfo[10]); + $win64 = _browscap_boolean($browserinfo[11]); + $frames = _browscap_boolean($browserinfo[12]); + $iframes = _browscap_boolean($browserinfo[13]); + $tables = _browscap_boolean($browserinfo[14]); + $cookies = _browscap_boolean($browserinfo[15]); + $backgroundsounds = _browscap_boolean($browserinfo[16]); + $authenticodeupdate = $browserinfo[17]; + $cdf = $browserinfo[18]; + $vbscript = _browscap_boolean($browserinfo[19]); + $javaapplets = _browscap_boolean($browserinfo[20]); + $javascript = _browscap_boolean($browserinfo[21]); + $activexcontrols = _browscap_boolean($browserinfo[22]); + $stripper = _browscap_boolean($browserinfo[23]); + $isbanned = _browscap_boolean($browserinfo[24]); + $wap = _browscap_boolean($browserinfo[25]); + $ismobiledevice = _browscap_boolean($browserinfo[26]); + $issyndicationreader = _browscap_boolean($browserinfo[27]); + $crawler = _browscap_boolean($browserinfo[28]); + + if ($browserinfo[29] == 'default') { + $css = -1; + } else { + $css = $browserinfo[29]; + } + + if ($browserinfo[30] == 'default') { + $cssversion = -1; + } else { + $cssversion = $browserinfo[30]; + } + + $supportscss = _browscap_boolean($browserinfo[31]); + $aolversion = $browserinfo[32]; + $aol = _browscap_boolean($browserinfo[33]); + $netclr = _browscap_boolean($browserinfo[34]); + $clrversion = $browserinfo[35]; + $internalid = $browserinfo[36]; + + $result = db_query('REPLACE {browscap} ( parent, useragent,browser,version,majorver,minorver,platform,alpha,beta,win16,win32,win64,frames,iframes,tables,cookies,' . + 'backgroundsounds,authenticodeupdate,cdf,vbscript,javaapplets,javascript,activexcontrols,stripper,isbanned,wap,ismobiledevice,issyndicationreader,' . + 'crawler,css,cssversion,supportscss,aolversion,aol,netclr,clrversion,internalid) '. + "VALUES('%s','%s','%s','%s','%s','%s','%s','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%s','%s','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d'," . + "'%d','%d','%d','%s','%d','%d','%s','%d')", $parent,$useragent, $browser,$version,$majorver,$minorver,$platform,$alpha,$beta,$win16,$win32,$win64,$frames,$iframes,$tables, + $cookies,$backgroundsounds,$authenticodeupdate,$cdf,$vbscript,$javaapplets,$javascript,$activexcontrols,$stripper,$isbanned,$wap,$ismobiledevice, + $issyndicationreader,$crawler,$css,$cssversion,$supportscss,$aolversion,$aol,$netclr,$clrversion,$internalid); + + if(!$result) + { + watchdog('browscap', "DB error: ".db_error()); + } + } fclose($browscapfp); unlink($browscapfile); + // Phase 2 - for every entry which isn't a top-level entry, plug // in the data from its parent + $query = 'SELECT useragent,parent from {browscap} WHERE useragent <> parent'; $result = db_query($query); while ($destrow = db_fetch_object($result)) { - $query = "SELECT * FROM {browscap} WHERE useragent='%s'"; + + // grab parent data + $fields = array('browser', 'version', 'majorver', 'minorver'); + $field_sql = implode(",", $fields); + + $query = "SELECT " . $field_sql . " FROM {browscap} WHERE useragent='%s'"; $srcrow = db_fetch_object(db_query($query, $destrow->parent)); - db_query("UPDATE {browscap} SET browser='%s',version='%s',". - "majorversion='%s',minorversion='%s',platform='%s',". - "authenticodeupdate='%s',cssversion=%d,frames=%d,iframes=%d,". - "htmltables=%d,cookies=%d,backgroundsounds=%d,vbscript=%d,". - "javascript=%d,javaapplets=%d,activexcontrols=%d,cdf=%d,". - "aol=%d,beta=%d,win16=%d,crawler=%d,stripper=%d,wap=%d,netclr=%d ". - "WHERE useragent='%s'", - $srcrow->browser,$srcrow->version, - $srcrow->majorversion,$srcrow->minorversion,$srcrow->platform, - $srcrow->authenticodeupdate,$srcrow->cssversion,$srcrow->frames,$srcrow->iframes, - $srcrow->htmltables,$srcrow->cookies,$srcrow->backgroundsounds,$srcrow->vbscript, - $srcrow->javascript,$srcrow->javaapplets,$srcrow->activexcontrols,$srcrow->cdf, - $srcrow->aol,$srcrow->beta,$srcrow->win16,$srcrow->crawler,$srcrow->stripper,$srcrow->wap,$srcrow->netclr, - $destrow->useragent); + + // compare and only update those fields in the child which are null + $dest_setsql = array(); + + foreach($fields as $field) + { + if ($destrow->$field == null) + { + $dest_setsql[$field] = "'%s'"; + } + } + + $sql = implode(",", _browscap_get_destsql($dest_setsql)); + $vars = _browscap_get_destvars($dest_setsql, $srcrow); + $vars[] = $destrow->useragent; + + // update child with parent data using db_query's "all in one array" args feature for $vars + db_query("UPDATE {browscap} SET ". $sql . " WHERE useragent='%s'", $vars); } // All done updating the browscap info - invalidate cached data // from the last version, and record the version we're currently @@ -224,6 +256,29 @@ } } +/* import helper functions */ + +function _browscap_get_destsql($dest_setsql) +{ + $dest_sql = array(); + foreach($dest_setsql as $key => $val) + { + $dest_sql[] = $key . '=' . $val; + } + + return $dest_sql; +} + +function _browscap_get_destvars($dest_setsql, $srcrow) +{ + $var_list = array(); + foreach($dest_setsql as $key => $val) + { + $var_list[] = $srcrow->$key; + } + return $var_list; +} + /** * Implementation of hook_exit(). * @@ -405,4 +460,4 @@ print theme('page', $output, $title); } -?> +?> \ No newline at end of file