summaryrefslogtreecommitdiff
path: root/src/include/xbsql.h
blob: 07ffb7096cd9f7a91b1b696c258d9ed14e3a0221 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*  xbsql.h

XBase64 Software Library

Copyright (c) 1997,2003,2014,2022 Gary A Kunkel

The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.

Email Contact:

    XDB-devel@lists.sourceforge.net
    XDB-users@lists.sourceforge.net

This class manages a list of open tables, open indices are connected to the open tables

*/


#ifndef __XB_XBSQL_H__
#define __XB_XBSQL_H__

#ifdef  CMAKE_COMPILER_IS_GNUCC
#pragma interface
#endif


#ifdef XB_SQL_SUPPORT

namespace xb{


struct XBDLLEXPORT xbSqlFld{
  char     cType;      // F - Database field
                       // L - Literal
                       // E - Expression
  xbInt16  iFldNo;     // Field number if db field
  xbExp *  pExp;       // If cType=E, pointer to parsed expression
  xbString sFldAlias;  // Alias name for query display
  xbSqlFld * Next;     // Next field in list
};

class xbStmt;


struct XBDLLEXPORT xbTblJoin {            //  structure for defining joined tables in the query

  xbString sTableName;
  xbString sAlias;
  xbString sJoinExp;                      // table join expression
  xbDbf    *pDbf;                         // pointer the the dbf structure for this table
  xbTag    *pTag;                         // pointer to relevant tag for this table, null for record order
  xbExp    *pLinkExp;                     // pointer to parsed linkage expression
  char     cJoinType;                     // M - Master
                                          // L - Left   or Full Left
                                          // R - Right  or Full Right
                                          // I - Inner
                                          // O - Outer  or Full Outer Outer

  xbTblJoin *pMaster;                     // pointer to master table, null if this is the primary master
  xbLinkList<xbTblJoin *> llSubList;      // linked list of subordinate tables
//  xbStmt    *pSubQuery;                 // pointer to sub query
  xbTblJoin   *next;                      // next tbl
};


class XBDLLEXPORT xbStmt : public xbSsv{

 public:
  xbStmt( xbXBase *x );
  ~xbStmt();

  #ifdef XB_DEBUG_SUPPORT
  xbInt16 DumpStmtInternals();
  xbInt16 Test();
  #endif

  xbInt16 ExecuteQuery( const xbString &sCmdLine ); 

//  xbInt16 FetchFirst();
//  xbInt16 FetchNext();
//  xbInt16 FetchPrev();
//  xbInt16 FetchLast();
//  xbString &GetField( const xbString sFldName );

 protected:

 private:

  xbInt16  AddQryTbl( const xbString &sTable, const xbString &sAlias, const xbString &sExpression, const char cJoinType );
  xbInt16  CvtSqlExp2DbaseExp( const xbString &sExpIn, xbString &sExpOut );
  xbInt16  GetNextFromSeg( const xbString &sLineIn, xbString &sFromSegOut );
  xbUInt32 GetNextToken( const xbString &sCmdLineIn, xbString &sTokenOut, xbUInt32 ulStartPos );
  xbInt16  GetParenCnt( const xbString &sToken );
  xbInt16  ParseFromStmt( const xbString &sFromLine );
  xbInt16  ParseStmt( const xbString &sCmdLine );
  xbInt16  ProcessFromSeg( const xbString &sFromStmtSeg );
  xbInt16  UpdateJoinList( char cType, const xbString &sTableName, const xbString &sAlias, const xbString &sExp, xbDbf *d, xbExp *e  );   //, xbTag *t);

  xbXBase  *xbase;    // pointer to xbase structure


  xbTblJoin * pTblList;
  xbSqlFld *fl;       // field list in sql select statement
  xbString sStmt;     // complete query statment
  xbString sFields;   // list of fields
  xbString sFrom;     // from statment
  xbString sWhere;    // where clause
  xbString sOrderBy;  // sort order
  xbString sGroupBy;  // group by
  xbString sHaving;   // having
  xbUInt32 ulFromPos;
  xbUInt32 ulWherePos;
  xbUInt32 ulOrderByPos;
  xbUInt32 ulGroupByPos;
  xbUInt32 ulHavingPos;


};


class XBDLLEXPORT xbSql : public xbSsv {
 public:
   // xbSql();
   xbSql( xbXBase *x );
   ~xbSql();

   xbInt16 ExecuteNonQuery( const xbString &sCmdLine );
   xbXBase *GetXbasePtr() const;

 protected:

 private:

   xbInt16  SqlAlterTable( const xbString &sCmdLine );
   xbInt16  SqlCreateTable( const xbString &sCmdLine );
   xbInt16  SqlDelete( const xbString &sCmdLine );
   xbInt16  SqlDropTable( const xbString &sCmdLine );

   #ifdef XB_INDEX_SUPPORT
   xbInt16  SqlCreateIndex( const xbString &sCmdLine );
   xbInt16  SqlDropIndex( const xbString &sCmdLine );
   #endif  // XB_INDEX_SUPPORT

// xbInt16  SqlCreateView( const xbString &sCmdLine );
// xbInt16  SqlDropView( const xbString &sCmdLine );
// xbInt16  SqlUpdate( const xbString &sCmdLine );
// xbInt16  SqlSelect( const xbString &sCmdLine );

   void     SqlHelp() const;
   xbInt16  SqlInsert( const xbString &sCmLine );
   xbInt16  SqlSet( const xbString &sCmdLine );
   xbInt16  SqlUse( const xbString &sCmdLine );

   xbXBase *xbase;
   xbUda   uda;

};

}        /* namespace xb    */
#endif   /* XB_SQL_SUPPORT  */
#endif   /* __XB_XBSQL_H__  */