Salesforce
view release on metacpan or search on metacpan
lib/Salesforce.pm view on Meta::CPAN
#=================================================================
#
# Copyright (C) 2003-2004 Byrne Reese (byrne at majordojo dot com)
# The Salesforce module is free software; you can redistribute
# it and/or modify it under the same terms as Perl itself.
#
#=================================================================
package Salesforce;
use Service;
$VERSION = 0.57;
##################################################################
# BEGIN PortType Definitions
# Notes:
package Salesforce::Soap;
use strict;
use Encode;
BEGIN {
use vars qw($PARAMS);
$PARAMS->{'login'} = { 'username' => 'SCALAR', 'password' => 'SCALAR', };
}
sub new {
my ($class) = shift;
my (%params) = @_;
bless {
"style" => 'document',
"transport" => 'http://schemas.xmlsoap.org/soap/http',
"address" => $params{'address'},
"encoding" => $params{'encoding'}
}, $class;
}
sub get_session_header {
my $self = shift;
return SOAP::Header->name( 'SessionHeader' =>
\SOAP::Header->name( 'sessionId' => $self->{'sessionId'} ) );
}
sub login {
my $self = shift;
my (%in) = @_;
my $client =
SOAP::Lite->deserializer( Salesforce::Deserializer->new )
->on_action( sub { return '""' } )->uri('urn:partner.soap.sforce.com')
->proxy( $self->{address} );
my $r = $client->login(
SOAP::Data->name( 'username' => $in{'username'} ),
SOAP::Data->name( 'password' => $in{'password'} )
);
die $r->faultstring() if $r->fault();
$self->{'sessionId'} = $r->valueof('//loginResponse/result/sessionId');
$self->{'serverUrl'} = $self->{'address'} =
$r->valueof('//loginResponse/result/serverUrl');
$self->{'userId'} = $r->valueof('//loginResponse/result/userId');
return 1;
}
sub query {
my $self = shift;
my (%in) = @_;
my $client =
SOAP::Lite->deserializer( Salesforce::Deserializer->new )
->on_action( sub { return '""' } )->uri('urn:partner.soap.sforce.com')
->proxy( $self->{address} );
my $r = $client->query(
$self->get_session_header(),
SOAP::Data->name( 'query' => $in{'query'} ),
SOAP::Header->name(
'QueryOptions' => \SOAP::Header->name( 'batchSize' => $in{'limit'} )
)
);
return $r;
}
sub queryMore {
my $self = shift;
my (%in) = @_;
my $client =
SOAP::Lite->deserializer( Salesforce::Deserializer->new )
->on_action( sub { return '""' } )->uri('urn:partner.soap.sforce.com')
->proxy( $self->{address} );
my $r = $client->queryMore(
$self->get_session_header(),
SOAP::Data->name( 'queryLocator' => $in{'queryLocator'} ),
SOAP::Header->name(
'QueryOptions' => \SOAP::Header->name( 'batchSize' => $in{'limit'} )
)
);
return $r;
}
sub xml_encode {
my ( $self, $string ) = @_;
if ( defined $self->{'encoding'} and length( $self->{'encoding'} ) > 0 ) {
my @array = split( //, Encode::decode( $self->{'encoding'}, $string ) );
my $str;
foreach my $c (@array) {
$str .= sprintf( "&#x%x;", ord($c) );
}
return $str;
}
else {
return $string;
}
}
sub update {
my $self = shift;
my (%in) = @_;
my $client =
SOAP::Lite->readable(1)->deserializer( Salesforce::Deserializer->new )
->on_action( sub { return '""' } )->uri('urn:partner.soap.sforce.com')
->proxy( $self->{address} );
my $method =
SOAP::Data->name("update")->prefix("sforce")
->uri("urn:partner.soap.sforce.com")
->attr( { 'xmlns:sfons' => 'urn:sobject.partner.soap.sforce.com' } );
my $type = $in{'type'};
delete( $in{'type'} );
my $id = $in{'id'};
delete( $in{'id'} );
my @elems;
push @elems,
SOAP::Data->prefix('sforce')->name( 'Id' => $id )->type('sforce:ID');
foreach my $key ( keys %in ) {
my $val = $in{$key};
my $typ = $Salesforce::Constants::TYPES{$type}->{$key};
if ( $typ eq 'xsd:string' ) {
$val = $self->xml_encode( $in{$key} );
}
elsif ( !defined $typ || length($typ) == 0 ) {
$typ = 'xsd:string';
$val = $self->xml_encode( $in{$key} );
}
push @elems,
SOAP::Data->prefix('sforce')->name( $key => $val )->type($typ);
#push @elems, SOAP::Data->prefix('sforce')->name($key => $in{$key})->type($Salesforce::Constants::TYPES{$type}->{$key});
}
( run in 2.695 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )