aboutsummaryrefslogtreecommitdiff
path: root/vendor/voclient/libvoclient/examples/siap4.c
blob: 5d5b8def8fc6474fb65e31cb19fab450d51ade6b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/************************************************************************
 *   Call a SIAP search service and download resulting datasets.
 *
 *   Usage:        siap4 ra dec size [format [maximages [serviceURL]]]
 *
 *   Or call with no args for the built-in unit test.
 *
 *  M. Fitzpatrick, NOAO, June 2006
 */


#include <stdio.h>
#include <stdlib.h>
#include "VOClient.h"

double  ra       = 12.0;			/* default values	*/
double  dec      = 0.0;
double  size     = 0.5;
char	*format  = "ALL";
int	maximages= 5;

char   *service1  = "http://www-gsss.stsci.edu/gscvo/DSS2.jsp";
char   *service2  = "http://skyview.gsfc.nasa.gov/cgi-bin/vo/sia.pl?";

char   *server   = "6200:localhost";

static void callSiapService (char *url, double ra, double dec, double size,
    char *format, int maximages);


int main (int argc, char *argv[])
{
    char *service = service2;


    /* Process command line arguments.
     */
    if (argc <= 1) {
	/* Use builtin defaults. */
    } else if (argc >= 3) {
	int arg = 1;
    
	/* Look for a server specification. */
	if (strncmp (argv[arg], "-ds",3) == 0)
	    server = argv[++arg];
	ra   = atof (argv[arg++]);
	dec  = atof (argv[arg++]);
	size = atof (argv[arg++]);
	if (arg < argc) format    = argv[arg++];
	if (arg < argc) maximages = atoi (argv[arg++]);
	if (arg < argc) service   = argv[arg++];

    } else {
        fprintf (stderr, 
	    "Usage: siap4 [-ds server] ra dec size [fmt [maximg [siapURL]]]\n");
        exit(1);
    }

    /* Now call the Siap Service and summarize the results.
     */
    callSiapService (service, ra, dec, size, format, maximages);

    return (0);
}


/*  Simple test routine to call a Siap search service and summarize results.
 */
static void
callSiapService (char *service_url, double ra, double dec, double size,
    char *format, int maximages)
{
    char *voc_opts = NULL;
    char *acref    = NULL;
    char  fname[SZ_FNAME];
    int   i, nattr = 0, nrec = 0;

    DAL	      siap;				/* DAL Connection	 */
    Query     query;				/* query handle		 */
    QResponse qr;                               /* query response handle */
    QRecord   rec;				/* result record handle	 */
    QRAttribute v;				/* dataset attribute	 */
	

    /*  Initialize the VOClient code.  Error messages are printed by the
     *  interface so we just quit if there is a problem.
     */
    if (voc_initVOClient (voc_opts) == ERR) 
        return;

    /*  Get a new connection to the named service.
     */
    siap = voc_openSiapConnection (service_url);    /* open a connection    */

    /*  Form a query.  Here we'll use the one search size we're given for
     *  both the RA,DEC sizes, and specify a null format.
     */
    query = voc_getSiapQuery (siap, ra, dec, size, size, format);

    printf ("Executing Query:\n  %s\n\n", 
        voc_getQueryString (query, SIAP_CONN, 0));
    qr = voc_executeQuery (query);                  /* execute the query    */


    /* Summarize response.
     */
    if ((nrec = voc_getRecordCount (qr)) <= 0) {    
        fprintf (stderr, "no records matched");
        exit (1);

    } else {
        rec = voc_getRecord (qr, 0);
        nattr = (rec != ERR) ? voc_getAttrCount (rec) : 0;

        printf ("# returns %d records containing %d attributes each\n#\n",
            nrec, nattr);
    }


    /*  Download the first 'maximages' images.
     */
    printf ("Downloading images:\n");

    for (i=0; i < nrec && i < maximages; i++) {
	rec = voc_getRecord (qr, i);            /* get a row in the table    */

	v = voc_getAttribute (rec, "AccessReference");

	if (v <= 0) 
	    continue;

	bzero (fname, SZ_FNAME);
	sprintf (fname, "dataset.%04d", i);
	printf ("Downloading: %s\n", (acref = voc_stringValue (v)) );

	if ( voc_getDataset (rec, acref, fname) == OK )
	    printf ("Downloaded %s\n", fname);
	else
	    printf ("Download failed\n");
    }

    voc_closeConnection (siap);			/* close the siap connection */
    voc_closeVOClient (1);		        /* clean up and shutdown     */

    return;
}