@ -49,10 +49,11 @@ static Datum PLyObject_ToComposite(PLyObToDatum *arg, int32 typmod, PyObject *pl
static Datum PLyObject_ToDatum ( PLyObToDatum * arg , int32 typmod , PyObject * plrv ) ;
static Datum PLyObject_ToDatum ( PLyObToDatum * arg , int32 typmod , PyObject * plrv ) ;
static Datum PLySequence_ToArray ( PLyObToDatum * arg , int32 typmod , PyObject * plrv ) ;
static Datum PLySequence_ToArray ( PLyObToDatum * arg , int32 typmod , PyObject * plrv ) ;
/* conversion from Python objects to heap tuples (used by triggers and SRFs) */
/* conversion from Python objects to composite Datums (used by triggers and SRFs) */
static HeapTuple PLyMapping_ToTuple ( PLyTypeInfo * info , TupleDesc desc , PyObject * mapping ) ;
static Datum PLyString_ToComposite ( PLyTypeInfo * info , TupleDesc desc , PyObject * string ) ;
static HeapTuple PLySequence_ToTuple ( PLyTypeInfo * info , TupleDesc desc , PyObject * sequence ) ;
static Datum PLyMapping_ToComposite ( PLyTypeInfo * info , TupleDesc desc , PyObject * mapping ) ;
static HeapTuple PLyGenericObject_ToTuple ( PLyTypeInfo * info , TupleDesc desc , PyObject * object ) ;
static Datum PLySequence_ToComposite ( PLyTypeInfo * info , TupleDesc desc , PyObject * sequence ) ;
static Datum PLyGenericObject_ToComposite ( PLyTypeInfo * info , TupleDesc desc , PyObject * object ) ;
/* make allocations in the TopMemoryContext */
/* make allocations in the TopMemoryContext */
static void perm_fmgr_info ( Oid functionId , FmgrInfo * finfo ) ;
static void perm_fmgr_info ( Oid functionId , FmgrInfo * finfo ) ;
@ -333,26 +334,28 @@ PLyDict_FromTuple(PLyTypeInfo *info, HeapTuple tuple, TupleDesc desc)
}
}
/*
/*
* Convert a Python object to a PostgreSQL tuple , using all supported
* Convert a Python object to a composite Datum , using all supported
* conversion methods : tuple as a sequence , as a mapping or as an object that
* conversion methods : composite as a string , as a sequence , as a mapping or
* has __getattr__ support .
* as an object that has __getattr__ support .
*/
*/
HeapTuple
Datum
PLyObject_ToTuple ( PLyTypeInfo * info , TupleDesc desc , PyObject * plrv )
PLyObject_ToCompositeDatum ( PLyTypeInfo * info , TupleDesc desc , PyObject * plrv )
{
{
HeapTuple tuple ;
Datum datum ;
if ( PySequence_Check ( plrv ) )
if ( PyString_Check ( plrv ) | | PyUnicode_Check ( plrv ) )
datum = PLyString_ToComposite ( info , desc , plrv ) ;
else if ( PySequence_Check ( plrv ) )
/* composite type as sequence (tuple, list etc) */
/* composite type as sequence (tuple, list etc) */
tuple = PLySequence_ToTuple ( info , desc , plrv ) ;
datum = PLySequence_ToComposit e( info , desc , plrv ) ;
else if ( PyMapping_Check ( plrv ) )
else if ( PyMapping_Check ( plrv ) )
/* composite type as mapping (currently only dict) */
/* composite type as mapping (currently only dict) */
tuple = PLyMapping_ToTupl e( info , desc , plrv ) ;
datum = PLyMapping_ToComposit e( info , desc , plrv ) ;
else
else
/* returned as smth, must provide method __getattr__(name) */
/* returned as smth, must provide method __getattr__(name) */
tuple = PLyGenericObject_ToTupl e( info , desc , plrv ) ;
datum = PLyGenericObject_ToComposit e( info , desc , plrv ) ;
return tuple ;
return datum ;
}
}
static void
static void
@ -681,7 +684,6 @@ PLyObject_ToBytea(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
static Datum
static Datum
PLyObject_ToComposite ( PLyObToDatum * arg , int32 typmod , PyObject * plrv )
PLyObject_ToComposite ( PLyObToDatum * arg , int32 typmod , PyObject * plrv )
{
{
HeapTuple tuple = NULL ;
Datum rv ;
Datum rv ;
PLyTypeInfo info ;
PLyTypeInfo info ;
TupleDesc desc ;
TupleDesc desc ;
@ -703,15 +705,10 @@ PLyObject_ToComposite(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
* that info instead of looking it up every time a tuple is returned from
* that info instead of looking it up every time a tuple is returned from
* the function .
* the function .
*/
*/
tuple = PLyObject_ToTuple ( & info , desc , plrv ) ;
rv = PLyObject_ToCompositeDatum ( & info , desc , plrv ) ;
PLy_typeinfo_dealloc ( & info ) ;
PLy_typeinfo_dealloc ( & info ) ;
if ( tuple ! = NULL )
rv = HeapTupleGetDatum ( tuple ) ;
else
rv = ( Datum ) NULL ;
return rv ;
return rv ;
}
}
@ -818,8 +815,27 @@ PLySequence_ToArray(PLyObToDatum *arg, int32 typmod, PyObject *plrv)
return PointerGetDatum ( array ) ;
return PointerGetDatum ( array ) ;
}
}
static HeapTuple
PLyMapping_ToTuple ( PLyTypeInfo * info , TupleDesc desc , PyObject * mapping )
static Datum
PLyString_ToComposite ( PLyTypeInfo * info , TupleDesc desc , PyObject * string )
{
HeapTuple typeTup ;
typeTup = SearchSysCache1 ( TYPEOID , ObjectIdGetDatum ( desc - > tdtypeid ) ) ;
if ( ! HeapTupleIsValid ( typeTup ) )
elog ( ERROR , " cache lookup failed for type %u " , desc - > tdtypeid ) ;
PLy_output_datum_func2 ( & info - > out . d , typeTup ) ;
ReleaseSysCache ( typeTup ) ;
ReleaseTupleDesc ( desc ) ;
return PLyObject_ToDatum ( & info - > out . d , info - > out . d . typmod , string ) ;
}
static Datum
PLyMapping_ToComposite ( PLyTypeInfo * info , TupleDesc desc , PyObject * mapping )
{
{
HeapTuple tuple ;
HeapTuple tuple ;
Datum * values ;
Datum * values ;
@ -887,12 +903,12 @@ PLyMapping_ToTuple(PLyTypeInfo *info, TupleDesc desc, PyObject *mapping)
pfree ( values ) ;
pfree ( values ) ;
pfree ( nulls ) ;
pfree ( nulls ) ;
return tuple ;
return HeapTupleGetDatum ( tuple ) ;
}
}
static HeapTuple
static Datum
PLySequence_ToTupl e ( PLyTypeInfo * info , TupleDesc desc , PyObject * sequence )
PLySequence_ToComposit e ( PLyTypeInfo * info , TupleDesc desc , PyObject * sequence )
{
{
HeapTuple tuple ;
HeapTuple tuple ;
Datum * values ;
Datum * values ;
@ -973,12 +989,12 @@ PLySequence_ToTuple(PLyTypeInfo *info, TupleDesc desc, PyObject *sequence)
pfree ( values ) ;
pfree ( values ) ;
pfree ( nulls ) ;
pfree ( nulls ) ;
return tuple ;
return HeapTupleGetDatum ( tuple ) ;
}
}
static HeapTuple
static Datum
PLyGenericObject_ToTupl e ( PLyTypeInfo * info , TupleDesc desc , PyObject * object )
PLyGenericObject_ToComposit e ( PLyTypeInfo * info , TupleDesc desc , PyObject * object )
{
{
HeapTuple tuple ;
HeapTuple tuple ;
Datum * values ;
Datum * values ;
@ -1045,7 +1061,7 @@ PLyGenericObject_ToTuple(PLyTypeInfo *info, TupleDesc desc, PyObject *object)
pfree ( values ) ;
pfree ( values ) ;
pfree ( nulls ) ;
pfree ( nulls ) ;
return tuple ;
return HeapTupleGetDatum ( tuple ) ;
}
}
/*
/*