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 )