static SQRESULT sq_mysql_constructor(HSQUIRRELVM v) { SQ_FUNC_VARS(v); SQ_GET_STRING(v, 2, host); SQ_GET_STRING(v, 3, username); SQ_GET_STRING(v, 4, password); SQ_GET_STRING(v, 5, sourcename); SQ_OPT_INTEGER(v, 6, port, 3306); SQ_OPT_STRING(v, 7, sockname, NULL); SQ_OPT_INTEGER(v, 8, optflags, 0); MYSQL *self=0; if(load_libmysqlclient(dynamicLibName)) { self = dlmysql_init(NULL); if (!self) return sq_throwerror(v, _SC("error connecting: Out of memory.")); if (!dlmysql_real_connect(self, host, username, password, sourcename, port, sockname, optflags)) { SQRESULT res = sq_throwerror(v, _SC("error connecting to database. MySQL: %s"), dlmysql_error(self)); dlmysql_close (self); /* Close conn if connect failed */ return res; } } else return sq_throwerror(v, _SC("Failed to load libmysqlclient !")); sq_setinstanceup(v, 1, self); sq_setreleasehook(v,1, sq_mysql_releasehook); //save a weakref to allow statement return it's db sq_pushuserpointer(v, self); sq_weakref(v, 1); sq_setonregistrytable(v); return 1; }
static SQRESULT sq_mysql_result_row_as_table(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_mysql_result_INSTANCE(); SQ_OPT_INTEGER(v, 2, row, -1); if(row < 0){ sq_pushstring(v, _curr_row_key, -1); if(sq_get(v, 1) == SQ_OK){ sq_getinteger(v, -1, &row); } } int row_count = dlmysql_num_rows(self); if(row < 0 || row >= row_count) return sq_throwerror(v, _SC("invalid row (" _PRINT_INT_FMT ")"), row); int col_count = dlmysql_num_fields(self); sq_newtableex(v, col_count); dlmysql_data_seek(self, row); const MYSQL_ROW res_row = dlmysql_fetch_row(self); unsigned long *lengths = dlmysql_fetch_lengths(self); MYSQL_FIELD *fields = dlmysql_fetch_fields(self); for(int i=0; i < col_count; ++i){ sq_pushstring(v, fields[i].name, -1); sq_pushstring(v, (const SQChar*)res_row[i], lengths[i]); sq_rawset(v, -3); } return 1; }
static SQRESULT sq_ssl_read(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_ssl_INSTANCE(); SQ_OPT_INTEGER(v, 2, count, 0); uint8_t *in_data = NULL; int result = ssl_read(self, &in_data, count); if (result > SSL_OK) sq_pushstring(v, (const SQChar*)in_data, result); else sq_pushinteger(v, result); return 1; }
static SQRESULT sq_zlib_inflate(HSQUIRRELVM v) { SQ_FUNC_VARS(v); SQ_GET_STRING(v, 2, data); /* By default, we will do gzip header detection w/ max window size */ SQ_OPT_INTEGER(v, 3, window_size, MAX_WBITS + 32); /* Allocate the stream: */ z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; if(sq_check_result(v, inflateInit2(&stream, window_size), &stream) != SQ_OK) return SQ_ERROR; SQBlob b(LZ_BUFFER_SIZE); /* Do the actual deflate'ing: */ stream.next_in = (unsigned char*)data; stream.avail_in = data_size; if ( ! stream.avail_in ) { /* Passed empty string, make it a noop instead of erroring out. */ sq_pushliteral(v, ""); return 1; } int nchunks = 0; do { stream.next_out = ((unsigned char*)b.GetBuf()) + (LZ_BUFFER_SIZE * nchunks++); stream.avail_out = LZ_BUFFER_SIZE; int result = inflate(&stream, Z_FINISH); if ( Z_BUF_ERROR != result ) { /* Ignore Z_BUF_ERROR since that just indicates that we * need a larger buffer in order to proceed. Thanks to * Tobias Markmann for finding this bug! */ if(sq_check_result(v, result, &stream) == SQ_OK) break; else { inflateEnd(&stream); return SQ_ERROR; } } b.GrowBufOf(LZ_BUFFER_SIZE); } while ( stream.avail_out == 0 ); SQInteger total_out = stream.total_out; /* Close the stream: */ if(sq_check_result(v, inflateEnd(&stream), &stream) == SQ_ERROR) return SQ_ERROR; /* Need to do this before we alter the stack: */ sq_pushstring(v, (const SQChar*)b.GetBuf(), total_out); return 1; }
static SQRESULT sq_ssl_ctx_client_new(HSQUIRRELVM v){ SQ_FUNC_VARS(v); GET_ssl_ctx_INSTANCE(); SQ_GET_INTEGER(v, 2, client_fd); SQ_OPT_STRING(v, 3, session_id, NULL); SQ_OPT_INTEGER(v, 4, size, -1); SSL *ssl = ssl_client_new(self, client_fd, (const uint8_t *)session_id, size >= 0 ? size : session_id_size, NULL); SQRESULT rc = ssl_constructor(v, ssl, 1); if(rc == SQ_ERROR && ssl){ ssl_free(ssl); } return rc; }
static SQRESULT sq_zlib_deflate(HSQUIRRELVM v) { SQ_FUNC_VARS(v); SQ_GET_STRING(v, 2, data); SQ_OPT_INTEGER(v, 3, level, Z_DEFAULT_COMPRESSION); /* Allocate the stream: */ z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; if(sq_check_result(v, deflateInit(&stream, level), &stream) != SQ_OK) return SQ_ERROR; SQBlob b(LZ_BUFFER_SIZE); /* Do the actual deflate'ing: */ stream.next_in = (unsigned char*)data; stream.avail_in = data_size; if ( ! stream.avail_in ) { /* Passed empty string, make it a noop instead of erroring out. */ sq_pushliteral(v, ""); return 1; } int nchunks = 0; do { stream.next_out = ((unsigned char*)b.GetBuf()) + (LZ_BUFFER_SIZE * nchunks++); stream.avail_out = LZ_BUFFER_SIZE; int result = deflate(&stream, Z_FINISH); if (result == Z_STREAM_END ) break; if (result != Z_OK) { sq_check_result(v, result, &stream); deflateEnd(&stream); return SQ_ERROR; } b.GrowBufOf(LZ_BUFFER_SIZE); } while ( stream.avail_out == 0 ); SQInteger total_out = stream.total_out; /* Close the stream: */ if(sq_check_result(v, deflateEnd(&stream), &stream) == SQ_ERROR) return SQ_ERROR; /* Need to do this before we alter the stack: */ sq_pushstring(v, (const SQChar*)b.GetBuf(), total_out); return 1; }
/* ** Creates a new SQuirrel vm. */ static SQRESULT sq_slave_vm_constructor (HSQUIRRELVM v) { SQ_FUNC_VARS(v); SQ_OPT_INTEGER(v, 2, stack_size, 1024); HSQUIRRELVM self = sq_open(stack_size); /* Initialize environment */ sq_setprintfunc(self,sq_getprintfunc(v),sq_geterrorfunc(v)); /* load base libraries */ sq_pushroottable(self); sqstd_register_bloblib(self); sqstd_register_iolib(self); sqstd_register_systemlib(self); sqstd_register_mathlib(self); sqstd_register_stringlib(self); sq_poptop(self); //remove root table sq_setinstanceup(v, 1, self); sq_setreleasehook(v, 1, sq_slave_vm_release_hook); return 1; }