STDLL stata_call(int argc, char *argv[]) {
	ST_uint4	j, i, from, to;
	ST_uint4 	n;
	ST_long 	nSubsets;
	ST_uint4 	nOutputVars=9; /* ES_F, varES_F, es_R, varES_R, df, Q, I2, tau2 subsetString */
	ST_uint4 	nInputVars=2;  /* ES, var*/
	ST_double	z, es, var;
	ST_retcode	rc;
	//ST_double 	version = 0.1;	
	ST_double 	version = 0.2;	
	
	char	buf[80];
	
	gsl_vector * esVector;
	gsl_vector * varVector;
	gsl_vector * metaResultsVector;
	
	//if (argc != 1) {
	if (argc != 3) {
		snprintf(buf, 80, "Plugin (ver: %g) usage: c_meta nStudies\n", version);
		SF_error(buf);
		SF_error("Please debug the calling .ado file!!!\n");
		return (-1);
	}
	n = (ST_uint4) atoi(argv[0]);
	from = (ST_uint4) atoi(argv[1]);   /* added modification */
	to = (ST_uint4) atoi(argv[2]);     /* added modification */

/*
	// debugging by printing out arguments   
	for (i=0; i< argc; i++) {
    	snprintf(buf, 80, "\narg%d=%s", i, argv[i]);
    	SF_error(buf);
 	}
	snprintf(buf, 80, "\nfrom=%d\nto=%d", from, to);
    SF_error(buf);
*/

	esVector = gsl_vector_alloc(n);
	varVector = gsl_vector_alloc(n);

	/* This will hold the meta-analysis results */
	metaResultsVector = gsl_vector_alloc(nOutputVars-1);  /* last var is string */
	
	/*nSubsets = gsl_pow_int(2,n)-1;*/
	nSubsets = 0;
	for(i=from;i<=to;i++) {
		nSubsets = nSubsets + gsl_sf_choose(n, i);
	}


	if (SF_in2()<nSubsets) {
		snprintf(buf, 80, "Plugin needs %ld observations in dataset\n", nSubsets);
		SF_error(buf);
		SF_error("Please debug the calling .ado file!!!\n");
		return (-1);
	}
	
	if (SF_nvars() != nInputVars+nOutputVars)  {
		snprintf(buf, 80, "Plugin expects %d input and %d output variables!\n",
			nInputVars, nOutputVars);
		SF_error(buf);
		SF_error("Please debug the calling .ado file!!!\n");
		return(102);
	}
    
	for(j=SF_in1(); j<= n ; j++) {
		if (SF_ifobs(j)) {
			if((rc=SF_vdata(1,j,&z))) return(rc);
			es = z;
			if((rc=SF_vdata(2,j,&z))) return(rc);
			var = z;
			if(SF_is_missing(es) | SF_is_missing(var)) {
				snprintf(buf, 80,"You have passed missing values (obs # %d) in the C plugin!\n", j);
				SF_error(buf);
				SF_error("Please debug the calling .ado file!!!\n");
				return(-1);
			} 
			else {
				/* do stuff here */
				gsl_vector_set(esVector,j-1, es);
				gsl_vector_set(varVector,j-1, var);
			}
		}
	}

	if ((rc=AllSubsetsMetaAnalysis(esVector, varVector, metaResultsVector, from, to))) return(rc); 

	gsl_vector_free(esVector);
	gsl_vector_free(varVector);
	gsl_vector_free(metaResultsVector);
	
	return(0);
}
Exemple #2
0
int write_data(void)
{
	int c,r,max_len ;
	max_len = 33*SF_nvars() ;	

	char query[40+max_len] ;
	char varnames[max_len] ;
	char vartypes[max_len] ;
	char buff[16] ;
	char *var = NULL ; 	
	char *type = NULL ; 	
	char *remove_comma ;	
	
	ST_retcode rc ;
	ST_double val = 0 ;

	// Create MySQL connection
	if(mysql_init(&mysql)==NULL)
	{
		SF_error("failed to initate MySQL connection\n") ;
		return 198 ;
	}
	// Connect to database stata_test
	if (!mysql_real_connect(&mysql,"127.0.0.1","user",
				"password","stata_test",3306,NULL,0))
	{
		SF_error("error connecting to database\n") ;
		return 198 ;
	}
	// Grab variable names from Stata macro myvars
	SF_macro_use("_myvars", varnames, max_len) ;
	// Build query
	strcpy(query, "INSERT INTO stata_test (") ;
	var = strtok(varnames, " ") ;	
	// Insert varnames into query
	while (var!=NULL) {
		strcat(query, var) ;
		strcat(query, ",") ;
		var = strtok(NULL, " ") ;	
	}
	remove_comma = strrchr(query, ',');
	*remove_comma = ')';	
	strcat(query, " VALUES(") ;
	// Insert values into query
	for(r=SF_in1();r<=SF_in2(); r++){
		SF_macro_use("_mytypes", vartypes, max_len) ;
		type = strtok(vartypes, " ") ;	
		if(SF_ifobs(r)) {
			for(c=1;c<=SF_nvars();c++){
				if (strstr(type, "str")) {
					if(rc = SF_sdata(c,r,buff)) return(rc) ;
				}
				else {
					if(rc = SF_vdata(c,r,&val)) return(rc) ;
					sprintf(buff, "%g", val) ;
				}
				strcat(query, "'") ;			
				strcat(query, buff) ;			
				strcat(query, "'") ;			
				strcat(query, ",") ;
				type = strtok(NULL, " ") ;
			}
			remove_comma = strrchr(query, ',') ;
			*remove_comma = ')' ;	
			strcat(query, ",(") ;
		}
	}
	remove_comma = strrchr(query, ',');
	*remove_comma = '\0';
	// Query database
	rc=mysql_real_query(&mysql,query, strlen(query)) ;
	if (rc)
	{
		SF_error("error making query\n") ;
		return 198 ;
	}
	return 0 ;
}