/*
* call-seq:
* PGConn.quote( obj )
* PGConn.quote( obj ){ |obj| ... }
*
* If _obj_ is a +Number+, +String+, +Array+, +nil+, +true+, or +false+ then
* #quote returns a String representation of that object safe for use in PostgreSQL.
*
* If _obj_ is not one of the above classes and a block is supplied to #quote,
* the block is invoked, passing along the object. The return value from the
* block is returned as a string.
*
* If _obj_ is not one of the recognized classes and no block is supplied,
* a PGError is raised.
*/
static VALUE
pgconn_s_quote(self, obj)
VALUE self;
VALUE obj;
{
VALUE ret;
char *to;
long len;
long idx;
switch(TYPE(obj)) {
case T_STRING:
to = ALLOC_N(char, RSTRING(obj)->len * 2 + 2);
*to = '\'';
len = PQescapeString(to + 1, RSTRING(obj)->ptr, RSTRING(obj)->len);
*(to + len + 1) = '\'';
ret = rb_str_new(to, len + 2);
OBJ_INFECT(ret, obj);
free(to);
break;
case T_FIXNUM:
case T_BIGNUM:
case T_FLOAT:
ret = rb_obj_as_string(obj);
break;
case T_NIL:
ret = rb_str_new2("NULL");
break;
case T_TRUE:
ret = rb_str_new2("'t'");
break;
case T_FALSE:
ret = rb_str_new2("'f'");
break;
case T_ARRAY:
ret = rb_str_new(0,0);
len = RARRAY(obj)->len;
for(idx=0; idx<len; idx++) {
rb_str_concat(ret, pgconn_s_quote(self, rb_ary_entry(obj, idx)));
if (idx<len-1) {
rb_str_cat2(ret, ", ");
}
}
break;
default:
if (rb_block_given_p()==Qtrue) {
ret = rb_yield(obj);
} else {
rb_raise(rb_ePGError, "can't quote");
}
}
return ret;
}