Notes

 view release on metacpan or  search on metacpan

Database/Database.xs  view on Meta::CPAN

#define BLOCK Perl_BLOCK

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "notesdatabase.h"

MODULE = Notes::Database   PACKAGE = Notes::Session

PROTOTYPES: DISABLE

void
get_database( s, ln_server = "", ln_db_path, ln_network_port = NULL )
      LN_Session * s;
      char *       ln_db_path;
      char *       ln_server;
      char *       ln_network_port;
   PREINIT:
      d_LN_XSVARS;
      DBHANDLE      ln_db_handle;
      char          ln_db_path_canonical[ MAXPATH ];
      STATUS        ln_rc;
   ALIAS:
      get_database  = 0
      open_database = 0
      database      = 0
   PPCODE:
      ln_rc = OSPathNetConstruct(
                        ln_network_port,
                        ln_server,
                        ln_db_path,
                        ln_db_path_canonical
      					);
      if ( LN_IS_NOT_OK(s) )
      {
		  XSRETURN_NOT_OK;
	  }
      ln_rc = NSFDbOpen(
                    ln_db_path_canonical,
                    &ln_db_handle
      				);
      LN_SET_IVX(s, ln_rc);
      if ( LN_IS_NOT_OK(s) )
      {
		  XSRETURN_NOT_OK;
	  }

      LN_PUSH_NEW_OBJ( "Notes::Database", s );
      //printf("CREATED DBHANDLE: %ld\n", (long)ln_db_handle);
      LN_INIT_OBJ_STRUCT(NOTESDATABASE, ln_obj);
      LN_SET_DB_HANDLE(NOTESDATABASE, ln_obj, ln_db_handle);
      //printf("STORED DBHANDLE: %ld\n", (long)LN_DB_HANDLE(NOTESDATABASE,ln_obj));
      LN_SET_OK      ( ln_obj );
      XSRETURN       ( 1 );


void
create_database( s, ln_server = "", ln_db_path, bForceCreation = FALSE )
      LN_Session * s;
      char       * ln_db_path;
      char       * ln_server;
      BOOL         bForceCreation;
   PREINIT:
      d_LN_XSVARS;
      DBHANDLE      ln_db_handle;
      char          ln_db_path_canonical[ MAXPATH ];
      STATUS        ln_rc;
   ALIAS:
      createdatabase  = 0
   PPCODE:
      if ( LN_IS_NOT_OK(s) )
	  {
		  DEBUG(("Notes::Session object was not OK at line %d", __LINE__));
	      XSRETURN_NOT_OK;
	  }
	  ln_rc = OSPathNetConstruct(
	                NULL,
	                ln_server,
	                ln_db_path,
	                ln_db_path_canonical
	  				);
	  if (ln_rc != NOERROR)
	  {
		  DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	  	  XSRETURN_NOT_OK;
  	  }
      if (ln_rc = NSFDbCreate (ln_db_path_canonical, DBCLASS_NOTEFILE, bForceCreation))
	  {
		  DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
		  LN_SET_IVX(s, ln_rc);
	      XSRETURN_NOT_OK;
	  }
	  if (ln_rc = NSFDbOpen(ln_db_path_canonical, &ln_db_handle))
	  {
		  DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
		  LN_SET_IVX(s, ln_rc);
	      XSRETURN_UNDEF;
	  }
	  LN_SET_IVX     ( s, ln_rc);
      LN_PUSH_NEW_OBJ( "Notes::Database", s );
      //printf("CREATED DBHANDLE: %ld\n", (long)ln_db_handle);
	  LN_INIT_OBJ_STRUCT(NOTESDATABASE, ln_obj);
	  LN_SET_DB_HANDLE(NOTESDATABASE, ln_obj, ln_db_handle);
      //printf("STORED DBHANDLE: %ld\n", (long)LN_DB_HANDLE(NOTESDATABASE,ln_obj));
      LN_SET_OK      ( ln_obj );
      XSRETURN       ( 1 );


MODULE = Notes::Database		PACKAGE = Notes::Database


void
create_copy( db, ln_server = "", ln_db_path )
      LN_Database * db;
      char        * ln_db_path;
      char        * ln_server;
   PREINIT:
      d_LN_XSVARS;
      DBHANDLE      ln_dst_handle;
      char          ln_src_db_path[ MAXPATH ];
      char 			ln_dst_can_server[ MAXUSERNAME ];
      char          ln_db_path_canonical[ MAXPATH ];
      STATUS        ln_rc;
   ALIAS:
      createcopy  = 0
      createfromtemplate = 1
      create_from_template = 1
      createreplica = 2
      create_replica = 2
   PPCODE:
      if ( LN_IS_NOT_OK(db) )
	  {
		  DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
	      XSRETURN_NOT_OK;
	  }
	  ln_rc = DNCanonicalize( 0L, NULL, ln_server, (char FAR*)ln_dst_can_server,
     	    						MAXUSERNAME, NULL);
	  ln_rc = OSPathNetConstruct(
	                NULL,
	                ln_dst_can_server,
	                ln_db_path,
	                ln_db_path_canonical
	  				);
	  if (ln_rc != NOERROR)
	  {
		  DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	  	  XSRETURN_NOT_OK;
  	  }

	  ln_rc = NSFDbPathGet( LN_DB_HANDLE(NOTESDATABASE,db), NULL, ln_src_db_path );
	  if (ln_rc != NOERROR)
	  {
		  DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	  	  XSRETURN_NOT_OK;
  	  }

	  LN_SET_IVX(db, ln_rc);
	  if ( LN_IS_OK(db) )
      {
	  	  switch( ix )
	      {
              case   0: ln_rc = NSFDbCreateAndCopy(ln_src_db_path, ln_db_path_canonical, NOTE_CLASS_ALL, 0, 0, &ln_dst_handle);
                        break;
              case   1: ln_rc = NSFDbCreateAndCopy(ln_src_db_path, ln_db_path_canonical, NOTE_CLASS_ALLNONDATA, 0, 0, &ln_dst_handle);
	                    break;
	          case   2: ln_rc = NSFDbCreateAndCopy(ln_src_db_path, ln_db_path_canonical, NOTE_CLASS_ALL, 0, DBCOPY_REPLICA, &ln_dst_handle);
	                    break;
	          default:  XSRETURN_NOT_OK;
	                    break;
	      }
      }
      else
      {
	      XSRETURN_NOT_OK;
	  }
      LN_SET_IVX( db, ln_rc);
      if ( LN_IS_NOT_OK(db) )
	  {
		  DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
	      XSRETURN_NOT_OK;
	  }

      LN_PUSH_NEW_OBJ( "Notes::Database", db );
      //printf("CREATED DBHANDLE: %ld\n", (long)ln_dst_handle);
	  LN_INIT_OBJ_STRUCT(NOTESDATABASE, ln_obj);
	  LN_SET_DB_HANDLE(NOTESDATABASE, ln_obj, ln_dst_handle);
      //printf("STORED DBHANDLE: %ld\n", (long)LN_DB_HANDLE(NOTESDATABASE,ln_obj));
      LN_SET_OK      ( ln_obj );
      XSRETURN       ( 1 );


void
DESTROY( db )
      LN_Database *   db;
   PREINIT:
      STATUS          ln_rc;
   PPCODE:
      //printf("CLOSING DBHANDLE: %ld\n", LN_DB_HANDLE(NOTESDATABASE, db));
      ln_rc = NSFDbClose( LN_DB_HANDLE(NOTESDATABASE, db) );
      LN_FREE_OBJ_STRUCT(NOTESDATABASE, db);
      //LN_SET_PARENT_IVX( db, ln_rc );
      XSRETURN( 0 );


void
filename( db )
      LN_Database *   db;
   PREINIT:
      char            ln_canonical_path[ MAXPATH ];
      char            ln_expanded_path [ MAXPATH ];
      STATUS          ln_rc;
   ALIAS:
      filename		  = 0
      canonical_path  = 0
      expanded_path   = 1
      path            = 1
      filepath        = 1
   PPCODE:
      ln_rc = NSFDbPathGet( LN_DB_HANDLE(NOTESDATABASE,db), ln_canonical_path, ln_expanded_path );
      LN_SET_IVX(db, ln_rc);
      if ( LN_IS_OK(db) )
      {
         switch( ix )
         {
            case   0: XPUSHs(sv_2mortal(newSVpv(ln_canonical_path, 0)));
                      XSRETURN( 1 );
                      break;
            case   1: XPUSHs(sv_2mortal(newSVpv(ln_expanded_path,  0)));
                      XSRETURN( 1 );
                      break;
            default:  XSRETURN_NOT_OK;
                      break;
         }
      }
      else
      {
		  DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		  XSRETURN_NOT_OK;
	  }


void
title( db )
      LN_Database *   db;
   PREINIT:
      char            ln_buffer[NSF_INFO_SIZE];    /* database info buffer */
      char            ln_value[NSF_INFO_SIZE];     /* database title */
      STATUS          ln_rc;
   ALIAS:
      title = 0
      categories = 1
      template = 2
      inherited_template = 3
   PPCODE:
    /* Get the database buffer. */
    ln_rc = NSFDbInfoGet (LN_DB_HANDLE(NOTESDATABASE,db), ln_buffer);
    LN_SET_IVX(db, ln_rc);
	if ( LN_IS_NOT_OK(db) )
	{
		DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		XSRETURN_NOT_OK;
	}

	switch( ix )
	{
	   	case  0:  NSFDbInfoParse (ln_buffer, INFOPARSE_TITLE, ln_value, NSF_INFO_SIZE - 1);
	              break;
	    case  1:  NSFDbInfoParse (ln_buffer, INFOPARSE_CATEGORIES, ln_value, NSF_INFO_SIZE - 1);
	              break;
	    case  2:  NSFDbInfoParse (ln_buffer, INFOPARSE_CLASS, ln_value, NSF_INFO_SIZE - 1);
	              break;
	    case  3:  NSFDbInfoParse (ln_buffer, INFOPARSE_DESIGN_CLASS, ln_value, NSF_INFO_SIZE - 1);
	              break;
	    default:  XSRETURN_NOT_OK;
	              break;
	}
	XPUSHs(sv_2mortal(newSVpv(ln_value, 0)));
	XSRETURN( 1 );

void
is_public_address_book( db )
      LN_Database *   db;
   PREINIT:
      char            ln_buffer[NSF_INFO_SIZE];    /* database info buffer */
      char            ln_value[NSF_INFO_SIZE];     /* database title */
      STATUS          ln_rc;
   ALIAS:
      is_public_address_book = 0
      is_personal_address_book = 1
   PPCODE:
    /* Get the database buffer. */
    ln_rc = NSFDbInfoGet (LN_DB_HANDLE(NOTESDATABASE,db), ln_buffer);
    LN_SET_IVX(db, ln_rc);
	if ( LN_IS_NOT_OK(db) )
	{
		DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		XSRETURN_NOT_OK;
	}
	NSFDbInfoParse (ln_buffer, INFOPARSE_DESIGN_CLASS, ln_value, NSF_INFO_SIZE - 1);

	switch( ix )
	{
	   	case  0:  if(strEQ(ln_value, PUBLIC_ADDRESSBOOK_TEMPLATE_NAME))
	   			  {
					  XSRETURN_YES;
			      }
	              break;
	    case  1:  if(strEQ(ln_value, PERSONAL_ADDRESSBOOK_TEMPLATE_NAME))
	              {
					  XSRETURN_YES;
			      }
	              break;
	    default:  XSRETURN_NOT_OK;
	              break;
	}
	XSRETURN_NO;

void
compact( db )
      LN_Database *   db;
   PREINIT:
      char            ln_db_path[MAXPATH];
      DWORD           stats[2];      /* status return code */
      STATUS          ln_rc;
   ALIAS:
      compact_mailbox = 1
      compactmailbox = 1
   PPCODE:
    if ( LN_IS_NOT_OK(db) )
	{
		DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		XSRETURN_NOT_OK;
	}

	/* Get the database path. */
    if(ln_rc = NSFDbPathGet(LN_DB_HANDLE(NOTESDATABASE,db), NULL, ln_db_path))
	{
		DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
		XSRETURN_NOT_OK;
	}
	switch( ix )
	{
	   	case  0:  ln_rc = NSFDbCompact (ln_db_path, 0, &stats[0]);
	              break;
	    case  1:  ln_rc = NSFDbCompact (ln_db_path, DBCOMPACT_MAILBOX, &stats[0]);
	              break;
	    default:  XSRETURN_NOT_OK;
	              break;
	}
	LN_SET_IVX(db, ln_rc);
	if ( LN_IS_NOT_OK(db) )
	{
		DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		XSRETURN_NOT_OK;
	}
	/* Return a perl array of the db size (in bytes)
	before and after compact() respectively. */
	XPUSHs(sv_2mortal(newSViv(stats[0])));
	XPUSHs(sv_2mortal(newSViv(stats[1])));
	XSRETURN( 2 );


void
current_access_level( db )
      LN_Database *   db;
   PREINIT:
      WORD			  wAccessLevel;
      WORD			  wAccessFlag;
   ALIAS:
      currentaccess = 0
      currentaccesslevel = 0
   PPCODE:
    if ( LN_IS_NOT_OK(db) )
	{
		DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		XSRETURN_NOT_OK;
	}

	NSFDbAccessGet(	LN_DB_HANDLE(NOTESDATABASE,db), &wAccessLevel, &wAccessFlag);

	/* Return a perl array of the ACCESS_LEVEL and
	ACCESS_FLAGS respectively. */
	XPUSHs(sv_2mortal(newSViv((IV)wAccessLevel)));
	XPUSHs(sv_2mortal(newSViv((IV)wAccessFlag)));
	XSRETURN( 2 );

void
server( db )
      LN_Database *   db;
   PREINIT:
      STATUS          ln_rc;
      char		   	  ln_db_path[ MAXPATH ];
      char		   	  ln_server[ MAXUSERNAME ];
      char		   	  ln_server_canonical[ MAXUSERNAME ];
   ALIAS:
      server_name = 0
      servername = 0
   PPCODE:
    if ( LN_IS_NOT_OK(db) )
	{
		DEBUG(("Notes::Database object was not OK at line %d", __LINE__));
		XSRETURN_NOT_OK;
	}

	if(ln_rc = NSFDbPathGet(LN_DB_HANDLE(NOTESDATABASE,db), NULL, ln_db_path ))
	{
		DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	    XSRETURN_NOT_OK;
  	}
  	if(ln_rc = OSPathNetParse(ln_db_path, NULL, ln_server, NULL))
	{
		DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	    XSRETURN_NOT_OK;
  	}
  	if(ln_rc = DNCanonicalize( 0L, NULL, ln_server, (char FAR *)ln_server_canonical,
	     	    			   MAXUSERNAME, NULL))
	{
		DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	    XSRETURN_NOT_OK;
  	}

	XPUSHs(sv_2mortal(newSVpv(ln_server_canonical,0)));
	XSRETURN( 1 );


void
is_encrypted(db)
      LN_Database *   db;
    PREINIT:
      int             ln_is_encrypted;
      STATUS          ln_rc;
    ALIAS:
      isencrypted = 0
      is_locally_encrypted = 0
    PPCODE:
      if(ln_rc = NSFDbIsLocallyEncrypted(LN_DB_HANDLE(NOTESDATABASE,db),&ln_is_encrypted))
      {
		  DEBUG(("Notes::Database object returning error %d at line %d", ln_rc, __LINE__));
	  	  XSRETURN_NOT_OK;
	  }
      if (ln_is_encrypted)
        XSRETURN_YES;
      else
        XSRETURN_NO;



( run in 0.607 second using v1.01-cache-2.11-cpan-5511b514fd6 )