Changeset: 55b808c01025 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=55b808c01025
Modified Files:
sql/src/backends/monet5/vaults/Makefile.ag
sql/src/backends/monet5/vaults/fits.mx
Branch: default
Log Message:
Added primitive for loading of FITS table.
If HDU extension name is missing, the table is identified by the basename of the
file, and the number of the HDU.
diffs (truncated from 339 to 300 lines):
diff -r 318fc302a37b -r 55b808c01025 sql/src/backends/monet5/vaults/Makefile.ag
--- a/sql/src/backends/monet5/vaults/Makefile.ag Fri Dec 03 14:39:53
2010 +0100
+++ b/sql/src/backends/monet5/vaults/Makefile.ag Fri Dec 03 15:17:17
2010 +0100
@@ -15,7 +15,7 @@
# Copyright August 2008-2010 MonetDB B.V.
# All Rights Reserved.
-INCLUDES = ../../../include ../../../common ../../../storage ../../../server
../ \
+INCLUDES = ../../../include ../../../common ../../../storage ../../../server
../ ../../../storage/bpm \
$(MONETDB5_INCS) $(CLIENTS_INCS) $(MONETDB_INCS) $(READLINE_INCS)
$(MSEED_CFLAGS) $(CFITSIO_CFLAGS)
lib__vault = {
diff -r 318fc302a37b -r 55b808c01025 sql/src/backends/monet5/vaults/fits.mx
--- a/sql/src/backends/monet5/vaults/fits.mx Fri Dec 03 14:39:53 2010 +0100
+++ b/sql/src/backends/monet5/vaults/fits.mx Fri Dec 03 15:17:17 2010 +0100
@@ -32,6 +32,10 @@
address FITSattach
comment "Open a FITS file and return catalog of the table HDUs";
+pattern load(tablename :str):void
+address FITSloadTable
+comment "Load a FITS table from an attached file";
+
@h
#ifndef _FITS_
@@ -43,7 +47,9 @@
#include "longnam.h"
#include "sql_config.h"
#include <sql_mvc.h>
+#include <sql_scenario.h>
#include <sql.h>
+#include "bpm_storage.h"
#include "clients.h"
#include "mal.h"
#include "mal_client.h"
@@ -61,12 +67,15 @@
fits_export str FITStest(int *res, str *fname);
fits_export str FITSattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
+fits_export str FITSloadTable(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
#endif
@-
@c
#include "fits.h"
+#define FITS_INS_COL "INSERT INTO fits_columns(id, name, type, units,table_id)
\
+ VALUES(%d, '%s','%s','%s',%d);"
str
FITStest(int *res, str *fname)
@@ -107,6 +116,7 @@
fits_tbl = mvc_create_table(m, sch, "fits_tables", tt_table, 0,
SQL_PERSIST, 0, 4);
mvc_create_column_(m, fits_tbl, "id","int",32);
mvc_create_column_(m, fits_tbl, "name","varchar",80);
+ mvc_create_column_(m, fits_tbl, "columns","int",32);
mvc_create_column_(m, fits_tbl, "file_id","int",32);
mvc_create_column_(m, fits_tbl, "hdu","int",32);
}
@@ -117,9 +127,8 @@
mvc_create_column_(m, fits_col, "id","int",32);
mvc_create_column_(m, fits_col, "name","varchar",80);
mvc_create_column_(m, fits_col, "type","varchar",80);
- mvc_create_column_(m, fits_col, "mtype","int",32);
+ mvc_create_column_(m, fits_col, "units","varchar",10);
mvc_create_column_(m, fits_col, "table_id","int",32);
- mvc_create_column_(m, fits_col, "units","varchar",10);
}
}
@@ -159,6 +168,50 @@
return -1;
}
+static int
+fits2subtype(sql_subtype *tpe, int t, long rep, long wid)
+{
+
+ printf("Tpcode %d, rep %ld, wid %ld\n", t,rep,wid);
+ switch(t) {
+ case TBIT:
+ case TLOGICAL:
+ sql_find_subtype(tpe, "boolean", 0, 0 );
+ break;
+ case TBYTE:
+ case TSBYTE:
+ sql_find_subtype(tpe, "char", 1, 0 );
+ break;
+ case TSTRING:
+ sql_find_subtype(tpe, "varchar", (unsigned int)rep, 0);
+ break;
+ case TUSHORT:
+ case TSHORT:
+ sql_find_subtype(tpe, "smallint", 16, 0);
+ break;
+ case TUINT:
+ case TINT:
+ case TULONG:
+ case TLONG:
+ sql_find_subtype(tpe, "int", 32, 0);
+ break;
+ case TLONGLONG:
+ sql_find_subtype(tpe, "bigint", 64, 0);
+ break;
+ case TFLOAT:
+ sql_find_subtype(tpe, "real", 32, 0 );
+ break;
+ case TDOUBLE:
+ sql_find_subtype(tpe, "double", 51, 0 );
+ break;
+ /* missing */
+ case TCOMPLEX:
+ case TDBLCOMPLEX:
+ return -1;
+ }
+ return 1;
+}
+
str FITSattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
mvc *m = NULL;
@@ -169,15 +222,12 @@
str fname = *(str*) getArgReference(stk, pci, 1);
fitsfile *fptr; /* pointer to the FITS file */
int status = 0, i, j, hdutype, hdunum = 1, cnum = 0;
- int tpcode = 0, mtype;
oid fid, tid, rid = oid_nil;
- char tname[BUFSIZ];
- long tbcol, rep, wid;
- char cname[BUFSIZ], tform[BUFSIZ], tunit[BUFSIZ], tnull[BUFSIZ],
tdisp[BUFSIZ];
+ char tname[BUFSIZ], *s, bname[BUFSIZ]; /*, stmt[BUFSIZ];*/
+ long tbcol;
+ char cname[BUFSIZ], tform[BUFSIZ], tunit[BUFSIZ], tnull[BUFSIZ],
tdisp[BUFSIZ];
double tscal, tzero;
-
-
msg = getContext(cntxt, mb, &m, NULL);
if (msg)
return msg;
@@ -217,6 +267,14 @@
col = mvc_bind_column(m, fits_tbl, "id");
tid = store_funcs.count_col(col) + 1;
+ if ((s = strrchr(fname, DIR_SEP)) == NULL)
+ s = fname;
+ else
+ s++;
+ strcpy(bname, s);
+ s = strrchr(bname,'.');
+ if ( s ) *s = 0;
+
fits_get_num_hdus(fptr, &hdunum, &status);
for (i = 1; i <= hdunum; i++){
fits_movabs_hdu(fptr, i, &hdutype, &status);
@@ -226,32 +284,42 @@
/* SQL table name - the name of FITS extention */
fits_read_key(fptr, TSTRING, "EXTNAME", tname, NULL, &status);
if ( status ) {
- snprintf(tname,BUFSIZ,"%s_%d",fname,i);
+ snprintf(tname,BUFSIZ,"%s_%d",bname,i);
status = 0;
}
- else { /* check table name for existence */
+ else { /* check table name for existence in the fits catalog */
+ col = mvc_bind_column(m, fits_tbl, "name");
+ rid = table_funcs.column_find_row(m->session->tr, col,
tname, NULL);
+ /* or as regular SQL table */
tbl = mvc_bind_table(m, sch, tname);
- if ( tbl )
- snprintf(tname,BUFSIZ,"%s_%d",fname,i);
+ if ( rid != oid_nil || tbl )
+ snprintf(tname,BUFSIZ,"%s_%d",bname,i);
}
+ fits_get_num_cols(fptr, &cnum, &status);
+
store_funcs.append_col(m->session->tr,
- mvc_bind_column(m, fits_tbl, "id"), &tid,
TYPE_int);
+ mvc_bind_column(m, fits_tbl, "id"), &tid, TYPE_int);
store_funcs.append_col(m->session->tr,
mvc_bind_column(m, fits_tbl, "name"), tname, TYPE_str);
store_funcs.append_col(m->session->tr,
+ mvc_bind_column(m, fits_tbl, "columns"), &cnum,
TYPE_str);
+ store_funcs.append_col(m->session->tr,
mvc_bind_column(m, fits_tbl, "file_id"), &fid,
TYPE_int);
store_funcs.append_col(m->session->tr,
mvc_bind_column(m, fits_tbl, "hdu"), &i, TYPE_int);
/* read columns description */
+ /* s = stmt;*/
- fits_get_num_cols(fptr, &cnum, &status);
for ( j = 1; j <= cnum; j++){
fits_get_acolparms(fptr, j, cname, &tbcol, tunit, tform,
&tscal, &tzero, tnull, tdisp, &status);
- fits_get_coltype(fptr, j, &tpcode, &rep, &wid, &status);
- mtype = fits2mtype(tpcode);
+ /* fits_get_coltype(fptr, j,
&tpcode, &rep, &wid, &status);*/
+ /* snprintf(stmt, BUFSIZ,
FITS_INS_COL, j, cname, tform, tunit, (int)tid);
+ printf("%s\n",stmt);
+ msg = SQLstatementIntern(cntxt,
&s,"fits.attach",TRUE,FALSE);
+ */
store_funcs.append_col(m->session->tr,
mvc_bind_column(m, fits_col, "id"), &j,
TYPE_int);
store_funcs.append_col(m->session->tr,
@@ -259,11 +327,9 @@
store_funcs.append_col(m->session->tr,
mvc_bind_column(m, fits_col, "type"), tform,
TYPE_str);
store_funcs.append_col(m->session->tr,
- mvc_bind_column(m, fits_col, "mtype"), &mtype,
TYPE_int);
- store_funcs.append_col(m->session->tr,
mvc_bind_column(m, fits_col, "table_id"), &tid,
TYPE_int);
store_funcs.append_col(m->session->tr,
- mvc_bind_column(m, fits_col, "units"), tunit,
TYPE_str);
+ mvc_bind_column(m, fits_col, "units"), tunit,
TYPE_str);
}
tid++;
}
@@ -272,5 +338,118 @@
return MAL_SUCCEED;
}
+str FITSloadTable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ mvc *m = NULL;
+ sql_schema *sch;
+ sql_table *fits_fl, *fits_tbl, *tbl = NULL;
+ sql_column *col;
+ sql_subtype tpe;
+ sql_bpm *p;
+ fitsfile *fptr;
+ str tname = *(str*) getArgReference(stk, pci, 1);
+ str fname;
+ str msg = MAL_SUCCEED;
+ oid rid = oid_nil, frid = oid_nil;
+ int status = 0, cnum = 0, fid, hdu, hdutype, *tpcode = NULL, j, anynull;
+ long rep, wid, rows;
+ char keywrd[80], **cname;
+ BAT *b;
+ ptr nilptr;
+
+ msg = getContext(cntxt, mb, &m, NULL);
+ if (msg)
+ return msg;
+ sch = mvc_bind_schema(m,"sys");
+
+ fits_tbl = mvc_bind_table(m, sch, "fits_tables");
+ if ( fits_tbl == NULL ){
+ msg = createException(MAL, "fits.loadtable", "FITS catalog is
missing.\n");
+ return msg;
+ }
+
+ tbl = mvc_bind_table(m, sch, tname);
+ if ( tbl ) {
+ msg = createException(MAL, "fits.loadtable", "Table %d is
already created.\n", tname);
+ return msg;
+ };
+
+ col = mvc_bind_column(m, fits_tbl, "name");
+ rid = table_funcs.column_find_row(m->session->tr, col, tname, NULL);
+ if ( rid == oid_nil ){
+ msg = createException(MAL, "fits.loadtable", "Table %s is
unknown in FITS catalog. Attach first the containing file\n", tname);
+ return msg;
+ }
+
+ /* Open FITS file and move to the table HDU */
+ col = mvc_bind_column(m, fits_tbl, "file_id");
+ fid = *(int*) table_funcs.column_find_value(m->session->tr, col, rid);
+
+ fits_fl = mvc_bind_table(m, sch, "fits_files");
+ col = mvc_bind_column(m, fits_fl, "id");
+ frid = table_funcs.column_find_row(m->session->tr, col, (void *) &fid,
NULL);
+ col = mvc_bind_column(m, fits_fl, "name");
+ fname = *(str*) table_funcs.column_find_value(m->session->tr, col,
frid);
+ if ( fits_open_file(&fptr, fname, READONLY, &status) ){
+ msg = createException(MAL, "fits.loadtable", "Missing FITS file
%s.\n", fname);
+ return msg;
+ }
+
+ col = mvc_bind_column(m, fits_tbl, "hdu");
+ hdu = *(int*) table_funcs.column_find_value(m->session->tr, col, rid);
+ fits_movabs_hdu(fptr, hdu, &hdutype, &status);
+ if ( hdutype != ASCII_TBL && hdutype != BINARY_TBL ){
+ msg = createException(MAL, "fits.loadtable", "HDU %d is not a
table.\n", hdu);
+ fits_close_file(fptr, &status);
+ return msg;
+ }
+
+ /* create a SQL table to hold the FITS table */
+ col = mvc_bind_column(m, fits_tbl, "columns");
+ cnum = *(int*) table_funcs.column_find_value(m->session->tr, col, rid);
+ tbl = mvc_create_table(m, sch, tname, tt_table, 0, SQL_PERSIST, 0,
cnum);
+
+ tpcode = (int *)GDKzalloc(sizeof(int) * cnum);
+ cname = (char **)GDKzalloc(sizeof(char *) * cnum);
+ for ( j = 1; j <= cnum; j++ ){
+ /* fits_get_acolparms(fptr, j, cname, &tbcol,
tunit, tform, &tscal, &tzero, tnull, tdisp, &status); */
+ cname[j-1] = (char *)GDKzalloc(FLEN_VALUE);
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list