/*
 * 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 andno 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:
      ret = quote_string(obj);
      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;
}