summaryrefslogtreecommitdiff
path: root/storage/connect/tabrest.cpp
blob: e800411a36d996171216409ec9a2c25fe4d9e4dd (plain)
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
/*************** Rest C++ Program Source Code File (.CPP) **************/
/* PROGRAM NAME: Rest   Version 1.3                                    */
/*  (C) Copyright to the author Olivier BERTRAND          2018 - 2019  */
/*  This program is the REST OEM (Web API support) module definition.  */
/***********************************************************************/

/***********************************************************************/
/*  Definitions needed by the included files.                          */
/***********************************************************************/
#include <my_global.h> // All MariaDB stuff

/***********************************************************************/
/*  Include application header files:                                  */
/*  global.h    is header containing all global declarations.          */
/*  plgdbsem.h  is header containing the DB application declarations.  */
/*  (x)table.h  is header containing the TDBASE declarations.          */
/***********************************************************************/
#include "global.h"
#include "plgdbsem.h"
#include "xtable.h"
#include "filamtxt.h"
#include "plgxml.h"
#include "tabdos.h"
#include "tabfmt.h"
#include "tabjson.h"
#include "tabrest.h"
#include "tabxml.h"

/***********************************************************************/
/*  Get the file from the Web.                                         */
/***********************************************************************/
int restGetFile(PGLOBAL g, PCSZ http, PCSZ uri, PCSZ fn);

#if defined(__WIN__)
static PCSZ slash= "\\";
#else // !__WIN__
static PCSZ slash= "/";
#define stricmp strcasecmp
#endif // !__WIN__

/***********************************************************************/
/*  Return the columns definition to MariaDB.                          */
/***********************************************************************/
PQRYRES RESTColumns(PGLOBAL g, PTOS tp, char *tab, char *db, bool info)
{
  PQRYRES qrp= NULL;
  char filename[_MAX_PATH];
  PCSZ http, uri, fn, ftype;

  http= GetStringTableOption(g, tp, "Http", NULL);
  uri= GetStringTableOption(g, tp, "Uri", NULL);
  fn= GetStringTableOption(g, tp, "Filename", "rest.json");
	ftype = GetStringTableOption(g, tp, "Type", "JSON");

  //  We used the file name relative to recorded datapath
  strcat(strcat(strcat(strcpy(filename, "."), slash), db), slash);
  strncat(filename, fn, _MAX_PATH);

  // Retrieve the file from the web and copy it locally
  if (http && restGetFile(g, http, uri, filename)) {
    // sprintf(g->Message, "Failed to get file at %s", http);
  } else if (!stricmp(ftype, "XML"))
    qrp= XMLColumns(g, db, tab, tp, info);
  else if (!stricmp(ftype, "JSON"))
    qrp= JSONColumns(g, db, NULL, tp, info);
  else if (!stricmp(ftype, "CSV"))
    qrp= CSVColumns(g, NULL, tp, info);
  else
    sprintf(g->Message, "Usupported file type %s", ftype);

  return qrp;
} // end of RESTColumns

/* -------------------------- Class RESTDEF -------------------------- */

/***********************************************************************/
/*  DefineAM: define specific AM block values.                         */
/***********************************************************************/
bool RESTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
{
  char    filename[_MAX_PATH];
	TABTYPE type= GetTypeID(am);

	switch (type) {
	case TAB_JSON:
	case TAB_XML:
	case TAB_CSV:
		break;
	default:
		sprintf(g->Message, "Unsupported REST table type %s", am);
		return true;
	} // endswitch type

  Http= GetStringCatInfo(g, "Http", NULL);
  Uri= GetStringCatInfo(g, "Uri", NULL);
  Fn= GetStringCatInfo(g, "Filename", "rest.json");

  //  We used the file name relative to recorded datapath
  PlugSetPath(filename, Fn, GetPath());

  // Retrieve the file from the web and copy it locally
  if (Http && restGetFile(g, Http, Uri, filename)) {}
  else if (type == TAB_JSON)
    Tdp= new (g) JSONDEF;
  else if (type == TAB_XML)
    Tdp= new (g) XMLDEF;
  else if (type == TAB_CSV)
    Tdp= new (g) CSVDEF;
  else
    sprintf(g->Message, "Unsupported REST table type %s", am);

  // Do make the table/view definition
  if (Tdp && Tdp->Define(g, Cat, Name, Schema, "REST"))
    Tdp= NULL; // Error occured

  // Return true in case of error
  return (Tdp == NULL);
} // end of DefineAM

/***********************************************************************/
/*  GetTable: makes a new Table Description Block.                     */
/***********************************************************************/
PTDB RESTDEF::GetTable(PGLOBAL g, MODE m)
{
	if (m != MODE_READ && m != MODE_READX) {
		strcpy(g->Message, "REST tables are currently read only");
		return NULL;
	} // endif m

  return Tdp->GetTable(g, m); // Leave file type do the job
} // end of GetTable

/* ---------------------- End of Class RESTDEF ----------------------- */