--- /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
