Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 71 additions & 70 deletions generic/pgtclCmds.c

Large diffs are not rendered by default.

71 changes: 36 additions & 35 deletions generic/pgtclCmds.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#define PGTCLCMDS_H

#include <tcl.h>
#include "pgtclCompat.h"
#include "libpq-fe.h"

extern int pgtclInitEncoding(Tcl_Interp *interp);
Expand All @@ -25,108 +26,108 @@ extern int pgtclInitEncoding(Tcl_Interp *interp);
/* registered Tcl functions */
/* **************************/
extern int Pg_conndefaults(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_connect(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_disconnect(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_exec(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_exec_prepared(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_execute(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_select(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_result(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_open(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_close(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_read(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_write(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_lseek(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_creat(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_tell(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_truncate(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_unlink(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_import(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_lo_export(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_listen(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_sendquery(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_sendquery_prepared(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_getresult(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_set_single_row_mode(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_isbusy(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_blocking(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_null_value_string(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_cancelrequest(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_on_connection_loss(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_quote(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_escapeBytea(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_unescapeBytea(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_dbinfo(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_getdata(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int Pg_sql(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

#endif /* PGTCLCMDS_H */
42 changes: 42 additions & 0 deletions generic/pgtclCompat.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*-------------------------------------------------------------------------
*
* pgtclCompat.h
*
* Small compatibility shim so that pgtcl can be built against both
* Tcl 8.x (8.4 through 8.6) and Tcl 9.0.
*
* Tcl 9.0 made two changes that affect every file in this package:
*
* 1. The ancient "CONST"/"CONST84"/"CONST86" macros (kept around
* since the Tcl 8.0 days for extensions that still needed to
* build against Tcl 7.x/8.0) were removed. Plain "const" has
* been the correct, portable spelling since Tcl 8.4, so pgtcl's
* sources have been updated to just use "const" directly -- no
* fallback is required here.
*
* 2. String/list lengths and element counts that used to be passed
* around as "int" (e.g. the out-parameters of Tcl_GetStringFromObj,
* Tcl_GetByteArrayFromObj, Tcl_ListObjGetElements, Tcl_ListObjLength)
* now use the new "Tcl_Size" type, which is wide enough to hold
* lengths greater than INT_MAX on 64-bit builds. Tcl 8.x does not
* define Tcl_Size at all, so provide a fallback typedef for it.
*
* See https://www.tcl-lang.org/doc/howto/size_t.html for the upstream
* description of this migration.
*
*-------------------------------------------------------------------------
*/

#ifndef PGTCL_COMPAT_H
#define PGTCL_COMPAT_H

#include <tcl.h>

#ifndef TCL_SIZE_MAX
#ifndef Tcl_Size
/* Tcl 8.x without the Tcl_Size backport: all the affected APIs use "int" */
typedef int Tcl_Size;
#endif
#endif

#endif /* PGTCL_COMPAT_H */
12 changes: 6 additions & 6 deletions generic/pgtclId.c
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ PgSetConnectionId(Tcl_Interp *interp, PGconn *conn, char *chandle)
Tcl_Obj *nsstr;
Pg_ConnectionId *connid;
int i;
CONST char *ns = "";
const char *ns = "";

connid = (Pg_ConnectionId *) ckalloc(sizeof(Pg_ConnectionId));
connid->conn = conn;
Expand Down Expand Up @@ -304,7 +304,7 @@ PgSetConnectionId(Tcl_Interp *interp, PGconn *conn, char *chandle)
*----------------------------------------------------------------------
*/
int
PgConnCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
PgConnCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
{
int optIndex;
int objvxi;
Expand Down Expand Up @@ -681,7 +681,7 @@ PgConnCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
*----------------------------------------------------------------------
*/
int
PgResultCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
PgResultCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
{
int objvxi;
Tcl_Obj *objvx[25];
Expand Down Expand Up @@ -972,7 +972,7 @@ getresid(Tcl_Interp *interp, const char *id, Pg_ConnectionId ** connid_p)
int resid;
Pg_ConnectionId *connid;

if (!(mark = strrchr(id, '.')))
if (!(mark = (char *) strrchr(id, '.')))
{
Tcl_SetResult(interp, "Poorly formated result handle", TCL_STATIC);
return -1;
Expand Down Expand Up @@ -1066,7 +1066,7 @@ PgGetConnByResultId(Tcl_Interp *interp, const char *resid_c)
Tcl_Channel conn_chan;
Tcl_Obj *tresult;

if (!(mark = strrchr(resid_c, '.')))
if (!(mark = (char *) strrchr(resid_c, '.')))
goto error_out;
*mark = '\0';
conn_chan = Tcl_GetChannel(interp, resid_c, 0);
Expand Down Expand Up @@ -1581,7 +1581,7 @@ PgDelResultHandle(ClientData cData)

int
Pg_copy_complete(ClientData cData, Tcl_Interp *interp, int objc,
Tcl_Obj *CONST objv[])
Tcl_Obj *const objv[])
{
Pg_ConnectionId *connid;
PGconn *conn;
Expand Down
6 changes: 4 additions & 2 deletions generic/pgtclId.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*-------------------------------------------------------------------------
*/

#include "pgtclCompat.h"

#define RES_HARD_MAX 128
#define RES_START 16

Expand Down Expand Up @@ -120,13 +122,13 @@ extern void PgNotifyTransferEvents(Pg_ConnectionId * connid);
extern void PgConnLossTransferEvents(Pg_ConnectionId * connid);
extern void PgNotifyInterpDelete(ClientData clientData, Tcl_Interp *interp);

extern int PgConnCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
extern int PgConnCmd(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
extern void PgDelCmdHandle(ClientData cData);
extern void PgDelResultHandle(ClientData cData);

extern Tcl_ChannelType Pg_ConnType;

extern int Pg_copy_complete(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

extern int PgCheckConnectionState(Pg_ConnectionId *connid);
25 changes: 13 additions & 12 deletions generic/pgtclSqlite.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include "pgtclCmds.h"
#include "pgtclId.h"
#include "pgtclCompat.h"

#include <sqlite3.h>

Expand Down Expand Up @@ -181,10 +182,10 @@ char *Pg_sqlite_typename(enum mappedTypes type)
// Step through a list and produce an array of the types in the list. Since the list may be a list of types
// or a list of names and types, we take a start index and stride to describe the list.
int
Pg_sqlite_mapTypes(Tcl_Interp *interp, Tcl_Obj *list, int start, int stride, enum mappedTypes **arrayPtr, int *lengthPtr)
Pg_sqlite_mapTypes(Tcl_Interp *interp, Tcl_Obj *list, int start, int stride, enum mappedTypes **arrayPtr, Tcl_Size *lengthPtr)
{
Tcl_Obj **objv;
int objc;
Tcl_Size objc;
enum mappedTypes *array;
int i;
int col;
Expand Down Expand Up @@ -225,10 +226,10 @@ Pg_sqlite_mapTypes(Tcl_Interp *interp, Tcl_Obj *list, int start, int stride, enu
// Step through a list and produce an array of the names in the list. Since the list may be a list of types
// or a list of names and types, we take a stride to describe the list.
int
Pg_sqlite_getNames(Tcl_Interp *interp, Tcl_Obj *list, int stride, char ***arrayPtr, int *lengthPtr)
Pg_sqlite_getNames(Tcl_Interp *interp, Tcl_Obj *list, int stride, char ***arrayPtr, Tcl_Size *lengthPtr)
{
Tcl_Obj **objv;
int objc;
Tcl_Size objc;
char **array;
int i;
int col;
Expand Down Expand Up @@ -331,7 +332,7 @@ int
Pg_sqlite_generateCheck(Tcl_Interp *interp, sqlite3 *sqlite_db, char *tableName, char **columnNames, int nColumns, Tcl_Obj *primaryKey, sqlite3_stmt **statementPtr, int **primaryKeyIndexPtr)
{
Tcl_Obj **keyv;
int keyc;
Tcl_Size keyc;
int *primaryKeyIndex = NULL;
char **primaryKeyNames = NULL;
Tcl_Obj *sql = NULL;
Expand Down Expand Up @@ -567,9 +568,9 @@ Tcl_Obj*
Pg_sqlite_generate(Tcl_Interp *interp, sqlite3 *sqlite_db, char *sqliteTable, Tcl_Obj *nameList, Tcl_Obj *nameTypeList, Tcl_Obj *primaryKey, char *unknownKey, int newTable, int replacing)
{
Tcl_Obj **objv;
int objc;
Tcl_Size objc;
Tcl_Obj **keyv = NULL;
int keyc = 0;
Tcl_Size keyc = 0;
Tcl_Obj *create = NULL;
Tcl_Obj *sql = NULL;
Tcl_Obj *values = NULL;
Expand Down Expand Up @@ -727,7 +728,7 @@ Pg_sqlite_probe(Tcl_Interp *interp, Tcl_ObjCmdProc **procPtr)
char cmd_name[256 + 1];
char create_cmd[256 + 18 + 1];
char delete_cmd[256 + 7 + 1];
struct Tcl_CmdInfo cmd_info;
Tcl_CmdInfo cmd_info;

if (Tcl_Eval(interp, "package require sqlite3") != TCL_OK) {
return TCL_ERROR;
Expand Down Expand Up @@ -890,7 +891,7 @@ Pg_sqlite_split_keyval(Tcl_Interp *interp, char *row, char ***columnsPtr, int nC

int Pg_sqlite_getDB(Tcl_Interp *interp, char *cmdName, sqlite3 **sqlite_dbPtr)
{
struct Tcl_CmdInfo sqlite_commandInfo;
Tcl_CmdInfo sqlite_commandInfo;
Tcl_ObjCmdProc *sqlite3_ObjProc = NULL;
struct SqliteDb *sqlite_clientData;

Expand Down Expand Up @@ -918,7 +919,7 @@ int Pg_sqlite_getDB(Tcl_Interp *interp, char *cmdName, sqlite3 **sqlite_dbPtr)

// Main routine, extract the sqlite handle, parse the ensemble command, and run the subcommand.
int
Pg_sqlite(ClientData clientdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
Pg_sqlite(ClientData clientdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[])
{
sqlite3 *sqlite_db;
int cmdIndex;
Expand Down Expand Up @@ -984,7 +985,7 @@ Pg_sqlite(ClientData clientdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST ob
const char *errorMessage = NULL;
enum mappedTypes *columnTypes = NULL;
char **columnNames = NULL;
int nColumns = 0;
Tcl_Size nColumns = 0;
int column;
ExecStatusType status;
char *tabsepFile = NULL;
Expand Down Expand Up @@ -1532,7 +1533,7 @@ Pg_sqlite(ClientData clientdata, Tcl_Interp *interp, int objc, Tcl_Obj *CONST ob

while(row) {
if(cmdIndex == CMD_READ_KEYVAL) {
int len;
Tcl_Size len;
if (Pg_sqlite_split_keyval(interp, row, &columns, nColumns, sepString, columnNames, unknownObj) != TCL_OK) {
returnCode = TCL_ERROR;
break;
Expand Down
3 changes: 2 additions & 1 deletion generic/pgtclSqlite.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
#define PGTCLSQLITE_H

#include <tcl.h>
#include "pgtclCompat.h"
extern int Pg_sqlite(
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);

#endif
Loading