| /* |
| ** 2001 September 15 |
| ** |
| ** The author disclaims copyright to this source code. In place of |
| ** a legal notice, here is a blessing: |
| ** |
| ** May you do good and not evil. |
| ** May you find forgiveness for yourself and forgive others. |
| ** May you share freely, never taking more than you give. |
| ** |
| ************************************************************************* |
| ** Header file for the Virtual DataBase Engine (VDBE) |
| ** |
| ** This header defines the interface to the virtual database engine |
| ** or VDBE. The VDBE implements an abstract machine that runs a |
| ** simple program to access and modify the underlying database. |
| ** |
| ** $Id: vdbe.h,v 1.71 2004/02/22 20:05:02 drh Exp $ |
| */ |
| #ifndef _SQLITE_VDBE_H_ |
| #define _SQLITE_VDBE_H_ |
| #include <stdio.h> |
| |
| /* |
| ** A single VDBE is an opaque structure named "Vdbe". Only routines |
| ** in the source file sqliteVdbe.c are allowed to see the insides |
| ** of this structure. |
| */ |
| typedef struct Vdbe Vdbe; |
| |
| /* |
| ** A single instruction of the virtual machine has an opcode |
| ** and as many as three operands. The instruction is recorded |
| ** as an instance of the following structure: |
| */ |
| struct VdbeOp { |
| u8 opcode; /* What operation to perform */ |
| int p1; /* First operand */ |
| int p2; /* Second parameter (often the jump destination) */ |
| char *p3; /* Third parameter */ |
| int p3type; /* P3_STATIC, P3_DYNAMIC or P3_POINTER */ |
| #ifdef VDBE_PROFILE |
| int cnt; /* Number of times this instruction was executed */ |
| long long cycles; /* Total time spend executing this instruction */ |
| #endif |
| }; |
| typedef struct VdbeOp VdbeOp; |
| |
| /* |
| ** A smaller version of VdbeOp used for the VdbeAddOpList() function because |
| ** it takes up less space. |
| */ |
| struct VdbeOpList { |
| u8 opcode; /* What operation to perform */ |
| signed char p1; /* First operand */ |
| short int p2; /* Second parameter (often the jump destination) */ |
| char *p3; /* Third parameter */ |
| }; |
| typedef struct VdbeOpList VdbeOpList; |
| |
| /* |
| ** Allowed values of VdbeOp.p3type |
| */ |
| #define P3_NOTUSED 0 /* The P3 parameter is not used */ |
| #define P3_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ |
| #define P3_STATIC (-2) /* Pointer to a static string */ |
| #define P3_POINTER (-3) /* P3 is a pointer to some structure or object */ |
| |
| /* |
| ** The following macro converts a relative address in the p2 field |
| ** of a VdbeOp structure into a negative number so that |
| ** sqliteVdbeAddOpList() knows that the address is relative. Calling |
| ** the macro again restores the address. |
| */ |
| #define ADDR(X) (-1-(X)) |
| |
| /* |
| ** The makefile scans the vdbe.c source file and creates the "opcodes.h" |
| ** header file that defines a number for each opcode used by the VDBE. |
| */ |
| #include "opcodes.h" |
| |
| /* |
| ** Prototypes for the VDBE interface. See comments on the implementation |
| ** for a description of what each of these routines does. |
| */ |
| Vdbe *sqliteVdbeCreate(sqlite*); |
| void sqliteVdbeCreateCallback(Vdbe*, int*); |
| int sqliteVdbeAddOp(Vdbe*,int,int,int); |
| int sqliteVdbeOp3(Vdbe*,int,int,int,const char *zP3,int); |
| int sqliteVdbeCode(Vdbe*,...); |
| int sqliteVdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp); |
| void sqliteVdbeChangeP1(Vdbe*, int addr, int P1); |
| void sqliteVdbeChangeP2(Vdbe*, int addr, int P2); |
| void sqliteVdbeChangeP3(Vdbe*, int addr, const char *zP1, int N); |
| void sqliteVdbeDequoteP3(Vdbe*, int addr); |
| int sqliteVdbeFindOp(Vdbe*, int, int); |
| VdbeOp *sqliteVdbeGetOp(Vdbe*, int); |
| int sqliteVdbeMakeLabel(Vdbe*); |
| void sqliteVdbeDelete(Vdbe*); |
| void sqliteVdbeMakeReady(Vdbe*,int,int); |
| int sqliteVdbeExec(Vdbe*); |
| int sqliteVdbeList(Vdbe*); |
| int sqliteVdbeFinalize(Vdbe*,char**); |
| void sqliteVdbeResolveLabel(Vdbe*, int); |
| int sqliteVdbeCurrentAddr(Vdbe*); |
| void sqliteVdbeTrace(Vdbe*,FILE*); |
| void sqliteVdbeCompressSpace(Vdbe*,int); |
| int sqliteVdbeReset(Vdbe*,char **); |
| int sqliteVdbeSetVariables(Vdbe*,int,const char**); |
| |
| #endif |