Skip to content
Snippets Groups Projects
Commit bb58b383 authored by Kor Begeman's avatar Kor Begeman
Browse files

Oracle-htm interface routines

parent ec6b58a9
Branches
No related merge requests found
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define _INC_IOSTREAM
#include "htm.h"
/* OCI stuff */
#include <ociextp.h>
#define setup_OCI( arg ) Setup_OCI( arg, &envhp, &errhp, &svchp )
extern unsigned long long lookup( int, double, double );
extern int get_depth( unsigned long long );
extern htm_list get_nearest_indices( unsigned long long, int );
extern htm_list get_circle_indices( int, int, int, double, double, double );
extern double get_distance( double ra1, double dec1, double ra2, double dec2 );
extern "C" {
void checkerr( OCIError *, sword );
void Setup_OCI( OCIExtProcContext *ctx, OCIEnv **, OCIError **, OCISvcCtx ** );
}
static OCIError *errhp = (OCIError *) 0; /* error handle */
static OCIEnv *envhp = (OCIEnv *) 0;
static OCISvcCtx *svchp = (OCISvcCtx *) 0;
#include <sys/time.h>
extern "C" {
OCITable *JunkTable( OCIExtProcContext * );
}
static unsigned long long b_time[8];
static unsigned long long t_time[8];
static unsigned long long c_count[8];
OCITable *JunkTable( OCIExtProcContext *ctx )
{
setup_OCI( ctx );
OCITable *r = (OCITable *)0;
static OCIType *htm_list_tdo = (OCIType *)0;
sword q;
if (htm_list_tdo == (OCIType *)0) {
q = OCITypeByName(
envhp,
errhp,
svchp,
(CONST text *)"",
(ub4) strlen(""),
(const text *) "HTM_LIST",
(ub4) strlen((const char *) "HTM_LIST"),
(CONST text *) 0,
(ub4) 0,
OCI_DURATION_SESSION,
OCI_TYPEGET_ALL,
&htm_list_tdo
);
checkerr( errhp, q );
}
q = OCIObjectNew(
envhp,
errhp,
svchp,
OCI_TYPECODE_NAMEDCOLLECTION,
htm_list_tdo,
(dvoid *) 0,
OCI_DURATION_DEFAULT,
TRUE,
(dvoid **) &r
);
checkerr( errhp, q );
int k;
for ( k = 0; k < 8; k++ ) {
OCINumber Dummy;
double dt = (double) t_time[k] / 1000000.0;
q = OCINumberFromReal( errhp, &dt, sizeof(dt), &Dummy );
checkerr( errhp, q );
q = OCICollAppend( envhp, errhp, &Dummy, (dvoid *)0, r );
checkerr( errhp, q );
unsigned long long c = c_count[k];
q = OCINumberFromInt( errhp, &c, sizeof(c), OCI_NUMBER_UNSIGNED, &Dummy );
checkerr( errhp, q );
q = OCICollAppend( envhp, errhp, &Dummy, (dvoid *)0, r );
checkerr( errhp, q );
t_time[k] = 0;
c_count[k] = 0;
}
return r;
}
static void Timing( int mode )
{
static struct timeval time;
if ( mode > 0) {
gettimeofday( &time, NULL );
b_time[mode-1] = (unsigned long long) time.tv_sec * 1000000 + (unsigned long long) time.tv_usec;
} else {
gettimeofday( &time, NULL );
t_time[-mode-1] += (unsigned long long) time.tv_sec * 1000000 + (unsigned long long) time.tv_usec - b_time[-mode-1];
c_count[-mode-1] += 1;
}
}
static OCINumber Lookup_R;
extern "C" {
OCINumber *Lookup( OCIExtProcContext *, int, double, double );
};
OCINumber *Lookup( OCIExtProcContext *ctx, int depth, double ra, double dec )
{
setup_OCI( ctx );
sword q;
OCINumber *r = &Lookup_R;
unsigned long long id;
id = lookup( depth, ra, dec );
q = OCINumberFromInt( errhp, &id, sizeof(id), OCI_NUMBER_UNSIGNED, r );
checkerr( errhp, q );
return r;
}
extern "C" {
int Depth( OCIExtProcContext *, OCINumber *);
};
int Depth( OCIExtProcContext *ctx, OCINumber *h )
{
setup_OCI( ctx );
sword q;
unsigned long long l;
q = OCINumberToInt( errhp, h, sizeof(l), OCI_NUMBER_SIGNED, &l );
checkerr( errhp, q );
return get_depth( l );
}
static OCINumber *Neighbours_R = NULL;
static int Neighbours_S = 0;
extern "C" {
OCITable *Neighbours2( OCIExtProcContext *, OCINumber *, int );
};
OCITable *Neighbours2( OCIExtProcContext *ctx, OCINumber *OCI_id, int depth )
{
Timing(1);
setup_OCI( ctx );
static OCITable *r;
unsigned long long id;
htm_list l;
sword q;
q = OCINumberToInt( errhp, OCI_id, sizeof(id), OCI_NUMBER_UNSIGNED, &id );
checkerr( errhp, q );
l = get_nearest_indices( id, depth );
if ( l.n > Neighbours_S ) {
Neighbours_R = (OCINumber *) realloc( Neighbours_R, l.n * sizeof( OCINumber ) );
Neighbours_S = l.n;
}
int i;
for (i = 0; i < l.n; i++) {
OCINumber Dummy;
q = OCINumberFromInt( errhp, &l.idx[i], sizeof(id), OCI_NUMBER_UNSIGNED, &Dummy );
checkerr( errhp, q );
q = OCICollAppend( envhp, errhp, &Dummy, (dvoid *)0, r );
checkerr( errhp, q );
int S;
q = OCICollSize ( envhp, errhp, r, (sb4 *)&S );
FILE *p = fopen( "/tmp/prutje", "w+" );
fprintf( p, "S = %d\n", S );
fclose( p );
}
Timing(-1);
return r;
}
extern "C" {
OCITable *NeighboursTest( OCIExtProcContext *, OCINumber *, int, int );
};
OCITable *NeighboursTest( OCIExtProcContext *ctx, OCINumber *OCI_id, int in_depth, int out_depth )
{
Timing(2);
setup_OCI( ctx );
OCITable *r = (OCITable *)0;
static OCIType *htm_list_tdo = (OCIType *)0;
unsigned long long id;
htm_list l;
sword q;
if (htm_list_tdo == (OCIType *)0) {
q = OCITypeByName(
envhp,
errhp,
svchp,
(CONST text *)"",
(ub4) strlen(""),
(const text *) "HTM_LIST",
(ub4) strlen((const char *) "HTM_LIST"),
(CONST text *) 0,
(ub4) 0,
OCI_DURATION_SESSION,
OCI_TYPEGET_ALL,
&htm_list_tdo
);
checkerr( errhp, q );
}
q = OCIObjectNew(
envhp,
errhp,
svchp,
OCI_TYPECODE_NAMEDCOLLECTION,
htm_list_tdo,
(dvoid *) 0,
OCI_DURATION_DEFAULT,
TRUE,
(dvoid **) &r
);
checkerr( errhp, q );
q = OCINumberToInt( errhp, OCI_id, sizeof(id), OCI_NUMBER_UNSIGNED, &id );
checkerr( errhp, q );
while (in_depth > out_depth) {
id = id / 4;
in_depth--;
}
Timing(3);
l = get_nearest_indices( id, out_depth );
Timing(-3);
int i;
for (i = 0; i < l.n; i++) {
OCINumber Dummy;
q = OCINumberFromInt( errhp, &l.idx[i], sizeof(id), OCI_NUMBER_UNSIGNED, &Dummy );
checkerr( errhp, q );
q = OCICollAppend( envhp, errhp, &Dummy, (dvoid *)0, r );
checkerr( errhp, q );
}
Timing(-2);
return r;
}
extern "C" {
int DistanceTest( OCIExtProcContext *, int, double, double, double, double, double );
}
int DistanceTest( OCIExtProcContext *ctx, int depth, double ra1, double dec1 , double ra2, double dec2 , double radius )
{
Timing(3);
setup_OCI( ctx );
static double save_ra1 = 0.0, save_dec1 = 0.0;
static double save_ra2 = 0.0, save_dec2 = 0.0, save_radius = 0.0;
static int save_depth = 0;
static unsigned long long save_id = 0;
static unsigned long long *ids = NULL;
static int nids = 0;
static int size_ids = 0;
FILE *test = fopen ("/tmp/distancetest","a");
if ( save_depth != depth || save_ra1 != ra1 || save_dec1 != dec1 ) {
save_id = lookup( depth, ra1, dec1 );
save_ra1 = ra1;
save_dec1 = dec1;
save_depth = depth;
if (test != NULL) {
fprintf( test, "ra1 = %12.8f dec1 = %12.8f\n", ra1, dec1 );
}
}
if ( save_depth != depth || save_ra2 != ra2 || save_dec2 != dec2 || save_radius != radius ) {
htm_list l = get_circle_indices( depth, depth, 1, ra2, dec2, radius );
save_radius = radius;
save_ra2 = ra2;
save_dec2 = dec2;
if ( l.n > size_ids ) {
size_ids = l.n;
ids = (unsigned long long *) realloc( ids, sizeof(unsigned long long) * size_ids );
}
nids = 0;
for ( ; nids < l.n; nids++ ) {
ids[nids] = l.idx[nids];
}
if (test != NULL) {
fprintf( test, "ra2 = %12.8f dec2 = %12.8f\n", ra2, dec2 );
}
}
int k;
int r = 0;
for ( k = 0; k < nids && !r; k++ ) {
if ( save_id == ids[k] ) r = 1;
}
#if 1
if ( r ) {
if ( get_distance( ra1, dec1, ra2, dec2 ) > radius ) r = 0;
}
if (test != NULL) {
fprintf( test, "r = %d\n", r );
fclose( test );
}
#endif
Timing(-3);
return r;
}
extern "C" {
OCITable *RadiusTest( OCIExtProcContext *, int, double, double, double );
};
OCITable *RadiusTest( OCIExtProcContext *ctx, int depth, double ra, double dec, double radius )
{
Timing(4);
setup_OCI( ctx );
OCITable *r = (OCITable *)0;
static OCIType *htm_list_tdo = (OCIType *)0;
htm_list l;
sword q;
if (htm_list_tdo == (OCIType *)0) {
q = OCITypeByName(
envhp,
errhp,
svchp,
(CONST text *)"",
(ub4) strlen(""),
(const text *) "HTM_LIST",
(ub4) strlen((const char *) "HTM_LIST"),
(CONST text *) 0,
(ub4) 0,
OCI_DURATION_SESSION,
OCI_TYPEGET_ALL,
&htm_list_tdo
);
checkerr( errhp, q );
}
q = OCIObjectNew(
envhp,
errhp,
svchp,
OCI_TYPECODE_NAMEDCOLLECTION,
htm_list_tdo,
(dvoid *) 0,
OCI_DURATION_DEFAULT,
TRUE,
(dvoid **) &r
);
checkerr( errhp, q );
Timing(5);
l = get_circle_indices( depth, depth, 1, ra, dec, radius );
Timing(-5);
int i;
for (i = 0; i < l.n; i++) {
unsigned long long id;
OCINumber Dummy;
q = OCINumberFromInt( errhp, &l.idx[i], sizeof(id), OCI_NUMBER_UNSIGNED, &Dummy );
checkerr( errhp, q );
q = OCICollAppend( envhp, errhp, &Dummy, (dvoid *)0, r );
checkerr( errhp, q );
}
Timing(-4);
return r;
}
extern "C" {
int NeighBours( OCIExtProcContext *, OCINumber *, int, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber *, OCINumber * );
};
int NeighBours( OCIExtProcContext *ctx, OCINumber *OCI_id, int depth, OCINumber *h01, OCINumber *h02, OCINumber *h03, OCINumber *h04, OCINumber *h05, OCINumber *h06, OCINumber *h07, OCINumber *h08, OCINumber *h09, OCINumber *h10, OCINumber *h11, OCINumber *h12, OCINumber *h13 )
{
Timing(6);
setup_OCI( ctx );
unsigned long long id;
htm_list l;
sword q;
q = OCINumberToInt( errhp, OCI_id, sizeof(id), OCI_NUMBER_UNSIGNED, &id );
checkerr( errhp, q );
Timing(7);
l = get_nearest_indices( id, depth );
Timing(-7);
if ( l.n != 13) {
return l.n;
}
int r = 13;
q = OCINumberFromInt( errhp, &l.idx[0], sizeof(id), OCI_NUMBER_UNSIGNED, h01 );
q = OCINumberFromInt( errhp, &l.idx[1], sizeof(id), OCI_NUMBER_UNSIGNED, h02 );
q = OCINumberFromInt( errhp, &l.idx[2], sizeof(id), OCI_NUMBER_UNSIGNED, h03 );
q = OCINumberFromInt( errhp, &l.idx[3], sizeof(id), OCI_NUMBER_UNSIGNED, h04 );
q = OCINumberFromInt( errhp, &l.idx[4], sizeof(id), OCI_NUMBER_UNSIGNED, h05 );
q = OCINumberFromInt( errhp, &l.idx[5], sizeof(id), OCI_NUMBER_UNSIGNED, h06 );
q = OCINumberFromInt( errhp, &l.idx[6], sizeof(id), OCI_NUMBER_UNSIGNED, h07 );
q = OCINumberFromInt( errhp, &l.idx[7], sizeof(id), OCI_NUMBER_UNSIGNED, h08 );
q = OCINumberFromInt( errhp, &l.idx[8], sizeof(id), OCI_NUMBER_UNSIGNED, h09 );
q = OCINumberFromInt( errhp, &l.idx[9], sizeof(id), OCI_NUMBER_UNSIGNED, h10 );
q = OCINumberFromInt( errhp, &l.idx[10], sizeof(id), OCI_NUMBER_UNSIGNED, h11 );
q = OCINumberFromInt( errhp, &l.idx[11], sizeof(id), OCI_NUMBER_UNSIGNED, h12 );
q = OCINumberFromInt( errhp, &l.idx[12], sizeof(id), OCI_NUMBER_UNSIGNED, h13 );
Timing(-6);
return r;
}
extern "C" {
OCITable *DummyTest( OCIExtProcContext *, OCINumber *, int );
};
OCITable *DummyTest( OCIExtProcContext *ctx, OCINumber *OCI_id, int depth )
{
Timing( 8 );
setup_OCI( ctx );
OCITable *r = (OCITable *)0;
static OCIType *htm_list_tdo = (OCIType *)0;
unsigned long long id;
sword q;
if (htm_list_tdo == (OCIType *)0) {
q = OCITypeByName(
envhp,
errhp,
svchp,
(CONST text *)"",
(ub4) strlen(""),
(const text *) "HTM_LIST",
(ub4) strlen((const char *) "HTM_LIST"),
(CONST text *) 0,
(ub4) 0,
OCI_DURATION_SESSION,
OCI_TYPEGET_ALL,
&htm_list_tdo
);
checkerr( errhp, q );
}
q = OCIObjectNew(
envhp,
errhp,
svchp,
OCI_TYPECODE_NAMEDCOLLECTION,
htm_list_tdo,
(dvoid *) 0,
OCI_DURATION_DEFAULT,
TRUE,
(dvoid **) &r
);
checkerr( errhp, q );
q = OCINumberToInt( errhp, OCI_id, sizeof(id), OCI_NUMBER_UNSIGNED, &id );
checkerr( errhp, q );
// l = get_nearest_indices( id, depth );
int i;
for (i = 0; i < 13; i++) {
OCINumber Dummy;
unsigned long long idx = id + i;
q = OCINumberFromInt( errhp, &idx, sizeof(idx), OCI_NUMBER_UNSIGNED, &Dummy );
checkerr( errhp, q );
q = OCICollAppend( envhp, errhp, &Dummy, (dvoid *)0, r );
checkerr( errhp, q );
}
Timing( -8 );
return r;
}
extern "C" {
double SecDistance( double, double, double, double );
}
double SecDistance( double ra1, double dec1, double ra2, double dec2 )
{
Timing( 1 );
double r = 3600.0 * get_distance( ra1, dec1, ra2, dec2 );
Timing( -1 );
return r;
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* OCI stuff */
#include <ociextp.h>
extern void checkerr( OCIError *errhp, sword status )
{
text errbuf[512];
ub4 buflen;
sb4 errcode;
if (status == OCI_SUCCESS) return;
switch (status)
{
case OCI_SUCCESS_WITH_INFO: {
fprintf( stderr, "Error - OCI_SUCCESS_WITH_INFO\n" );
break;
}
case OCI_NEED_DATA: {
fprintf( stderr, "Error - OCI_NEED_DATA\n" );
break;
}
case OCI_NO_DATA: {
fprintf( stderr, "Error - OCI_NO_DATA\n" );
break;
}
case OCI_ERROR: {
OCIErrorGet ((dvoid *) errhp, (ub4) 1, (text *) NULL, &errcode,
errbuf, (ub4) sizeof(errbuf), (ub4) OCI_HTYPE_ERROR);
fprintf( stderr, "Error - %s\n", errbuf );
exit(1);
break;
}
case OCI_INVALID_HANDLE: {
fprintf( stderr, "Error - OCI_INVALID_HANDLE\n" );
break;
}
case OCI_STILL_EXECUTING: {
fprintf( stderr, "Error - OCI_STILL_EXECUTE" );
break;
}
case OCI_CONTINUE: {
fprintf( stderr, "Error - OCI_CONTINUE" );
break;
}
default: {
fprintf( stderr, "Error - %d\n", status);
break;
}
}
}
static int setup_count = 0;
extern void Setup_OCI( OCIExtProcContext *ctx, OCIEnv **envhp, OCIError **errhp, OCISvcCtx **svchp )
{
if ( *envhp == (OCIEnv *) 0 || *errhp == (OCIError *) 0 || *svchp == (OCISvcCtx *) 0) {
sword q = OCIExtProcGetEnv( ctx, envhp, svchp, errhp); /* Set up OCI */
checkerr( *errhp, q );
setup_count++;
};
}
extern int setuptest( )
{
return setup_count;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment