/** request : 'db -> sql:string -> 'result <doc>Executes the SQL request and returns its result</doc> **/ HL_PRIM sqlite_result *HL_NAME(request)(sqlite_database *db, vbyte *sql ) { sqlite_result *r; const char *tl; int i,j; r = (sqlite_result*)hl_gc_alloc_finalizer(sizeof(sqlite_result)); r->finalize = HL_NAME(finalize_result); r->db = db; if( sqlite3_prepare16_v2(db->db, sql, -1, &r->r, &tl) != SQLITE_OK ) { HL_NAME(error)(db->db, false); } if( *tl ) { sqlite3_finalize(r->r); hl_error("SQLite error: Cannot execute several SQL requests at the same time"); } r->ncols = sqlite3_column_count(r->r); r->names = (int*)hl_gc_alloc(sizeof(int)*r->ncols); r->bools = (int*)hl_gc_alloc(sizeof(int)*r->ncols); r->first = 1; r->done = 0; for(i=0;i<r->ncols;i++) { int id = hl_hash_gen((uchar*)sqlite3_column_name16(r->r,i), true); const char *dtype = sqlite3_column_decltype(r->r,i); for(j=0;j<i;j++) if( r->names[j] == id ) { if( strcmp(sqlite3_column_name16(r->r,i), sqlite3_column_name16(r->r,j)) == 0 ) { sqlite3_finalize(r->r); hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b, USTR("SQLite error: Same field is two times in the request: ")); hl_buffer_str(b, (uchar*)sql); hl_error_msg(hl_buffer_content(b, NULL)); } else { hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b, USTR("SQLite error: Same field ids for: ")); hl_buffer_str(b, sqlite3_column_name16(r->r,i)); hl_buffer_str(b, USTR(" and ")); hl_buffer_str(b, sqlite3_column_name16(r->r,j)); sqlite3_finalize(r->r); hl_error_msg(hl_buffer_content(b, NULL)); } } r->names[i] = id; r->bools[i] = dtype?(strcmp(dtype,"BOOL") == 0):0; } // changes in an update/delete if( db->last != NULL ) HL_NAME(finalize_request)(db->last, false); db->last = r; return db->last; }
static void HL_NAME(error)( sqlite3 *db, bool close ) { hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b, USTR("SQLite error: ")); hl_buffer_str(b, sqlite3_errmsg16(db)); if ( close ) sqlite3_close(db); hl_error_msg(hl_buffer_content(b, NULL)); }
HL_PRIM const uchar *hl_type_str( hl_type *t ) { const uchar *c = TSTR[t->kind]; hl_buffer *b; if( c != NULL ) return c; b = hl_alloc_buffer(); hl_type_str_rec(b,t,NULL); return hl_buffer_content(b,NULL); }
bool hl_sys_put_env( vbyte *e, vbyte *v ) { #ifdef HL_WIN hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b,(uchar*)e); hl_buffer_char(b,'='); if( v ) hl_buffer_str(b,(uchar*)v); return putenv(hl_buffer_content(b,NULL)) == 0; #else if( v == NULL ) return unsetenv((char*)e) == 0; return setenv((char*)e,(char*)v,1) == 0; #endif }
HL_PRIM ereg *regexp_regexp_new_options( vbyte *str, vbyte *opts ) { ereg *r; const char *error; int err_offset; int errorcode; pcre16 *p; uchar *o = (uchar*)opts; int options = 0; while( *o ) { switch( *o++ ) { case 'i': options |= PCRE_CASELESS; break; case 's': options |= PCRE_DOTALL; break; case 'm': options |= PCRE_MULTILINE; break; case 'u': options |= PCRE_UTF8; break; case 'g': options |= PCRE_UNGREEDY; break; default: return NULL; } } p = pcre16_compile2((PCRE_SPTR16)str,options,&errorcode,&error,&err_offset,NULL); if( p == NULL ) { hl_buffer *b = hl_alloc_buffer(); hl_buffer_str(b,USTR("Regexp compilation error : ")); hl_buffer_cstr(b,error); hl_buffer_str(b,USTR(" in ")); hl_buffer_str(b,(uchar*)str); hl_error_msg(USTR("%s"),hl_buffer_content(b,NULL)); } r = (ereg*)hl_gc_alloc_finalizer(sizeof(ereg)); r->finalize = regexp_finalize; r->p = p; r->nmatches = 0; r->matched = 0; pcre16_fullinfo(p,NULL,PCRE_INFO_CAPTURECOUNT,&r->nmatches); r->nmatches++; r->matches = (int*)malloc(sizeof(int) * 3 * r->nmatches); limit.flags = PCRE_EXTRA_MATCH_LIMIT_RECURSION; limit.match_limit_recursion = 3500; // adapted based on Windows 1MB stack size return r; }
static void zlib_error( z_stream *z, int err ) { hl_buffer *b = hl_alloc_buffer(); vdynamic *d; hl_buffer_cstr(b, "ZLib Error : "); if( z && z->msg ) { hl_buffer_cstr(b,z->msg); hl_buffer_cstr(b," ("); } d = hl_alloc_dynamic(&hlt_i32); d->v.i = err; hl_buffer_val(b,d); if( z && z->msg ) hl_buffer_char(b,')'); d = hl_alloc_dynamic(&hlt_bytes); d->v.ptr = hl_buffer_content(b,NULL); hl_throw(d); }
varray *hl_sys_read_dir( vbyte *_path ) { pchar *path = (pchar*)_path; int count = 0; int pos = 0; varray *a = NULL; pchar **current = NULL; #ifdef HL_WIN WIN32_FIND_DATAW d; HANDLE handle; hl_buffer *b = hl_alloc_buffer(); int len = (int)pstrlen(path); hl_buffer_str(b,path); if( len && path[len-1] != '/' && path[len-1] != '\\' ) hl_buffer_str(b,USTR("/*.*")); else hl_buffer_str(b,USTR("*.*")); path = hl_buffer_content(b,NULL); handle = FindFirstFileW(path,&d); if( handle == INVALID_HANDLE_VALUE ) return NULL; while( true ) { // skip magic dirs if( d.cFileName[0] != '.' || (d.cFileName[1] != 0 && (d.cFileName[1] != '.' || d.cFileName[2] != 0)) ) { if( pos == count ) { int ncount = count == 0 ? 16 : count * 2; varray *narr = hl_alloc_array(&hlt_bytes,count); pchar **ncur = hl_aptr(narr,pchar*); memcpy(ncur,current,count*sizeof(void*)); current = ncur; a = narr; count = ncount; } current[pos++] = pstrdup(d.cFileName,-1); } if( !FindNextFileW(handle,&d) ) break; }