IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lotus Notes Discussion :

Copie/Réplique de base en API C Domino


Sujet :

Lotus Notes

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Copie/Réplique de base en API C Domino
    Bonjour à tous,

    Je suis un problème d'archivage de base domino lourde, en l’occurrence le names - plusieurs centaines de millier de documents.

    L'idée est d'automatiser une copie d'un names via API pour palier à un problème de restauration trop lente et de garder en ligne un historique du names pour éventuellement corriger des erreurs humaine sur les fiche personnes ou autre.... on connait tous le souci.

    J'utilisais un petit outil développé en LS mais là la volumétrie est trop importante donc je voudrais passer en API pour accélérer le process et ne pas passer par une réplique.

    J'ai fouiné un peu et j'ai trouve les bout de code nécessaire mais j'ai un souci quand je fais tourner l'agent la copie des éléments de structure commence et un DrWatson vient se rappeler à moi. et crash client.!!!!! J'ai essayé sur une autre base et meme résultat la base commence à se remplir des éléments de structure et crash!..... j'ai donc testé avec une base vide.... et la miracle pas de souci... la copie marche....

    Voila si quelqu'un a une idée je suis preneur, ou si quelqu'un a déjà codé ce type de chose....
    je vous joint le code que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    Option Declare
    Type TIMEDATE
    	Innards(0 To 1) As Long
    End Type
    Type dbIdType
    	innards (0 To 1) As Long
    End Type
    Type DBREPLICAINFO
    	ID As TIMEDATE
    	Flags As Integer
    	CutoffInterval As Integer
    	Cutoff As TIMEDATE
    End Type
    Declare Function NSFDbOpen Lib "nnotes.dll" Alias "NSFDbOpen" _
    (Byval dbname As Lmbcs String, dbHandle As Long ) As Integer
    Declare Function NSFDbClose Lib "nnotes.dll" Alias "NSFDbClose" _
    (Byval dbHandle As Long ) As Integer
    Declare Function NSFDBReplicaInfoSet Lib "nnotes.dll" Alias "NSFDbReplicaInfoSet" _
    (Byval dbHandle As Long, replInfoStruct As DBREPLICAINFO) As Integer
    Declare Function NSFDBReplicaInfoGet Lib "nnotes.dll" Alias "NSFDbReplicaInfoGet" _
    (Byval dbHandle As Long, replInfoStruct As DBREPLICAINFO) As Integer
    Declare Function NSFDBCreate Lib "nnotes.dll" Alias "NSFDbCreate" _
    (Byval dbname As Lmbcs String, Byval dbClass As Single, Byval forceIt As Single) As Integer
    Declare Function NSFNoteDelete Lib "NNOTES.DLL" Alias "NSFNoteDelete" _
    (Byval dbHandle As Long, Byval noteid As Long, updateflags As Long) As Integer
    Declare Function NSFDbCopyACL Lib "nnotes.dll" Alias "NSFDbCopyACL" _
    (Byval dbHandle As Long, Byval dbHandle2 As Long ) As Integer
    Declare Function NSFDbIDGet Lib "nnotes.dll" Alias "NSFDbIDGet" _
    (Byval dbHandle As Long, DbID As dbidtype ) As Integer
    Declare Function TimeConstant Lib "nnotes.dll" Alias "TimeConstant" (Byval TimeConstantType As Integer, td As TIMEDATE) As Integer
    Declare Function NSFDbGetModifiedNoteTable Lib "nnotes.dll" Alias "NSFDbGetModifiedNoteTable" ( _
    Byval hDb As Long, _
    Byval NoteClassMask As Integer, _
    Byval Innards1 As Long, _
    Byval Innards2 As Long, _
    retUntil As TIMEDATE, _
    rethTable As Long _
    ) As Integer
    Declare Function NSFDbInfoGet Lib "nnotes.dll" Alias "NSFDbInfoGet" _
    (Byval hDB As Integer, Byval retBuffer As Lmbcs String) As Integer
    Declare Sub NSFDbInfoModify Lib "nnotes.dll" Alias "NSFDbInfoModify" _
    (Byval retBuffer As Lmbcs String, Byval Konst As Integer, Byval NewTemplateName As String)
    Declare Function NSFDbInfoSet Lib "nnotes.dll" Alias "NSFDbInfoSet" _
    ( Byval hDB As Integer, Byval retBuffer As Lmbcs String) As Integer
    
    Declare Function IDScan Lib "nnotes" Alias "IDScan" (Byval hTable As Long, Byval fFirst As Integer, retID As Long) As Integer
    Declare Function IDDestroyTable Lib "nnotes" Alias "IDDestroyTable" (Byval hTable As Long ) As Integer
    Declare Function NSFDbCopyNote Lib "nnotes" Alias "NSFDbCopyNote" (Byval input_handle As Long, DbID As dbidtype, _
    replInfoStruct As DBREPLICAINFO, Byval note_id As Long,Byval output_handle As Long, _
    DbID2 As dbidtype, replInfoStruct2 As DBREPLICAINFO, Byval LN5 As Long, Byval LN6 As Long) As Integer
    Declare Function NSFDbGetSpecialNoteID Lib "nnotes.dll" Alias "NSFDbGetSpecialNoteID"_
    (Byval dbhandle As Long, Byval NoteClass As Long, retNoteID As Long) As Integer
    
    
    ' *******************************************************************************************************************************
    Const DBCLASS_NOTEFILE = &Hff01
    Const UPDATE_NOSTUB= &H0200
    Const INFOPARSE_TITLE= 0
    Const INFOPARSE_DESIGN_CLASS = 3
    Const SPECIAL_ID_NOTE = &H8000 ' use in combination w/NOTE_CLASS when calling NSFDbGetSpecialNoteID 
    Const NOTE_CLASS_INFO = &H0002 ' notefile info (help-about) note 
    Const NOTE_CLASS_ICON = &H0010 ' icon note
    Const NOTE_CLASS_HELP = &H0100 ' designer's help note 
    Const NOTE_CLASS_ALL = &H7fff
    Const TIMEDATE_WILDCARD = 2
    
    Sub Initialize
    	
    	Dim var As Variant
    	Dim input_dbhandle As Long
    	Dim output_dbhandle As Long
    	Dim rc As Integer
    	Dim infoBuffer As DBREPLICAINFO
    	Dim DinfoBuffer As DBREPLICAINFO
    	Dim stexte As String, dtexte As String
    	Dim output_title As String
    	
    ' For NSFDbIDGet
    	Dim DBId_In As DbIDType
    	Dim DBId_Out As DbIDType
    	
    'For Function Time Constant
    	Dim tdStart As TIMEDATE, tdEnd As TIMEDATE, tdModified As TIMEDATE
    	Dim hTable As Long
    	
    	
    'For Function IdScan
    	Dim NoteID As Long
    	
    	Dim bFlag As Integer
    	
    	stexte = "G-EMA07/SRV/ALSTOM"+ "!!" + "wgcw/devs/blank.nsf"
    	'stexte = "HCE02/HCE/DTR/GECALSTHOM" + "!!" + "names.nsf"
    	dtexte = "copy_names_alsom.nsf"
    	
    ' Open the input database Server Source : ( stexte = sserver + pathname ) 
    	
    	rc = NSFDbOpen(stexte, input_dbhandle)
    	If rc <> 0 Then 
    		Print " Cannot open database erreur :" & rc 'erreur 
    		Exit Sub
    	End If
    	
    ' Create and open the desination database. dtexte 
    	
    ' Create Database destination 
    	rc = NSFDbCreate(dtexte, DBCLASS_NOTEFILE, 1)
    	If rc <> 0 Then 
    		Print " Cannot create database, erreur : " & rc 
    		Exit Sub
    	End If
    	
    'Ouverture Database sur le serveur Destination
    	
    	rc =NSFDbOpen(dtexte, output_dbhandle)
    	If rc <> 0 Then 
    		Print " Cannot open database erreur : " & rc 
    		Exit Sub
    	End If
    	
    ' Copy the replication settings (not the replication history) from
    'the input database to the output database. The replication settings
    'include the database replica ID. This makes the destination database
    'a replica copy of the source database.
    	
    'Get Replica Info on server source 
    	
    	rc = NSFDbReplicaInfoGet(input_dbhandle, infoBuffer)
    	If rc <> 0 Then 
    		Print " Cannot get replica info, erreur : " & rc 
    ' Fermeture des bases ouvertes pour libérer la mémoire 
    		NSFDbClose (input_dbhandle)
    		NSFDbClose (output_dbhandle)
    		Exit Sub
    	End If
    	
    ' Set replica on server destination
    	
    	rc = NSFDbReplicaInfoSet(output_dbhandle, DinfoBuffer)
    	If rc <> 0 Then 
    		Print " Cannot set repilca erreur : " & rc 
    ' Fermeture des bases ouvertes pour libérer la mémoire 
    		NSFDbClose (input_dbhandle)
    		NSFDbClose (output_dbhandle)
    		Exit Sub
    	End If
    	
    'Copy the ACL from the input database to the output database. 
    	
    	rc = NSFDbCopyACL(input_dbhandle, output_dbhandle)
    	If rc <> 0 Then 
    		Print " Cannot copy lca erreur : " & rc 
    ' Fermeture des bases ouvertes pour libérer la mémoire 
    		NSFDbClose (input_dbhandle)
    		NSFDbClose (output_dbhandle)
    		Exit Sub
    	End If
    	
    ' /* Set a time/date structure that will determine the date of the earliest
    'note copied in the next call. Use TimeConstant with TIMEDATE_WILDCARD
    'specified to indicate that we do not want any cutoff date. */
    	
    	rc = TimeConstant (TIMEDATE_WILDCARD, tdStart)
    	
    	
    'Do not use NSFDbCopy to copy all notes in the input database to the 
    ' output database. Such copies are not guaranteed to be replicas of 
    ' the original notes. Instead get an IDTABLE of all notes in the 
    ' database, use IDScan to obtain each NOTEID, and then call 
    ' NSFDbCopyNote to copy each note from one database to the other.
    	
    	rc= NSFDbIDGet (input_dbhandle, DBId_In)
    	rc= NSFDbIDGet (output_dbhandle, DBId_Out)
    	
    	'Get the NoteID table for all notes in the input database 
    	rc = NSFDbGetModifiedNoteTable( input_dbhandle, NOTE_CLASS_ALL, tdStart.Innards(0), tdStart.Innards(1), tdEnd, hTable )
    	If rc <> 0 Then 
    		Print " Cannot get all noteid documents : " & rc
    		NSFDbClose (input_dbhandle)
    		NSFDbClose (output_dbhandle)
    		
    	End If
    	
    	bFlag = True
    	
    	Do While IDScan( hTable, bFlag, NoteID )
    		
    		bFlag = False
    		rc = 0
    		
    		
    		If rc <> NSFDbCopyNote (input_dbhandle, DBId_In , infoBuffer , _
    		NoteID, output_dbhandle, DBId_Out, infoBuffer, 0, 0) Then
    			
    			' Destroy table
    			IDDestroyTable (hTable)
    			NSFDbClose (input_dbhandle)
    			NSFDbClose (output_dbhandle)
    			' Mettre la nature de l erreur retourné
    		End If	
    	Loop
    	
    	IDDestroyTable (hTable)
    	NSFDbClose (input_dbhandle )
    	NSFDbClose (output_dbhandle)
    End Sub

  2. #2
    Membre expérimenté
    Avatar de Jérôme Deniau
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2015
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 804
    Points : 1 434
    Points
    1 434
    Billets dans le blog
    32
    Par défaut Why not
    Mais comment se faire chier alors que Domino sait faire (utiliser sendconsoleCommand ou runonserver)

    1/ Ajouter CLUSTER_ADMIN_ON=1 sur le serveur Domino
    2/ Ensuite:
    CLCOPY serveurSourcer!!base.nsf serveurCible!!basedestination.nsf REPLICA


    C'est ensuite le serveur qui bosse et bizarrement ça va nettement plus vite..... que les serveurs soient en cluster ou non

  3. #3
    Membre expérimenté
    Avatar de Jérôme Deniau
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2015
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 804
    Points : 1 434
    Points
    1 434
    Billets dans le blog
    32
    Par défaut 3/ forcer une réplique
    tout est dans le sujet

  4. #4
    Membre expérimenté
    Avatar de Jérôme Deniau
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2015
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 804
    Points : 1 434
    Points
    1 434
    Billets dans le blog
    32
    Par défaut Et si on ne veut faire qu'une copie
    virer le mot clé REPLICA de la commande clcopy

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Merci
    Merci Jérome de ton aide.
    Je voulais éviter de passer par ce type d'action, certe plus rapide j'en convient, mais surtout pour éviter les problèmes éventuelle de remonter de réplication après.
    Je vais voir si par cette solution en version Copy je peux retrouver mes petits et traiter. Je vous dirais.

    Bonne journée!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    Bon après différents tests il se trouve que le problème vient du fait que la base doit être occupée.
    Après avoir refais les tests en local depuis une réplique ça marche nickel.

    Me reste a refaire les tests sur serveur. Le second interêt de cette solution c'est de faire des copies de type réplique très légères je passe de 6,7Go d’origine à 670Mo (Il n'y a pas d'index ni rien qui pollue la réplique) et de pouvoir les faire en dehors des répertoires Domino du serveur. Donc pas de souci de réplication.

  7. #7
    Membre expérimenté
    Avatar de Jérôme Deniau
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2015
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 804
    Points : 1 434
    Points
    1 434
    Billets dans le blog
    32
    Par défaut Question débile
    Tu testes en local et c'est OK?
    Ton Serveur Domino il est 32 ou 64 bits, juste pour savoir?

Discussions similaires

  1. Copie de 2 bases SQLserver en utilisant des fichiers
    Par dimdidi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/08/2005, 10h26
  2. Réponses: 5
    Dernier message: 08/07/2005, 14h10
  3. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows Forms
    Réponses: 5
    Dernier message: 20/12/2004, 23h39
  4. [C#] Copie de fichier via l'API
    Par slyv dans le forum Windows
    Réponses: 5
    Dernier message: 20/12/2004, 23h35
  5. copie d'nue base d'un post à un autre
    Par Gential dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/03/2004, 20h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo