ソースを参照

Complete revision fo the cleanup method. Still deletes any orphans between node and chado_analysis in drupal but also checks for orphans without records in chado.

Sync function now prints form errors to stdout.
mestato 14 年 前
コミット
4e3a64a161
1 ファイル変更66 行追加58 行削除
  1. 66 58
      tripal_analysis/tripal_analysis.module

+ 66 - 58
tripal_analysis/tripal_analysis.module

@@ -415,8 +415,7 @@ function tripal_analysis_sync_analyses ($analysis_id = NULL, $job_id = NULL){
 		$sql = "SELECT Analysis_id, name AS analysisname, description, program, ".
    		 "  programversion, algorithm, sourcename, sourceversion, sourceuri, ".
           "  timeexecuted ".
-          "FROM {Analysis} ".
-          "ORDER BY analysis_id";
+          "FROM {Analysis} ";
 		$previous_db = db_set_active('chado');  // use chado database
 		$results = db_query($sql);
 		db_set_active($previous_db);  // now use drupal database
@@ -426,12 +425,16 @@ function tripal_analysis_sync_analyses ($analysis_id = NULL, $job_id = NULL){
           "  timeexecuted ".
           "FROM {Analysis} ".
           "WHERE analysis_id = %d";
-          "ORDER BY analysis_id";
 		$previous_db = db_set_active('chado');  // use chado database
 		$results = db_query($sql,$analysis_id);
 		db_set_active($previous_db);  // now use drupal database
 	}
 
+    ##REMOVE 
+    print "results:\n";
+    print $results;
+    print "\n";
+
 	// We'll use the following SQL statement for checking if the analysis
 	// already exists as a drupal node.
 	$sql = "SELECT * FROM {chado_analysis} ".
@@ -443,15 +446,22 @@ function tripal_analysis_sync_analyses ($analysis_id = NULL, $job_id = NULL){
 		if(!db_fetch_object(db_query($sql,$analysis->analysis_id))){
 			
 			$new_node = new stdClass();
+        
 			// try to access analysisprop for this analysis
 			$sql = "SELECT * FROM {analysisprop} WHERE analysis_id = %d";
 			$previous_db = db_set_active('chado');
 			$analysisprop = db_fetch_object(db_query($sql, $analysis->analysis_id));
+			db_set_active($previous_db);
+
 			// If analysisprop exists, this analysis can be a blast analysis or 
 			// interpro analysis. Get its type using cvterm_id
 			if ($analysisprop) {
+
 				$sql = "SELECT name, definition FROM {cvterm} WHERE cvterm_id = %d";
+			    $previous_db = db_set_active('chado');
 				$result = db_fetch_object(db_query($sql, $analysisprop->type_id));
+			    db_set_active($previous_db);
+
 				// This is a blast analysis
 				if ($result->name == 'analysis_blast_settings') {
 					$new_node->type = 'chado_analysis_blast';
@@ -470,8 +480,7 @@ function tripal_analysis_sync_analyses ($analysis_id = NULL, $job_id = NULL){
 			} else {
 				$new_node->type = 'chado_analysis';
 			}
-			db_set_active($previous_db);
-			
+
 			$new_node->uid = $user->uid;
 			$new_node->analysis_id = $analysis->analysis_id;
 			$new_node->analysisname = $analysis->analysisname;
@@ -489,13 +498,22 @@ function tripal_analysis_sync_analyses ($analysis_id = NULL, $job_id = NULL){
 			if ($new_node->analysisname) {
 				$new_node->title = $new_node->analysisname;
 			} else {
-				//Construct node title as "program (version)
+				//Construct node title as "program (version)"
 				$new_node->title = "$analysis->program ($analysis->programversion)";
 			}
+
 			node_validate($new_node);
-			if(!form_get_errors()){
+
+            $errors = form_get_errors();
+
+            if($errors){
+                print_r($errors);
+            }
+            else{
+			##if(!form_get_errors()){
 				$node = node_submit($new_node);
 				node_save($node);
+
 				if($node->nid){
 					$page_content .= "Added $new_node->title<br>";
 				}
@@ -674,66 +692,56 @@ function theme_tripal_analysis_analysis_page($analyses) {
  */
 function tripal_analyses_cleanup($dummy = NULL, $job_id = NULL) {
 
-	// build the SQL statments needed to check if nodes point to valid analyses
-	$dsql = "SELECT * FROM {node} WHERE type = 'chado_analysis' order by nid";
-	$nsql = "SELECT * FROM {node} WHERE nid = %d";
-	$csql = "SELECT * FROM {chado_analysis} where nid = %d ";
-	$cosql= "SELECT * FROM {chado_analysis}";
-	$tsql = "SELECT * FROM {analysis} O ".
-           "WHERE analysis_id = %d";
-
-	// load into nodes array
-	$results = db_query($dsql);
-	$count = 0;
-	$nodes = array();
-	while($node = db_fetch_object($results)){
-		$nodes[$count] = $node;
-		$count++;
-	}
+    // select each node from node table with chado_analysis as type
+    // check to make sure it also exists in chado_analysis table, delete if it doesn't
+    // (this should never, ever happen, but we'll double check anyway)
+	$sql_drupal_node = "SELECT * FROM {node} WHERE type LIKE 'chado_analysis%' order by nid";
+    $sql_drupal_ca = "SELECT * from {chado_analysis} WHERE nid = %d";
 
-	// load the chado_analyses into an array
-	$results = db_query($cosql);
-	$cnodes = array();
+	$results = db_query($sql_drupal_node);
 	while($node = db_fetch_object($results)){
-		$cnodes[$count] = $node;
-		$count++;
+        $ca_record = db_fetch_object(db_query($sql_drupal_ca, $node->nid));
+        if(!$ca_record){ 
+            node_delete($node->nid); 
+			$message = "Missing in chado_analysis table.... DELETING node: $nid->nid\n";
+			watchdog('tripal_analysis',$message,array(),WATCHDOG_WARNING);
+        }
 	}
-	$interval = intval($count * 0.01);
 
-	// iterate through all of the chado_analysis nodes and delete those that aren't valid
-	foreach($nodes as $nid){
-
-		// update the job status every 1% analyses
-		if($job_id and $i % $interval == 0){
-			tripal_job_set_progress($job_id,intval(($i/$count)*100));
-		}
-
-		// first check to see if the node has a corresponding entry
-		// in the chado_analysis table. If not then delete the node.
-		$analysis = db_fetch_object(db_query($csql,$nid->nid));
-		if(!$analysis){
-			node_delete($nid->nid);
-			$message = "Missing in chado_analysis table.... DELETING: $nid->nid\n";
+    // get nodes from chado_analysis table and load into array, saving chado analysis_id
+    // as we iterate through, we'll check that they are actual nodes and
+    // delete if they aren't
+    // (this should never, ever happen, but we'll double check anyway)
+	$sql_drupal_ca2 = "SELECT * FROM {chado_analysis}";
+	$sql_drupal_node2 = "SELECT * FROM {node} WHERE type LIKE 'chado_analysis%' AND nid = %d";
+
+	$results = db_query($sql_drupal_ca2);
+	$nid2aid = array();
+	while($ca_record = db_fetch_object($results)){
+        $node = db_fetch_object(db_query($sql_drupal_node2, $ca_record->nid));
+        if(!$node){ 
+			db_query("DELETE FROM {chado_analysis} WHERE nid = $ca_record->nid");
+			$message = "chado_analysis missing node.... DELETING chado_analysis record with nid: $ca_record->nid\n";
 			watchdog('tripal_analysis',$message,array(),WATCHDOG_WARNING);
-			continue;
-		}
-		$i++;
+        }
+        else{
+		    $nid2aid[$ca_record->nid] = $ca_record->analysis_id;
+        }
 	}
 
-	// iterate through all of the chado_analysis nodes and delete those  that aren't valid
-	foreach($cnodes as $nid){
-		// update the job status every 1% analyses
-		if($job_id and $i % $interval == 0){
-			tripal_job_set_progress($job_id,intval(($i/$count)*100));
-		}
-		$node = db_fetch_object(db_query($nsql,$nid->nid));
-		if(!$node){
-			db_query("DELETE FROM {chado_analysis} WHERE nid = $nid->nid");
-			$message = "chado_analysis missing node.... DELETING: $nid->nid\n";
+	// iterate through all of the chado_analysis nodes in drupal
+    // and delete those that aren't valid in chado
+    $sql_chado = "SELECT analysis_id from {analysis} WHERE analysis_id = %d";
+
+	foreach($nid2aid as $nid => $aid){
+        $previous_db = db_set_active('chado');
+		$chado_record = db_fetch_object(db_query($sql_chado,$aid));
+        db_set_active($previous_db);
+		if(!$chado_record){
+            node_delete($nid); 
+			$message = "Missing in analysis table in chado.... DELETING node: $nid\n";
 			watchdog('tripal_analysis',$message,array(),WATCHDOG_WARNING);
 		}
-
-		$i++;
 	}
 	return '';
 }