void start(void *data, const char *el, const XML_Char **attr) { p *ptr = (p *)data; JSOBJ o = Object::New(); for (const XML_Char **a = attr; *a; a += 2) { // printf("%s = %s\n", a[0], a[1]); o->Set(String::New(a[0]), String::New(a[1])); } Handle<Value>argv[2] = { String::New(el), o }; ptr->start->Call(ptr->thisObj, 2, argv); }
static JSOBJ format_stat(struct stat &buf) { HandleScope scope; JSOBJ o = Object::New(); o->Set(String::New("dev"), Integer::New(buf.st_dev)); o->Set(String::New("ino"), Integer::New(buf.st_ino)); o->Set(String::New("mode"), Integer::New(buf.st_mode)); o->Set(String::New("nlink"), Integer::New(buf.st_nlink)); o->Set(String::New("uid"), Integer::New(buf.st_uid)); o->Set(String::New("gid"), Integer::New(buf.st_gid)); o->Set(String::New("rdev"), Integer::New(buf.st_rdev)); o->Set(String::New("size"), Integer::New(buf.st_size)); o->Set(String::New("blksize"), Integer::New(buf.st_blksize)); o->Set(String::New("blocks"), Integer::New(buf.st_blocks)); o->Set(String::New("atime"), Integer::New(buf.st_atime)); o->Set(String::New("mtime"), Integer::New(buf.st_mtime)); o->Set(String::New("ctime"), Integer::New(buf.st_ctime)); return scope.Close(o); }
/** * @function memcached.get * * ### Synopsis * * var o = memcached.get(handle, key); * * Get a value from memcached by key. * * @param {object} handle - handle to memcached connection. * @param {string} key - key of data to get from memcached * @return {object} o - see description at top of the page, or false if an error occurred. */ JSVAL _memcached_get (JSARGS args) { HandleScope scope; M* handle = HANDLE(args[0]); String::Utf8Value key(args[1]); size_t value_length; uint32_t flags; R rc; char *res = memcached_get(handle, *key, strlen(*key), &value_length, &flags, &rc); if (!res) { return scope.Close(False()); } JSOBJ o = Object::New(); o->Set(String::New("value"), String::New(res)); o->Set(String::New("flags"), Integer::New(flags)); o->Set(String::New("rc"), Integer::New(rc)); free(res); return scope.Close(o); }
/** * @function SFTP.stat * * ### Synopsis * * var stat = SFTP.stat(handle, path); * * Get attributes of a remote file. * * The returned object will be of the form: * * + size: size of file in bytes. * + permissions: file permissions. * + uid: uid of owner of file. * + gid: gid of owner of file. * + mtime: modification time (timestamp) of file. * + atime: access time (timestamp) of file * * @param {object} handle - opaque handle to existing SFTP connection (already connected). * @param {string} path - path on remote server to directory to get status of. * @returns {object} stat - object of the form described above. */ JSVAL sftp_stat (JSARGS args) { HandleScope scope; SFTP *handle = HANDLE(args[0]); String::Utf8Value path(args[1]); LIBSSH2_SFTP_HANDLE *sftp_handle = libssh2_sftp_open(handle->sftp_session, *path, LIBSSH2_FXF_READ, 0); if (!sftp_handle) { return scope.Close(String::New("Could not get status for remote file")); } LIBSSH2_SFTP_ATTRIBUTES attrs; if (libssh2_sftp_fstat_ex(sftp_handle, &attrs, 0) < 0) { libssh2_sftp_close(sftp_handle); return scope.Close(String::New("Could not get status for remote file")); } Handle<String> _permissions = String::New("permissions"); Handle<String> _uid = String::New("uid"); Handle<String> _gid = String::New("gid"); Handle<String> _size = String::New("size"); Handle<String> _mtime = String::New("mtime"); Handle<String> _atime = String::New("atime"); JSOBJ o = Object::New(); if (attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) { o->Set(_size, Integer::New(attrs.filesize)); } if (attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { o->Set(_permissions, Integer::New(attrs.permissions)); } if (attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) { o->Set(_uid, Integer::New(attrs.uid)); o->Set(_gid, Integer::New(attrs.gid)); } if (attrs.flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { o->Set(_mtime, Integer::New(attrs.mtime)); o->Set(_atime, Integer::New(attrs.atime)); } libssh2_sftp_close(sftp_handle); return scope.Close(o); }
JSVAL getDataRows(JSARGS args) { HandleScope scope; String::Utf8Value sql(args[0]->ToString()); mysql_ping(handle); int failure = mysql_query(handle, *sql); if (failure) { return ThrowException(String::New(mysql_error(handle))); } MYSQL_RES *result = mysql_use_result(handle); if (!result) { return scope.Close(False()); } unsigned int num_fields = mysql_num_fields(result); MYSQL_FIELD *fields = mysql_fetch_fields(result); Handle<Array>a = Array::New(mysql_num_rows(result)); Local<String> names[num_fields]; int types[num_fields]; for (unsigned int n=0; n<num_fields; n++) { names[n] = String::New(fields[n].name); types[n] = fields[n].type; } unsigned long rowNdx = 0; unsigned int i; MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { unsigned long *lengths = mysql_fetch_lengths(result); JSOBJ o = Object::New(); for (i=0; i<num_fields; i++) { if (row[i] == NULL) { o->Set(names[i], Null()); } else { switch (types[i]) { case MYSQL_TYPE_NULL: o->Set(names[i], Null()); break; case MYSQL_TYPE_TINY: case MYSQL_TYPE_SHORT: case MYSQL_TYPE_LONG: case MYSQL_TYPE_TIMESTAMP: case MYSQL_TYPE_LONGLONG: case MYSQL_TYPE_INT24: o->Set(names[i], Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_FLOAT: case MYSQL_TYPE_DOUBLE: o->Set(names[i], Number::New(atof(row[i]))); break; default: o->Set(names[i], String::New(row[i], lengths[i])); break; } } } a->Set(rowNdx++, o); } mysql_free_result(result); return scope.Close(a); }
/** * @function memcached.mget * * ### Synopsis: * * var o = memcache.get(handle, array_of_keys); * * Get multiple values, identified by an array of keys, from memcached. * * The returned object is a hash of returned values, indexed by the key. * * For each of these keys, the value is an object in the form described at the top of this page. * * @param {object} handle - handle to memcached connection. * @param {array} keys - array of keys of data to get from memcached * @return {object} o - has of objects of the form described at top of the page, or false if an error occurred. */ JSVAL _memcached_mget (JSARGS args) { HandleScope scope; M* handle = HANDLE(args[0]); Handle<Array> aKeys = Handle<Array>::Cast(args[1]); int numKeys = aKeys->Length(); char *keys[numKeys]; size_t key_lengths[numKeys]; for (int i = 0; i < numKeys; i++) { String::Utf8Value k(aKeys->Get(i)); keys[i] = *k; key_lengths[i] = strlen(keys[i]); } R rc = memcached_mget(handle, keys, key_lengths, numKeys); if (rc != MEMCACHED_SUCCESS) { return String::New(memcached_strerror(handle, rc)); } char return_key[MEMCACHED_MAX_KEY]; size_t return_key_length; char *return_value; size_t return_value_length; uint32_t flags; JSOBJ result = Object::New(); while ((return_value = memcached_fetch(handle, return_key, &return_key_length, &return_value_length, &flags, &rc))) { JSOBJ o = Object::New(); o->Set(String::New("value"), String::New(return_value)); o->Set(String::New("flags"), Integer::New(flags)); o->Set(String::New("rc"), Integer::New(rc)); free(return_value); result->Set(String::New(return_key), o); } return scope.Close(result); }
/** * @function SFTP.readDir * * ### Synopsis * * var files = SFTP.readDir(handle, path); * * Read a directory from remote server, return an array of objects of the form: * * + name: name of file. * + longentry: a string? * + size: size of file in bytes. * + permissions: file permissions. * + uid: uid of owner of file. * + gid: gid of owner of file. * + mtime: modification time (timestamp) of file. * + atime: access time (timestamp) of file * * The above values may be undefined (except for name), if the SSH2 library and remote server don't allow extended information. * * @param {object} handle - opaque handle to existing SFTP connection (already connected). * @param {string} path - path on remote server to directory to get listing of. * @return {array} files - array of objects as specifed above, or string containing error message. */ JSVAL sftp_readdir (JSARGS args) { HandleScope scope; SFTP *handle = HANDLE(args[0]); String::Utf8Value path(args[1]); LIBSSH2_SFTP_HANDLE *sftp_handle = libssh2_sftp_opendir(handle->sftp_session, *path); if (!sftp_handle) { return scope.Close(String::New("Could not open remote directory")); } char mem[512], longentry[512]; LIBSSH2_SFTP_ATTRIBUTES attrs; Handle<String> _name = String::New("name"); Handle<String> _longentry = String::New("longentry"); Handle<String> _permissions = String::New("permissions"); Handle<String> _uid = String::New("uid"); Handle<String> _gid = String::New("gid"); Handle<String> _size = String::New("size"); Handle<String> _mtime = String::New("mtime"); Handle<String> _atime = String::New("atime"); Handle<Array>a = Array::New(); int aIndex = 0; while (1) { if (libssh2_sftp_readdir_ex(sftp_handle, mem, sizeof (mem), longentry, sizeof (longentry), &attrs) <= 0) { break; } JSOBJ o = Object::New(); o->Set(_name, String::New(mem)); o->Set(_longentry, String::New(longentry)); if (attrs.flags & LIBSSH2_SFTP_ATTR_SIZE) { o->Set(_size, Integer::New(attrs.filesize)); } if (attrs.flags & LIBSSH2_SFTP_ATTR_PERMISSIONS) { o->Set(_permissions, Integer::New(attrs.permissions)); } if (attrs.flags & LIBSSH2_SFTP_ATTR_UIDGID) { o->Set(_uid, Integer::New(attrs.uid)); o->Set(_gid, Integer::New(attrs.gid)); } if (attrs.flags & LIBSSH2_SFTP_ATTR_ACMODTIME) { o->Set(_mtime, Integer::New(attrs.mtime)); o->Set(_atime, Integer::New(attrs.atime)); } a->Set(aIndex++, o); } libssh2_sftp_closedir(sftp_handle); return scope.Close(a); }
static JSVAL get_character_set_info(JSARGS args) { HandleScope scope; MYSQL *handle = (MYSQL *) args[0]->IntegerValue(); MY_CHARSET_INFO cs; mysql_get_character_set_info(handle, &cs); JSOBJ o = Object::New(); o->Set(String::New("number"), Integer::New(cs.number)); o->Set(String::New("name"), String::New(cs.name)); o->Set(String::New("csname"), String::New(cs.csname)); o->Set(String::New("comment"), String::New(cs.comment)); o->Set(String::New("dir"), String::New(cs.dir)); o->Set(String::New("mbminlen"), Integer::New(cs.mbminlen)); o->Set(String::New("mbmaxlen"), Integer::New(cs.mbmaxlen)); return scope.Close(o); }
static void MakeField(MYSQL_FIELD *f, JSOBJ o) { o->Set(String::New("name"), String::New(f->name)); o->Set(String::New("org_name"), String::New(f->org_name)); o->Set(String::New("table"), String::New(f->table)); o->Set(String::New("org_table"), String::New(f->org_table)); o->Set(String::New("db"), String::New(f->db)); o->Set(String::New("catalog"), String::New(f->catalog)); o->Set(String::New("def"), String::New(f->def)); o->Set(String::New("length"), Integer::New(f->length)); o->Set(String::New("max_length"), Integer::New(f->max_length)); o->Set(String::New("name_length"), Integer::New(f->name_length)); o->Set(String::New("org_name_length"), Integer::New(f->org_name_length)); o->Set(String::New("table_length"), Integer::New(f->table_length)); o->Set(String::New("db_length"), Integer::New(f->db_length)); o->Set(String::New("catalog_length"), Integer::New(f->catalog_length)); o->Set(String::New("def_length"), Integer::New(f->def_length)); o->Set(String::New("flags"), Integer::New(f->flags)); o->Set(String::New("decimals"), Integer::New(f->decimals)); o->Set(String::New("charsetnr"), Integer::New(f->charsetnr)); switch (f->type) { case MYSQL_TYPE_DECIMAL: o->Set(String::New("type"), String::New("DECIMAL")); break; case MYSQL_TYPE_TINY: o->Set(String::New("type"), String::New("TINY")); break; case MYSQL_TYPE_SHORT: o->Set(String::New("type"), String::New("SHORT")); break; case MYSQL_TYPE_LONG: o->Set(String::New("type"), String::New("LONG")); break; case MYSQL_TYPE_FLOAT: o->Set(String::New("type"), String::New("FLOAT")); break; case MYSQL_TYPE_DOUBLE: o->Set(String::New("type"), String::New("DOUBLE")); break; case MYSQL_TYPE_NULL: o->Set(String::New("type"), String::New("NULL")); break; case MYSQL_TYPE_TIMESTAMP: o->Set(String::New("type"), String::New("TIMESTAMP")); break; case MYSQL_TYPE_LONGLONG: o->Set(String::New("type"), String::New("LONGLONG")); break; case MYSQL_TYPE_INT24: o->Set(String::New("type"), String::New("INT24")); break; case MYSQL_TYPE_DATE: o->Set(String::New("type"), String::New("DATE")); break; case MYSQL_TYPE_TIME: o->Set(String::New("type"), String::New("TIME")); break; case MYSQL_TYPE_DATETIME: o->Set(String::New("type"), String::New("DATETIME")); break; case MYSQL_TYPE_YEAR: o->Set(String::New("type"), String::New("YEAR")); break; case MYSQL_TYPE_NEWDATE: o->Set(String::New("type"), String::New("NEWDATE")); break; case MYSQL_TYPE_VARCHAR: o->Set(String::New("type"), String::New("VARCHAR")); break; case MYSQL_TYPE_BIT: o->Set(String::New("type"), String::New("BIT")); break; case MYSQL_TYPE_NEWDECIMAL: o->Set(String::New("type"), String::New("NEWDECIMAL")); break; case MYSQL_TYPE_ENUM: o->Set(String::New("type"), String::New("ENUM")); break; case MYSQL_TYPE_SET: o->Set(String::New("type"), String::New("SET")); break; case MYSQL_TYPE_TINY_BLOB: o->Set(String::New("type"), String::New("TINY_BLOB")); break; case MYSQL_TYPE_MEDIUM_BLOB: o->Set(String::New("type"), String::New("MEDIUM_BLOB")); break; case MYSQL_TYPE_LONG_BLOB: o->Set(String::New("type"), String::New("LONG_BLOB")); break; case MYSQL_TYPE_BLOB: o->Set(String::New("type"), String::New("BLOB")); break; case MYSQL_TYPE_VAR_STRING: o->Set(String::New("type"), String::New("VAR_STRING")); break; case MYSQL_TYPE_STRING: o->Set(String::New("type"), String::New("STRING")); break; case MYSQL_TYPE_GEOMETRY: o->Set(String::New("type"), String::New("GEOMETRY")); break; default: o->Set(String::New("type"), String::New("UNKNOWN")); break; } }
JSVAL getDataRow(JSARGS args) { HandleScope scope; String::Utf8Value sql(args[0]->ToString()); mysql_ping(handle); int failure = mysql_query(handle, *sql); if (failure) { return ThrowException(String::New(mysql_error(handle))); } MYSQL_RES *result = mysql_store_result(handle); if (!result) { return scope.Close(False()); } unsigned int num_fields = mysql_num_fields(result); MYSQL_FIELD *fields = mysql_fetch_fields(result); MYSQL_ROW row = mysql_fetch_row(result); unsigned long *lengths = mysql_fetch_lengths(result); JSOBJ o = Object::New(); for (unsigned int i=0; i<num_fields; i++) { if (row[i] == NULL) { o->Set(String::New(fields[i].name), Null()); } else { switch (fields[i].type) { case MYSQL_TYPE_TINY: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_SHORT: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_LONG: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_FLOAT: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_DOUBLE: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_NULL: o->Set(String::New(fields[i].name), Null()); break; case MYSQL_TYPE_TIMESTAMP: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_LONGLONG: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_INT24: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; default: o->Set(String::New(fields[i].name), String::New(row[i], lengths[i])); break; } } } mysql_free_result(result); return scope.Close(o); }
static JSVAL fetch_row(JSARGS args) { HandleScope scope; MYSQL_RES *result = (MYSQL_RES *) args[0]->IntegerValue(); MYSQL_ROW row = mysql_fetch_row(result); if (!row) { return scope.Close(Null()); } unsigned int num_fields = mysql_num_fields(result); unsigned long *lengths = mysql_fetch_lengths(result); MYSQL_FIELD *fields = mysql_fetch_fields(result); JSOBJ o = Object::New(); for (unsigned int i=0; i<num_fields; i++) { if (row[i] == NULL) { o->Set(String::New(fields[i].name), Null()); } else { switch (fields[i].type) { case MYSQL_TYPE_TINY: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_SHORT: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_LONG: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_FLOAT: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_DOUBLE: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_NULL: o->Set(String::New(fields[i].name), Null()); break; case MYSQL_TYPE_TIMESTAMP: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_LONGLONG: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; case MYSQL_TYPE_INT24: o->Set(String::New(fields[i].name), Integer::New(atoi(row[i]))); break; default: o->Set(String::New(fields[i].name), String::New(row[i], lengths[i])); break; } } } return scope.Close(o); }