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; }
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; }
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; }
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; }
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; }
/* 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; }
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; }
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); }
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; }
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); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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) {
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; }