Пример #1
0
int
dbtcp_createconn(ClipMachine * cm)
{
   char     *host = _clip_parc(cm, 2);

   char     *portstr = _clip_parc(cm, 3);

   char     *user = _clip_parc(cm, 4);

   char     *passwd = _clip_parc(cm, 5);

   char     *db = _clip_parc(cm, 6);

   char     *sqlcs = _clip_parc(cm, 9);

  /* char *trpars    = _clip_parc(cm,10); */
   char      buf[256];

   unsigned int port = portstr ? atoi(portstr) : 0;

   DBTCP_CONN *conn = NULL;

   dbftp_result *tmpconn = NULL;

   if (!host)
      host = "";
   if (!db)
      db = "";
   if (!user)
      user = "";
   if (!passwd)
      passwd = "";
   if (!port)
      port = 3000;

   snprintf(buf, sizeof(buf), "DSN=%s;UID=%s;PWD=%s;", db, user, passwd);

   if (!(tmpconn = init_dbftp_result()))
      goto err;

   if (dbftp_connect(tmpconn, host, port, buf) != OK)
      goto err;

   conn = calloc(1, sizeof(DBTCP_CONN));
   conn->conn = tmpconn;
   conn->vtbl = &vtbl;

   return _clip_store_c_item(cm, (void *) conn, _C_ITEM_TYPE_SQL, destroy_dbtcp_conn);
 err:
   dbtcp_error(cm, SQL_get_locale(cm, sqlcs), ER_CONNECT, tmpconn, er_connect);
   if (tmpconn)
      free_dbftp_result(tmpconn);
   if (conn)
      free(conn);
   return -1;
}
Пример #2
0
int dbtcp_createrowset(ClipMachine* cm,SQLROWSET* rs,ClipVar* ap,ClipVar* idname,const char* gen_idSQL){
	DBTCP_ROWSET* rowset = (DBTCP_ROWSET*)rs;
	DBTCP_STMT* stmt = rowset->stmt;
	DBTCP_CONN* conn = rowset->conn;
	int i;

	dbtcp_bindpars(stmt,ap);
	rowset->rowset_item =
		_clip_store_c_item(cm,rowset,_C_ITEM_TYPE_SQL,destroy_dbtcp_rowset);

	if(dbftp_sql(conn->conn,stmt->sql) != OK) goto err;
	rowset->nfields = dbftp_num_field(conn->conn);
	if(!rowset->nfields){
		dbtcp_error(cm,conn->loc,ER_NOSQL,NULL,er_nosql);
		return 1;
	}

	rowset->unknownrows = 1;
	rowset->lastrec = 0;
	rowset->fields = calloc(1,rowset->nfields * sizeof(SQLFIELD));
	if(dbftp_fetch_fields(conn->conn) != OK) goto err;
	for(i=0;i<rowset->nfields;i++){
		strncpy(rowset->fields[i].name,dbftp_field_name(conn->conn,i),MAXFIELDNAME);
		rowset->fields[i].name[MAXFIELDNAME] = 0;
		rowset->fields[i].type = dbftp_field_type(conn->conn,i);
		rowset->fields[i].ctype[0] = _dbtcp_ctype(rowset->fields[i].type);
		rowset->fields[i].len = dbftp_field_len(conn->conn,i);
		rowset->fields[i].ops = 0;

		if(idname->t.type == CHARACTER_t){
			if(idname->s.str.buf && !strcasecmp(rowset->fields[i].name,idname->s.str.buf)){
				rowset->id = i;
				rowset->nids = 1;
			}
		} else if(idname->t.type == ARRAY_t){
			int j;
			for(j=0;j<idname->a.count;j++){
				ClipVar* vp = idname->a.items+j;
				if(vp->t.type == CHARACTER_t && vp->s.str.buf
					&& !strcasecmp(rowset->fields[i].name,vp->s.str.buf)){

					rowset->nids++;
					rowset->ids = realloc(rowset->ids,rowset->nids*sizeof(int));
					rowset->ids[rowset->nids-1] = i;
				}
			}
		}
	}
	rowset->data = calloc(rowset->lastrec,sizeof(void*));
	return 0;
err:
	if(rowset->fields)
		free(rowset->fields);
	dbtcp_error(cm,conn->loc,ER_BADSTATEMENT,conn->conn,NULL);
	return 1;
}
Пример #3
0
int
rdd_ii_create(ClipMachine * ClipMachineMemory, const char *driver, const char *name, const char *__PROC__)
{
   RDD_INDEX *ri = NULL;

   int er = EG_UNSUPPORTED;

   ri = (RDD_INDEX *) calloc(1, sizeof(RDD_INDEX));

   memset(ri, 0, sizeof(RDD_INDEX));
   if (!(ri->vtbl = rdd_indexdriver(ClipMachineMemory, driver, __PROC__)))
      goto err;

   if ((er = _rdd_parsepath(ClipMachineMemory, name, ri->vtbl->suff, &ri->path, &ri->name, EG_CREATE, __PROC__)))
      goto err;

   ri->file.filehash = _clip_hashstr(ri->path);

   ri->file.fd = _clip_creat(ClipMachineMemory, ri->path, O_RDWR, ClipMachineMemory->fileCreateMode, 1);
   if (ri->file.fd == -1)
      goto err_create;
   ri->file.mapsize = 1024;
   if (lseek(ri->file.fd, ri->file.mapsize - 1, SEEK_SET) == -1)
      goto err_create;
   if (write(ri->file.fd, "", 1) == -1)
      goto err_create;
   ri->file.md = (caddr_t) - 1;
#ifdef HAVE_MMAN_H
   if (ClipMachineMemory->flags1 & MAP_FILE_FLAG)
      ri->file.md = (caddr_t) mmap(0, ri->file.mapsize, PROT_READ | PROT_WRITE, MAP_SHARED, ri->file.fd, 0);
#endif
   if ((er = ri->vtbl->ii_create(ClipMachineMemory, ri, __PROC__)))
      goto err;

   _clip_retni(ClipMachineMemory, _clip_store_c_item(ClipMachineMemory, ri, _C_ITEM_TYPE_I_INDEX, destroy_rdd_index));
   return 0;
 err_create:
   er = rdd_err(ClipMachineMemory, EG_CREATE, errno, __FILE__, __LINE__, __PROC__, ri->path);
 err:
   if (ri && ri->name)
      free(ri->name);
   if (ri && ri->path)
      free(ri->path);
#ifdef HAVE_MMAN_H
   if (ri && ri->file.md != (char *) -1)
      munmap(ri->file.md, ri->file.mapsize);
#endif
   if (ri && ri->file.fd != -1)
      _clip_close(ClipMachineMemory, ri->file.filehash, ri->file.fd);
   if (ri)
      free(ri);
   return er;
}
Пример #4
0
int dbtcp_prepare(ClipMachine* cm,SQLCONN* c,char* sql){
	DBTCP_CONN* conn = (DBTCP_CONN*)c;
	DBTCP_STMT* stmt;

	stmt = calloc(1,sizeof(DBTCP_STMT));
	stmt->stmt_item =
		_clip_store_c_item(cm,stmt,_C_ITEM_TYPE_SQL,destroy_dbtcp_stmt);

	stmt->sql = strdup(sql);
	stmt->conn = conn;

	return stmt->stmt_item;
}
Пример #5
0
int ms_createrowset(ClipMachine* mp,SQLROWSET* rs,ClipVar* ap,ClipVar* idname,const char* gen_idSQL){
	MS_ROWSET* rowset = (MS_ROWSET*)rs;
	MS_STMT* stmt = rowset->stmt;
	MS_CONN* conn = rowset->conn;
	int i;
	int status;
	MYSQL_FIELD *fields;

	ms_bindpars(stmt,ap);
	rowset->rowset_item =
		_clip_store_c_item(mp,rowset,_C_ITEM_TYPE_SQL,destroy_ms_rowset);

	if(!stmt->sql){
		_clip_trap_err(mp, 0, 0, 0, subsys, ER_NOSQL, er_nosql);
		return 1;
	}

	status = mysql_query(conn->conn,stmt->sql);
	if(status){
		_clip_trap_err(mp,0,0,0,subsys,ER_BADSTATEMENT,mysql_error(conn->conn));
		return 1;
	}
	stmt->res = mysql_use_result(conn->conn);
	rowset->unknownrows = 1;
	rowset->lastrec = mysql_num_rows(stmt->res);
	rowset->nfields = mysql_field_count(conn->conn);
	if(!rowset->nfields){
		_clip_trap_err(mp,0,0,0,subsys,ER_BADSELECT,mysql_error(conn->conn));
		return 1;
	}
	rowset->fields = calloc(1,rowset->nfields * sizeof(SQLFIELD));
	fields = mysql_fetch_fields(stmt->res);
	for(i=0;i<rowset->nfields;i++){
		strncpy(rowset->fields[i].name, fields[i].name, MAXFIELDNAME);
		rowset->fields[i].name[MAXFIELDNAME] = 0;
		rowset->fields[i].type = fields[i].type;
		rowset->fields[i].ctype[0] = _ms_ctype(rowset->fields[i].type);
		rowset->fields[i].len = fields[i].length;
		rowset->fields[i].dec = fields[i].decimals;
		rowset->fields[i].ops = 0;
		rowset->fields[i].unsign = fields[i].flags & UNSIGNED_FLAG;
		rowset->fields[i].notnull = fields[i].flags & NOT_NULL_FLAG;
		rowset->fields[i].binary = fields[i].flags & BINARY_FLAG;
		if (fields[i].flags & AUTO_INCREMENT_FLAG)
		{
			rowset->id = i;
		}
	}
	rowset->data = calloc(rowset->lastrec,sizeof(void*));
	return 0;
}
Пример #6
0
/*
COM_OPEN(nPort|cDevice,[dontused],[dontused],[dontused],l_RTSCTS,l_XONXOFF,lDebug)
*/
int
clip_COM_OPEN(ClipMachine * mp)
{
	int no = _clip_parni(mp, 1);
	char *dev = _clip_parc(mp, 1);
	char buf[V24_SZ_PORTNAME+1];
	int ctsrts = _clip_parl(mp, 5);
	int xonxoff = _clip_parl(mp, 6);
	int dbg = _clip_parl(mp, 7);
	v24_port_t *gz;
	int *err, k;

	if (!_clip_parinfo(mp, 5) && !!_clip_parinfo(mp, 5))
		ctsrts = 1;

	if (!dev && (no < 1 || no > 32))
		return EG_ARG;

	if (!dev)
	{
		v24PortName(no - 1, buf);
		dev = buf;
	}

	gz = v24OpenPort(dev,
			 V24_STANDARD
			 | V24_LOCK
			 /*| V24_NO_DELAY*/
			 | (ctsrts ? V24_RTS_CTS : 0)
			 | (xonxoff ? V24_XON_XOFF : 0)
			 | V24_DROP_DTR
			 | (dbg ? V24_DEBUG_ON : 0)
			 );

	if (!gz)
	{
		err = _clip_fetch_item(mp, HASH_ferror);
		*err = errno;
		_clip_retl(mp, 0);
		return 0;
	}

	k = _clip_store_c_item(mp, gz, _C_ITEM_TYPE_COMPORT, destroy_com_port);

	keys[no] = k;

	_clip_retl(mp, 1);

	return 0;
}
Пример #7
0
int pg_prepare(ClipMachine* mp,SQLCONN* conn,char* sql){
	PG_STMT* stmt;

	stmt = malloc(sizeof(PG_STMT));
	memset(stmt,0,sizeof(PG_STMT));
	stmt->stmt_item =
		_clip_store_c_item(mp,stmt,_C_ITEM_TYPE_SQL,destroy_pg_stmt);

	stmt->sql = malloc(strlen(sql)+1);
	strcpy(stmt->sql,sql);

	stmt->conn = (PG_CONN*)conn;

	return stmt->stmt_item;
}
Пример #8
0
int pg_createconn(ClipMachine* mp){
	char* pghost	= _clip_parc(mp,2);
	char* pgport	= _clip_parc(mp,3);
	char* login		= _clip_parc(mp,4);
	char* pwd		= _clip_parc(mp,5);
	char* dbName	= _clip_parc(mp,6);
	char* pgtty		= _clip_parc(mp,7);
	char* pgoptions = _clip_parc(mp,8);
	char* trpars	= _clip_parc(mp,10);
	PGconn* tmpconn;
	PGresult* res;
	PG_CONN* conn;
	char str[256];

	tmpconn = PQsetdbLogin(pghost,pgport,pgoptions,pgtty,dbName,login,pwd);
	if(PQstatus(tmpconn)!=CONNECTION_OK){
		_clip_trap_err(mp,0,0,0,subsys,ER_CONNECT,PQerrorMessage(tmpconn));
		return -1;
	}
	conn = malloc(sizeof(PG_CONN));
	memset(conn,0,sizeof(PG_CONN));
	conn->conn = tmpconn;
	conn->vtbl = &vtbl;
	res = PQexec(tmpconn,"SET DATESTYLE='ISO'");
	if(PQresultStatus(res) != PGRES_COMMAND_OK){
		_clip_trap_err(mp,0,0,0,subsys,ER_BADSTATEMENT,
			PQresultErrorMessage(res));
		return -1;
	}

	if(!trpars)
		trpars = _clip_fetch_item(mp, _clip_hashstr("PG_ISOLATION_LEVEL"));
	if(!trpars)
		trpars = _clip_fetch_item(mp, _clip_hashstr("SQL_ISOLATION_LEVEL"));
	if(trpars){
		snprintf(str,sizeof(str),"set session characteristics as transaction isolation level %s",trpars);
		res = PQexec(tmpconn,str);
		if(PQresultStatus(res) != PGRES_COMMAND_OK){
			_clip_trap_err(mp,0,0,0,subsys,ER_BADSTATEMENT,
				PQresultErrorMessage(res));
			return -1;
		}
	}

	PQsetNoticeProcessor(tmpconn, notice_processor, NULL);

	return _clip_store_c_item(mp,(void*)conn,_C_ITEM_TYPE_SQL,destroy_pg_conn);
}
Пример #9
0
int odbc_prepare(ClipMachine* cm,SQLCONN* c,char* sql){
	ODBC_CONN* conn = (ODBC_CONN*)c;
	ODBC_STMT* stmt;

	if(!sql)
		sql = "";
	stmt = calloc(sizeof(ODBC_STMT),1);
	memset(stmt,0,sizeof(ODBC_STMT));
	stmt->stmt_item =
		_clip_store_c_item(cm,stmt,_C_ITEM_TYPE_SQL,destroy_odbc_stmt);

	stmt->sql = strdup(sql);

	stmt->conn = conn;

	return stmt->stmt_item;
}
Пример #10
0
int
ms_createconn(ClipMachine * mp)
{
	char *host = _clip_parc(mp, 2);
	char *portstr = _clip_parc(mp, 3);
	char *user = _clip_parc(mp, 4);
	char *passwd = _clip_parc(mp, 5);
	char *db = _clip_parc(mp, 6);
	char *socket = _clip_parc(mp, 7);
	char *flagstr = _clip_parc(mp, 8);
	char *trpars = _clip_parc(mp, 10);
	unsigned int port = portstr ? atoi(portstr) : 0;
	unsigned int flag = flagstr ? atoi(flagstr) : 0;
	MS_CONN *conn;
	MYSQL *tmpconn;
	char str[256];
	int status;

	tmpconn = mysql_init(NULL);
	tmpconn = mysql_real_connect(tmpconn, host, user, passwd, db, port, socket, flag);
	if (!tmpconn)
	{
		_clip_trap_err(mp, 0, 0, 0, subsys, ER_CONNECT, er_connect);
		return -1;
	}

	conn = calloc(1,sizeof(MS_CONN));
	conn->conn = tmpconn;
	conn->vtbl = &vtbl;

	if(!trpars)
		trpars = _clip_fetch_item(mp, _clip_hashstr("MS_ISOLATION_LEVEL"));
	if(!trpars)
		trpars = _clip_fetch_item(mp, _clip_hashstr("SQL_ISOLATION_LEVEL"));
	if(trpars){
		snprintf(str,sizeof(str),"set session transaction isolation level %s",trpars);
		status = mysql_query(conn->conn,str);
		if(status){
			_clip_trap_err(mp,0,0,0,subsys,ER_BADSTATEMENT,mysql_error(conn->conn));
			mysql_close(conn->conn);
			return -1;
		}
	}

	return _clip_store_c_item(mp, (void *) conn, _C_ITEM_TYPE_SQL, destroy_ms_conn);
}
Пример #11
0
int
rdd_ii_opentag(ClipMachine * ClipMachineMemory, int h, const char *tag, const char *__PROC__)
{
   RDD_INDEX *ri = (RDD_INDEX *) _clip_fetch_c_item(ClipMachineMemory, h, _C_ITEM_TYPE_I_INDEX);

   RDD_ORDER *ro;

   int er;

   CHECKII(ri);

   if ((er = ri->vtbl->ii_opentag(ClipMachineMemory, ri, tag, &ro, __PROC__)))
      return er;

   ro->c_item = _clip_store_c_item(ClipMachineMemory, ro, _C_ITEM_TYPE_I_ORDER, destroy_rdd_i_order);
   _clip_retni(ClipMachineMemory, ro->c_item);
   return 0;
}
Пример #12
0
CLIP_DLLEXPORT C_object *
_register_object(ClipMachine * cm, void * data, long clip_type, ClipVar * cv, coDestructor fDestroy)
{
	int handle = -1;
	C_object * cobj = (C_object*)calloc(1,sizeof(C_object));
	WTypeTable *wt_item;
	long clip_wtype = GTK_WIDGET_UNKNOWN;

	cobj->object = data;
	cobj->objtype = GTK_OBJ_OBJECT;
	cobj->cmachine = cm;
	cobj->type = clip_type;
	cobj->destroy = fDestroy;

	/* alena add signals to object */
	cobj->sigenabled = TRUE;
	cobj->usersigenabled = TRUE;
	cobj->evntenabled = TRUE;

	wt_item = _wtype_table_get(cobj->type);
	if (wt_item && wt_item->fclip_type) clip_wtype = wt_item->fclip_type();
	if (wt_item && wt_item->ftype_name) cobj->type_name = wt_item->ftype_name();
	if (cv && cv->t.type == MAP_t)
		//_clip_mclone(cm, &cobj->obj, cv);
		cobj->obj = *cv;
	else
		_clip_map(cm, &cobj->obj);

	/* Saving widget info into CLIP state machine
	 * and it`s handle to a map HANDLE property */
	handle = _clip_store_c_item(cm, cobj, _C_ITEM_TYPE_WIDGET, NULL);
	cobj->handle = handle;
	_clip_mputn(cm, &cobj->obj, HASH_HANDLE, handle);
	_clip_mputn(cm, &cobj->obj, HASH_TYPE, clip_wtype);
	/* Store C_object pointer in list of widgets */
	_list_put_cobject(cm, data, cobj);
  	if (data && clip_type != GDK_TYPE_ATOM && clip_type != GTK_TYPE_TREE_ITER && clip_type != GTK_TYPE_TREE_PATH && clip_type != GTK_TYPE_SELECTION_DATA)

  		if (G_IS_OBJECT(data)) g_object_set_data_full(G_OBJECT(data),"destructor",cobj,
			(GDestroyNotify)object_destructor);
	return cobj;
}
Пример #13
0
CLIP_DLLEXPORT C_widget *
_register_widget(ClipMachine * cm, GtkWidget * wid, ClipVar * cv)
{
	int handle = -1;
	C_widget * cwid = (C_widget*)calloc(1,sizeof(C_widget));
	WTypeTable *wt_item;
	long clip_wtype = GTK_WIDGET_UNKNOWN;
	cwid->widget = wid;
	cwid->objtype = GTK_OBJ_WIDGET;
	cwid->cmachine = cm;

	cwid->type = wid ? GTK_WIDGET_TYPE(wid) : GTK_TYPE_INVALID;
	wt_item = _wtype_table_get(cwid->type);
	if (wt_item && wt_item->fclip_type) clip_wtype = wt_item->fclip_type();
	if (wt_item && wt_item->ftype_name) cwid->type_name = wt_item->ftype_name();

	cwid->sigenabled = TRUE;
	cwid->usersigenabled = TRUE;
	cwid->evntenabled = TRUE;
	cwid->destroy = NULL;

	if (cv && cv->t.type == MAP_t)
		//_clip_mclone(cm, &cwid->obj, cv);
		cwid->obj = *cv;
	else
		_clip_map(cm, &cwid->obj);
	/* Saving widget info into CLIP state machine
	 * and it`s handle to a map HANDLE property */
	handle = _clip_store_c_item(cm, cwid, _C_ITEM_TYPE_WIDGET, NULL);
	cwid->handle = handle;
	_clip_mputn(cm, &cwid->obj, HASH_HANDLE, handle);
	_clip_mputn(cm, &cwid->obj, HASH_TYPE, clip_wtype);
	/* Store C_widget pointer in list of widgets */
	_list_put_cwidget(cm, wid, cwid);
	//if (wid && GTK_IS_OBJECT(wid))
	if (wid && GTK_IS_WIDGET(wid))
		g_object_set_data_full(G_OBJECT(wid),"destructor",cwid,
			(GDestroyNotify)widget_destructor);
	return cwid;
}
Пример #14
0
int
odbc_createconn(ClipMachine * cm)
{
	int dbl,userl,passwdl;
	char* db = _clip_parcl(cm,2,&dbl);
	char* user = _clip_parcl(cm,3,&userl);
	char* passwd = _clip_parcl(cm,4,&passwdl);
	ODBC_CONN *conn = NULL;
	SQLHDBC tmpconn;
	SQLRETURN er;
	SQLHENV henv;
	char dbms[30];

	if(!user)
		userl = 0;
	if(!passwd)
		passwdl = 0;

	if((er = SQLAllocEnv(&henv))) goto err;
	if((er = SQLAllocConnect(henv,&tmpconn))) goto err;
	if((er = SQLConnect(tmpconn,db,dbl,user,userl,passwd,passwdl))) goto err;
	/* silly PostgreSQL's ODBC driver */
	if((er = SQLGetInfo(tmpconn,SQL_DBMS_NAME,dbms,sizeof(dbms),0)))
		goto err;

	conn = calloc(sizeof(ODBC_CONN),1);
	conn->conn = tmpconn;
	conn->vtbl = &vtbl;
	conn->henv = henv;
	if(strcmp(dbms,"PostgreSQL")==0)
		conn->postgres = 1;

	return _clip_store_c_item(cm, (void *) conn, _C_ITEM_TYPE_SQL, destroy_odbc_conn);
err:
	odbc_error(cm,(conn?conn->loc:0),henv,tmpconn,0,__LINE__,er_connect);
	if(conn)
		free(conn);
	return -1;
}
Пример #15
0
int
clip_UDPSOCKET(ClipMachine *mp)
{
	C_FILE *cf = NULL;
	int arg = 0, sock = -1, ret = -1;
	int *err = _clip_fetch_item(mp, HASH_ferror);

	*err=0;
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
		goto err;

#ifndef OS_MINGW
	if ((arg = fcntl(sock, F_GETFL, 0)) == -1)
		goto err;
	fcntl(sock, F_SETFL, arg | O_NONBLOCK);
#endif

	cf = calloc(1, sizeof(C_FILE));
	cf->fileno = sock;
	cf->f = NULL;
	cf->type = FT_SOCKET;
	cf->pid = -1;
	cf->timeout = 60000;
	cf->stat = 0; /* see FS_* flags */
	ret = _clip_store_c_item(mp, cf, _C_ITEM_TYPE_FILE, destroy_c_file);

	err:
	if (ret == -1)
	{
		if ( *err != 0 )
			*err = errno;
		if (sock != -1)
			close(sock);
	}
	_clip_retni(mp, ret);

	return 0;
}
Пример #16
0
int
clip_HS_CREATE(ClipMachine * ClipMachineMemory)
{
   const char *__PROC__ = "HS_CREATE";

   const char *fname = _clip_parc(ClipMachineMemory, 1);

   int pagesize = _clip_parni(ClipMachineMemory, 2) * 1024;

   int lcase = _clip_parl(ClipMachineMemory, 4);

   int filtset = _clip_parni(ClipMachineMemory, 5);

   HIPER *hs;

   int er;

   CHECKARG1(1, CHARACTER_type_of_ClipVarType);
   CHECKOPT1(2, NUMERIC_type_of_ClipVarType);
   CHECKOPT1(4, LOGICAL_type_of_ClipVarType);
   CHECKOPT1(5, NUMERIC_type_of_ClipVarType);

   if (_clip_parinfo(ClipMachineMemory, 2) == UNDEF_type_of_ClipVarType)
      pagesize = getpagesize();
   if (_clip_parinfo(ClipMachineMemory, 4) == UNDEF_type_of_ClipVarType)
      lcase = 0;
   if (_clip_parinfo(ClipMachineMemory, 5) == UNDEF_type_of_ClipVarType)
      filtset = 1;

   if ((er = hs_create(ClipMachineMemory, fname, pagesize, lcase, filtset, &hs, __PROC__)))
      goto err;
   hs->map = calloc(1, 4);
   _clip_retni(ClipMachineMemory, _clip_store_c_item(ClipMachineMemory, (void *) hs, _C_ITEM_TYPE_HIPER, destroy_hiper));
   return 0;
 err:
   return er;
}
Пример #17
0
int pg_createrowset(ClipMachine* mp,SQLROWSET* rs,ClipVar* ap,ClipVar* idname,const char* gen_idSQL){
	PG_ROWSET* rowset = (PG_ROWSET*)rs;
	PG_STMT* stmt = rowset->stmt;
	PG_CONN* conn = rowset->conn;
	int i,mod;

	pg_bindpars(stmt,ap);
	if(!stmt->sql){
		_clip_trap_err(mp,0,0,0,subsys,ER_NOSQL,er_nosql);
		return 1;
	}

	stmt->res = PQexec(conn->conn,stmt->sql);
	if(!stmt->res){
		_clip_trap_err(mp,0,0,0,subsys,ER_BADSTATEMENT,
			PQresultErrorMessage(stmt->res));
		return 1;
	}
	if(PQresultStatus(stmt->res)!=PGRES_TUPLES_OK){
		_clip_trap_err(mp,0,0,0,subsys,ER_BADSELECT,
			PQresultErrorMessage(stmt->res));
		return 1;
	}

	rowset->rowset_item =
		_clip_store_c_item(mp,rowset,_C_ITEM_TYPE_SQL,destroy_pg_rowset);

	rowset->binary = PQbinaryTuples(stmt->res);
	rowset->nfields = PQnfields(stmt->res);
	rowset->fields = calloc(1,rowset->nfields*sizeof(SQLFIELD));
	rowset->id = -1;
	for(i=0;i<rowset->nfields;i++){
		strncpy(rowset->fields[i].name,PQfname(stmt->res,i),
			MAXFIELDNAME);
		rowset->fields[i].name[MAXFIELDNAME] = 0;
		rowset->fields[i].type = PQftype(stmt->res,i);
		rowset->fields[i].ctype[0] = _pg_ctype(rowset->fields[i].type);
		rowset->fields[i].dec = 0;
		mod = PQfmod(stmt->res,i);
		switch(rowset->fields[i].type){
			case PGT_BPCHAR:
			case PGT_CHAR:
			case PGT_VARCHAR:
				rowset->fields[i].len = mod-4;
				break;
			case PGT_TEXT:
				rowset->fields[i].len = 10;
				break;
			case PGT_NUMERIC:
				rowset->fields[i].len = (mod >> 16);
				rowset->fields[i].dec = (mod & 0xffff)-4;
				break;
			case PGT_DATE:
				rowset->fields[i].len = 8;
				break;
			default:
				rowset->fields[i].len = PQfsize(stmt->res,i);
				break;
		}
		rowset->fields[i].ops = 0;
		if(idname && idname->t.type == CHARACTER_t && idname->s.str.buf){
			if(!strcasecmp(rowset->fields[i].name,idname->s.str.buf)){
				rowset->id = i;
			}
		} else if(rowset->fields[i].type == PGT_OID){
			rowset->id = i;
		}
	}

	rowset->lastrec = PQntuples(stmt->res);
	rowset->data = calloc(rowset->lastrec,sizeof(void*));
	return 0;
}
Пример #18
0
int odbc_createrowset(ClipMachine* cm,SQLROWSET* rs,ClipVar* ap,ClipVar* idname,const char* gen_idSQL){
	ODBC_ROWSET* rowset = (ODBC_ROWSET*)rs;
	ODBC_STMT* stmt = rowset->stmt;
	SQLRETURN er;
	SQLSMALLINT cols;
	SQLINTEGER nullable;
	int i;

	odbc_bindpars(stmt,ap);
	if((er = SQLAllocStmt(stmt->conn->conn,&stmt->hstmt))) goto err;
	if((er = SQLPrepare(stmt->hstmt,stmt->sql,strlen(stmt->sql)))) goto err;
	rowset->rowset_item =
		_clip_store_c_item(cm,rowset,_C_ITEM_TYPE_SQL,destroy_odbc_rowset);

	if((er = SQLExecute(stmt->hstmt))) goto err;

	if((er = SQLNumResultCols(stmt->hstmt,&cols))) goto err;
	rowset->nfields = cols;
	rowset->fields = calloc(rowset->nfields,sizeof(SQLFIELD));
	rowset->id = -1;

	for(i=0;i<rowset->nfields;i++){
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_NAME,rowset->fields[i].name,MAXFIELDNAME+1,0,0)))
			goto err;
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_TYPE,0,0,0,(SQLPOINTER)&rowset->fields[i].type)))
			goto err;
		rowset->fields[i].ctype[0] = _odbc_ctype(rowset->fields[i].type);
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_LENGTH,0,0,0,(SQLPOINTER)&rowset->fields[i].buflen)))
			goto err;
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_DISPLAY_SIZE,0,0,0,(SQLPOINTER)&rowset->fields[i].len)))
			goto err;
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_SCALE,0,0,0,(SQLPOINTER)&rowset->fields[i].dec)))
			goto err;
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_UNSIGNED,0,0,0,(SQLPOINTER)&rowset->fields[i].unsign)))
			goto err;
		if((er = SQLColAttributes(stmt->hstmt,i+1,
			SQL_COLUMN_NULLABLE,0,0,0,(SQLPOINTER)&nullable)))
			goto err;
		rowset->fields[i].notnull = (nullable == SQL_NO_NULLS);
		/* silly PostgreSQL's ODBC driver */
		if(stmt->conn->postgres && (rowset->fields[i].type == SQL_NUMERIC ||
			rowset->fields[i].type == SQL_DECIMAL)){

			rowset->fields[i].dec = LOWORD(rowset->fields[i].len);
			rowset->fields[i].len = HIWORD(rowset->fields[i].len);
			rowset->fields[i].buflen = 8;
		}
		if(rowset->fields[i].type == SQL_LONGVARBINARY)
			rowset->fields[i].buflen *= 2;

		if(idname->t.type == CHARACTER_t){
			if(idname->s.str.buf && !strcasecmp(rowset->fields[i].name,idname->s.str.buf)){
				rowset->id = i;
				rowset->nids = 1;
			}
		} else if(idname->t.type == ARRAY_t){
			int j;
			for(j=0;j<idname->a.count;j++){
				ClipVar* vp = idname->a.items+j;
				if(vp->t.type == CHARACTER_t && vp->s.str.buf
					&& !strcasecmp(rowset->fields[i].name,vp->s.str.buf)){

					rowset->nids++;
					rowset->ids = realloc(rowset->ids,rowset->nids*sizeof(int));
					rowset->ids[rowset->nids-1] = i;
				}
			}
		}

		if(rowset->fields[i].type == SQL_BINARY ||
			rowset->fields[i].type == SQL_VARBINARY ||
			rowset->fields[i].type == SQL_LONGVARBINARY)
		rowset->fields[i].binary = 1;
	}
	rowset->lastrec = 0;
	rowset->data = malloc(sizeof(void*)*rowset->lastrec);
	rowset->unknownrows = 1;
	return 0;
err:
	odbc_error(cm,stmt->conn->loc,0,stmt->conn->conn,stmt->hstmt,__LINE__,er_createrowset);
	return 1;
}
Пример #19
0
int
clip_TCPCONNECT(ClipMachine *mp)
{
	C_FILE *cf = NULL;
	struct sockaddr_in sin;
	long port = 0, timeout = 60000; /* maybe we should add _set_ for default timeout */
	int arg = 0, sock = -1, ret = -1, i;
	int *err = _clip_fetch_item(mp, HASH_ferror);
	struct timeval tv;
	char *addr  = _clip_parc(mp,1), *sport;

	*err=0;

	if (_clip_parinfo(mp,0) < 2 || _clip_parinfo(mp,1) != CHARACTER_t)
	{
		*err = EINVAL;
		goto err;
	}

	if (_clip_parinfo(mp,2) == NUMERIC_t)
		port = htons(_clip_parnl(mp,2));
	else if ((sport = _clip_parc(mp,2)) != NULL)
	{
		struct servent *sp;
		if ((sp = getservbyname( (const char *) sport, "tcp")) != NULL)
			port = sp->s_port;
		else
		{
			for (i = 0; sport[i] >= '0' && sport[i] <= '9'; i++);
			if (sport[i] == '\0')
				port = htons(atol(sport));
		}

	}

	if (port == 0)
	{
		*err = EINVAL;
		goto err;
	}

	if (_clip_parinfo(mp,3) == NUMERIC_t)
		timeout = _clip_parnl(mp,3);

	tv.tv_sec = timeout / 1000;
	tv.tv_usec = (timeout % 1000) * 1000;

	if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
		goto err;

/*
#if !defined(linux) && !defined(SOLARIS_26_X86)
	setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, (void *)&tv,  sizeof(tv) );
	setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv,  sizeof(tv) );
#endif
*/
	if ((arg = fcntl(sock, F_GETFL, 0)) == -1)
		goto err;
	fcntl(sock, F_SETFL, arg | O_NONBLOCK);

	sin.sin_family = AF_INET;
	sin.sin_port = port;
	tcp_host_addr(addr, &sin.sin_addr);

	if (sin.sin_addr.s_addr == INADDR_NONE)
	{
		*err = EFAULT;
		goto err;
	}

	if (connect( sock, (struct sockaddr *) &sin, sizeof(sin)) == -1 )
	{
		fd_set set;

#ifndef OS_MINGW
		if (errno != EINPROGRESS)
			goto err;
#endif

		FD_ZERO(&set);
		FD_SET(sock, &set);

		do  i = _clip_select( sock+1, NULL, &set, NULL, &tv );
		while (i == -1 && errno == EINTR);

		if (i == -1)
			goto err;
		else if (i == 0)
		{
#ifdef OS_MINGW
			*err = EAGAIN;
#else
			*err = ETIMEDOUT;
#endif
		}

		arg = 0;
		i = sizeof(arg);
		if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void *) &arg, (socklen_t *)(&i)) == -1)
			goto err;
		if (arg != 0)
		{
			*err = arg;
			goto err;
		}
	}

#ifndef OS_MINGW
	if ((arg = fcntl(sock, F_GETFL, 0)) == -1)
		goto err;
	fcntl(sock, F_SETFL, arg | O_NONBLOCK);
#endif

	cf = calloc(1, sizeof(C_FILE));
	cf->fileno = sock;
	cf->f = NULL;
	cf->type = FT_SOCKET;
	cf->pid = -1;
	cf->timeout = timeout;
	cf->stat = 0; /* see FS_* flags */
	ret = _clip_store_c_item(mp, cf, _C_ITEM_TYPE_FILE, destroy_c_file);

	err:
	if (ret == -1)
	{
		if (*err !=0 )
			*err = errno;
		if (sock != -1)
			close(sock);
	}
	_clip_retni(mp, ret);

	return 0;
}
Пример #20
0
      goto err_read;
   fp->sfilter = (char *) calloc(1, _rdd_ushort((unsigned char *) buf) + 1);
   if (read(fd, fp->sfilter, _rdd_ushort((unsigned char *) buf) + 1) == -1)
      goto err_read;
   if (read(fd, buf, sizeof(int)) == -1)
      goto err_read;
   fp->size = _rdd_uint((unsigned char *) buf);
   if (fp->size)
   {
      bytes = (((fp->size + 1) >> 5) + 1) << 2;
      fp->rmap = calloc(1, bytes);
      if (read(fd, fp->rmap, bytes) == -1)
	 goto err_read;
   }
   fp->nfps = 1;
   fp->handle = _clip_store_c_item(ClipMachineMemory, fp, _C_ITEM_TYPE_RYO, destroy_ryo);
   if (close(fd) == -1)
      goto err_read;
   free(path);
   _clip_retni(ClipMachineMemory, fp->handle);
   return 0;
 err_open:
   er = rdd_err(ClipMachineMemory, EG_OPEN, errno, __FILE__, __LINE__, __PROC__, er_open);
   goto err;
 err_read:
   er = rdd_err(ClipMachineMemory, EG_READ, errno, __FILE__, __LINE__, __PROC__, er_read);
 err:
   if (path)
      free(path);
   if (fp)
   {
Пример #21
0
int
clip_TCPLISTEN(ClipMachine * ClipMachineMemory)
/* Create a socket and stand for connetions.
  Use : TcpListen( port[, nMaxConn] )
*/
{
   struct sockaddr_in sin;

   long port = 0, timeout = 60000;

   int *err = _clip_fetch_item(ClipMachineMemory, HASH_ferror), i;

   char *sport;

   int sock = -1, ret = -1;

   int backlog = 5;

   C_FILE *cf = NULL;

   int arg;

   *err = 0;

   if (_clip_parinfo(ClipMachineMemory, 0) < 1)
   {
      *err = EINVAL;
      goto err;
   }

   if (_clip_parinfo(ClipMachineMemory, 1) == NUMERIC_type_of_ClipVarType)
      port = htons(_clip_parnl(ClipMachineMemory, 1));
   else if ((sport = _clip_parc(ClipMachineMemory, 1)) != NULL)
   {
      struct servent *sp;

      if ((sp = getservbyname((const char *) sport, "tcp")) != NULL)
	 port = sp->s_port;
      else
      {
	 for (i = 0; sport[i] >= '0' && sport[i] <= '9'; i++);
	 if (sport[i] == '\0')
	    port = htons(atol(sport));
      }
   }

   if (port == 0)
   {
      *err = EINVAL;
      goto err;
   }

   if (_clip_parinfo(ClipMachineMemory, 2) == NUMERIC_type_of_ClipVarType)
      backlog = _clip_parnl(ClipMachineMemory, 2);

   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
      goto err;

   if ((arg = fcntl(sock, F_GETFL, 0)) == -1)
      goto err;
   fcntl(sock, F_SETFL, arg | O_NONBLOCK);

   memset((void *) &sin, 0, sizeof(sin));
   sin.sin_family = AF_INET;	/* PF_INET ?? */
   sin.sin_addr.s_addr = INADDR_ANY;
   sin.sin_port = port;

   if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) == -1)
      /* Error, no bind */
   {

      *err = EFAULT;
      goto err;

   }

   if (listen(sock, backlog) == -1)
   {
      *err = EFAULT;
      goto err;
   }

   cf = (C_FILE *) calloc(1, sizeof(C_FILE));
   cf->fileno_of_C_FILE = sock;
   cf->file_of_C_FILE = NULL;
   cf->type_of_C_FILE = FT_SOCKET;
   cf->pid_of_C_FILE = -1;
   cf->timeout_of_C_FILE = timeout;
   cf->stat_of_C_FILE = 0;	/* see FS_* flags */
   ret = _clip_store_c_item(ClipMachineMemory, cf, _C_ITEM_TYPE_FILE, destroy_c_file);

 err:
   if (ret == -1)
   {
      if (*err != 0)
	 *err = errno;
      if (sock != -1)
	 close(sock);
   }
   _clip_retni(ClipMachineMemory, ret);

   return 0;
}