archiver.m
上传用户:shenzhenrh
上传日期:2013-05-12
资源大小:2904k
文件大小:12k
源码类别:

信息检索与抽取

开发平台:

Unix_Linux

  1. #import <simtools.h>
  2. #import <defobj.h>
  3. #import <defobj/Create.h>
  4. #import <defobj/Zone.h> // getZone
  5. #include <swarmconfig.h>
  6. #include <misc.h> // xmalloc, sprintf, sscanf
  7. #define OBJNAME "myObj"
  8. #define COLLNAME "collection"
  9. #define STRVAL "str"
  10. #define INTVAL -100
  11. #define UNSIGNEDVAL 100
  12. #define SHORTVAL -10
  13. #define USHORTVAL 10
  14. #define LONGVAL -10000
  15. #define ULONGVAL 10000
  16. #define FLOATVAL 500.0
  17. #define DOUBLEVAL 500000.0
  18. #define COUNT 10
  19. #define COMPONENT_STRVAL "Foo Bar"
  20. @interface Key: CreateDrop
  21. {
  22.   unsigned offset;
  23.   const char *key;
  24. }
  25. - setOffset: (unsigned)offset;
  26. - (int)getOffset;
  27. - createEnd;
  28. @end
  29. @implementation Key
  30. - setOffset: (unsigned)theOffset
  31. {
  32.   offset = theOffset;
  33.   return self;
  34. }
  35. - createEnd
  36. {
  37.   char buf[3 + DSIZE(int) + 1];
  38.   
  39.   sprintf (buf, "key%d", offset);
  40.   key = strdup (buf);
  41.   return self;
  42. }
  43. - (int)getOffset
  44. {
  45.   return offset;
  46. }
  47. @end
  48. @interface MyObj: CreateDrop
  49. {
  50.   const char *name;
  51. }
  52. + createBegin: aZone;
  53. - (const char *)getName;
  54. @end
  55. @implementation MyObj
  56. + createBegin: aZone
  57. {
  58.   MyObj *obj = [super createBegin: aZone];
  59.   obj->name = COMPONENT_STRVAL;
  60.   return obj;
  61. }
  62. - (const char *)getName
  63. {
  64.   return name;
  65. }
  66. @end
  67. @interface MyClass: CreateDrop
  68. {
  69.   const char *strVal;
  70.   int intVal;
  71.   unsigned unsignedVal;
  72.   short shortVal;
  73.   unsigned short ushortVal;
  74.   long longVal;
  75.   unsigned long ulongVal;
  76.   float floatVal;
  77.   double doubleVal;
  78.   BOOL deepFlag;
  79.   BOOL updateFlag;
  80.   unsigned offset;
  81. }
  82. - setDeepFlag: (BOOL)deepFlag;
  83. - setUpdateFlag: (BOOL)updateFlag;
  84. - setOffset: (unsigned)offset;
  85. - adjustToOffset;
  86. - updateArchiver: archiver;
  87. - (int)getOffset;
  88. - (BOOL)checkObject;
  89. - (void)describe: stream;
  90. @end
  91. @implementation MyClass
  92. + createBegin: aZone
  93. {
  94.   MyClass *obj = [super createBegin: aZone];
  95.   obj->strVal = STRVAL;
  96.   obj->intVal = INTVAL;
  97.   obj->unsignedVal = UNSIGNEDVAL;
  98.   obj->shortVal = SHORTVAL;
  99.   obj->ushortVal = USHORTVAL;
  100.   obj->longVal = LONGVAL;
  101.   obj->ulongVal = ULONGVAL;
  102.   obj->floatVal = FLOATVAL;
  103.   obj->doubleVal = DOUBLEVAL;
  104.   return obj;
  105. }
  106. - setDeepFlag: (BOOL)theDeepFlag
  107. {
  108.   deepFlag = theDeepFlag;
  109.   return self;
  110. }
  111. - setUpdateFlag: (BOOL)theUpdateFlag
  112. {
  113.   updateFlag = theUpdateFlag;
  114.   return self;
  115. }
  116. - setOffset: (unsigned)theOffset
  117. {
  118.   offset = theOffset;
  119.   return self;
  120. }
  121. - adjustToOffset
  122. {
  123.   {
  124.     char *newStr = xmalloc (strlen (strVal) + 1 + DSIZE (unsigned) + 1);
  125.     sprintf (newStr, "%s %d", strVal, offset);
  126.     strVal = newStr;
  127.   }
  128.   intVal += offset;
  129.   unsignedVal += offset;
  130.   shortVal += offset;
  131.   ushortVal += offset;
  132.   longVal += offset;
  133.   ulongVal += offset;
  134.   floatVal += offset;
  135.   doubleVal += offset;
  136.   return self;
  137. }
  138. - updateArchiver: archiver
  139. {
  140.   if (updateFlag)
  141.     {
  142.       if (deepFlag)
  143.         [archiver putDeep: OBJNAME object: self];
  144.       else
  145.         [archiver putShallow: OBJNAME object: self];
  146.     }
  147.   return self;
  148. }
  149. - (int)getOffset
  150. {
  151.   return offset;
  152. }
  153. - (BOOL)checkObject
  154. {
  155.   {
  156.     char *buf = strdup (strVal);
  157.     char *pos = strchr (buf, ' ');
  158.     int strNum = atoi (pos + 1);
  159.   
  160.     *pos = '';
  161.     if (strcmp (buf, STRVAL) != 0)
  162.       return NO;
  163.     if (strNum != offset)
  164.       return NO;
  165.   }
  166.   if (intVal - offset != INTVAL)
  167.     return NO;
  168.   if (unsignedVal - offset != UNSIGNEDVAL)
  169.     return NO;
  170.   if (shortVal - offset != SHORTVAL)
  171.     return NO;
  172.   if (ushortVal - offset != USHORTVAL)
  173.     return NO;
  174.   if (longVal - offset != LONGVAL)
  175.     return NO;
  176.   if (ulongVal - offset != ULONGVAL)
  177.     return NO;
  178.   if (floatVal - offset != FLOATVAL)
  179.     return NO;
  180.   if (doubleVal - offset != DOUBLEVAL)
  181.     return NO;
  182.   return YES;
  183. }
  184. - (void)describe: stream
  185. {
  186.   [stream catC: strVal];
  187.   [stream catC: " "];
  188.   [stream catInt: intVal];
  189.   [stream catC: " "];
  190.   [stream catUnsigned: unsignedVal];
  191.   [stream catC: " "];
  192.   [stream catUnsignedShort: ushortVal];
  193.   [stream catC: " "];
  194.   [stream catLong: longVal];
  195.   [stream catC: " "];
  196.   [stream catUnsignedLong: ulongVal];
  197.   [stream catC: " "];
  198.   [stream catFloat: floatVal];
  199.   [stream catC: " "];
  200.   [stream catDouble: doubleVal];
  201.   [stream catC: " "];
  202.   [stream catBoolean: deepFlag];
  203.   [stream catC: " "];
  204.   [stream catBoolean: updateFlag];
  205.   [stream catC: " "];
  206.   [stream catUnsigned: offset];
  207.   [stream catC: "n"];
  208. }
  209. @end
  210. @interface MyClassDeep: MyClass
  211. {
  212.   id objVal;
  213. }
  214. + createBegin: aZone;
  215. - (BOOL)checkObject;
  216. @end
  217. @implementation MyClassDeep
  218. + createBegin: aZone
  219. {
  220.   MyClassDeep *obj = [super createBegin: aZone];
  221.   obj->objVal = [MyObj create: aZone];
  222.   return obj;
  223. }
  224. - (BOOL)checkObject
  225. {
  226.   if (![super checkObject])
  227.     return NO;
  228.   
  229.   return strcmp ([objVal getName], COMPONENT_STRVAL) == 0;
  230. }
  231. @end
  232. @interface Controller: CreateDrop
  233. {
  234.   BOOL hdf5Flag;
  235.   BOOL inhibitLoadFlag;
  236.   BOOL deepFlag;
  237.   BOOL mapFlag;
  238.   BOOL updateFlag;
  239.   id myArchiver;
  240.   id coll;
  241. }
  242. - createEnd;
  243. - updateArchiver: archiver;
  244. - setHDF5Flag: (BOOL)hdf5Flag;
  245. - setDeepFlag: (BOOL)deepFlag;
  246. - setUpdateFlag: (BOOL)updateFlag;
  247. - setInhibitLoadFlag: (BOOL)inhibitLoadFlag;
  248. - setMapFlag: (BOOL)mapFlag;
  249. - (BOOL)loadAndCheckCollection;
  250. - createCollectionAndSave;
  251. - updateArchiver: archiver;
  252. @end
  253. @implementation Controller
  254. - setHDF5Flag: (BOOL)theHDF5Flag
  255. {
  256.   hdf5Flag = theHDF5Flag;
  257.   return self;
  258. }
  259. - setInhibitLoadFlag: (BOOL)theInhibitLoadFlag
  260. {
  261.   inhibitLoadFlag = theInhibitLoadFlag;
  262.   return self;
  263. }
  264. - setDeepFlag: (BOOL)theDeepFlag
  265. {
  266.   deepFlag = theDeepFlag;
  267.   return self;
  268. }
  269. - setUpdateFlag: (BOOL)theUpdateFlag
  270. {
  271.   updateFlag = theUpdateFlag;
  272.   return self;
  273. }
  274. - setMapFlag: (BOOL)theMapFlag
  275. {
  276.   mapFlag = theMapFlag;
  277.   return self;
  278. }
  279. - createEnd
  280. {
  281.   id aZone = getZone (self);
  282.   if (hdf5Flag)
  283.     myArchiver = [[[[HDF5Archiver createBegin: aZone]
  284.                      setPath:
  285.                        (mapFlag
  286.                         ? (deepFlag ? "deepMap.hdf" : "shallowMap.hdf")
  287.                         : (deepFlag ? "deepList.hdf" : "shallowList.hdf"))]
  288.                     setInhibitLoadFlag: inhibitLoadFlag]
  289.                    createEnd];
  290.   else
  291.     myArchiver = [[[[LispArchiver createBegin: aZone]
  292.                      setPath:
  293.                        (mapFlag
  294.                         ? (deepFlag ? "deepMap.scm" : "shallowMap.scm")
  295.                         : (deepFlag ? "deepList.scm" : "shallowList.scm"))]
  296.                     setInhibitLoadFlag: inhibitLoadFlag]
  297.                    createEnd];
  298.   if (mapFlag)
  299.     coll = (deepFlag
  300.             ? [Map create: aZone]
  301.             : [[[Map createBegin: aZone] setCompareCStrings] createEnd]);
  302.   else
  303.     coll = [List create: aZone];
  304.   [myArchiver registerClient: self];
  305.   return self;
  306. }
  307. - updateArchiver: archiver
  308. {
  309.   if (updateFlag)
  310.     {
  311.       if (deepFlag)
  312.         [archiver putDeep: COLLNAME object: coll];
  313.       else
  314.         [archiver putShallow: COLLNAME object: coll];
  315.     }
  316.   return self;
  317. }
  318. - createCollectionAndSave
  319. {
  320.   unsigned i;
  321.   id aZone = getZone (self);
  322.   for (i = 0; i < COUNT; i++)
  323.     {
  324.       id obj;
  325.       
  326.       if (deepFlag)
  327.         obj = [[[[[MyClassDeep createBegin: aZone]
  328.                   setDeepFlag: YES]
  329.                   setUpdateFlag: updateFlag]
  330.                  setOffset: i]
  331.                 createEnd];
  332.       else
  333.         obj = [[[[[MyClass createBegin: aZone]
  334.                    setDeepFlag: NO]
  335.                   setUpdateFlag: updateFlag]
  336.                  setOffset: i]
  337.                 createEnd];
  338.       [obj adjustToOffset];
  339.       if (mapFlag)
  340.         {
  341.           if (deepFlag)
  342.             {
  343.               id key = [[[Key createBegin: aZone] setOffset: i] createEnd];
  344.               [coll at: key insert: obj];
  345.             }
  346.           else
  347.             {
  348.               char buf[3 + DSIZE(unsigned) + 1];
  349.               sprintf (buf, "key%d", i);
  350.               [coll at: (id) strdup (buf) insert: obj];
  351.             }
  352.         }
  353.       else
  354.         [coll addLast: obj];
  355.     }
  356.   [myArchiver sync];
  357.   return self;
  358. }
  359. - (BOOL)loadAndCheckCollection
  360. {
  361.   id aZone = getZone (self);
  362.   id obj;
  363.   BOOL ret = YES;
  364.   coll = [myArchiver getObject: COLLNAME];
  365.   if ([coll getCount] != COUNT)
  366.     {
  367.       raiseEvent (WarningMessage,
  368.                   "collection not right size: %u vs %un",
  369.                   [coll getCount], COUNT);
  370.       return NO;
  371.     }
  372.   if (mapFlag)
  373.     {
  374.       if (deepFlag)
  375.         {
  376.           id key;
  377.           id <MapIndex> mi = [coll begin: aZone];
  378.           while ((obj = [mi next: &key]))
  379.             {
  380.               if (![obj checkObject])
  381.                 {
  382.                   ret = NO;
  383.                   break;
  384.                 }
  385.               if ([key getOffset] != [obj getOffset])
  386.                 {
  387.                   ret = NO;
  388.                   break;
  389.                 }
  390.             }
  391.           [mi drop];
  392.         }
  393.       else
  394.         {
  395.           const char *key;
  396.           id <MapIndex> mi = [coll begin: aZone];
  397.           while ((obj = [mi next: (id *) &key]))
  398.             {
  399.               if (![obj checkObject])
  400.                 {
  401.                   ret = NO;
  402.                   break;
  403.                 }
  404.               {
  405.                 char buf[3 + DSIZE(int) + 1];
  406.                 sprintf (buf, "key%d", [obj getOffset]);
  407.                 if (strcmp (key, buf) != 0)
  408.                   {
  409.                     ret = NO;
  410.                     break;
  411.                   }
  412.               }
  413.             }
  414.           [mi drop];
  415.         }
  416.     }
  417.   else
  418.     {
  419.       id <Index> li = [coll begin: aZone];
  420.       while ((obj = [li next]))
  421.         {
  422.           if (![obj checkObject])
  423.             {
  424.               ret = NO;
  425.               break;
  426.             }
  427.         }
  428.       [li drop];
  429.     }
  430.   return ret;
  431. }
  432. - (void)drop
  433. {
  434.   [myArchiver unregisterClient: self];
  435.   [coll deleteAll];
  436.   [coll drop];
  437.   [myArchiver drop];
  438.   [super drop];
  439. }
  440. @end
  441.  
  442. static BOOL
  443. checkArchiver (id aZone, BOOL hdf5Flag, BOOL deepFlag, BOOL mapFlag, 
  444.                BOOL updateFlag)
  445. {
  446.   id controller;
  447.   BOOL ret;
  448.   
  449.   controller = [[[[[[[Controller createBegin: aZone]
  450.                       setHDF5Flag: hdf5Flag]
  451.                      setMapFlag: mapFlag]
  452.                     setDeepFlag: deepFlag]
  453.                    setUpdateFlag: updateFlag]
  454.                   setInhibitLoadFlag: (updateFlag ? YES: NO)]
  455.                  createEnd];
  456.   
  457.   [controller createCollectionAndSave];
  458.   [controller drop];
  459.   controller = [[[[[[[Controller createBegin: aZone]
  460.                       setHDF5Flag: hdf5Flag]
  461.                      setMapFlag: mapFlag]
  462.                     setDeepFlag: deepFlag]
  463.                    setUpdateFlag: updateFlag]
  464.                   setInhibitLoadFlag: NO]
  465.                  createEnd];
  466.   ret = [controller loadAndCheckCollection];
  467.   [controller drop];
  468.   
  469.   return ret;
  470. }
  471. int
  472. main (int argc, const char **argv)
  473. {
  474.   initSwarmBatch (argc, argv);
  475.   if (checkArchiver (globalZone, NO, NO, NO, YES) == NO)
  476.     raiseEvent (InternalError, 
  477.                 "Shallow Lisp List serialization with update failed");
  478.   if (checkArchiver (globalZone, NO, NO, NO, NO) == NO)
  479.     raiseEvent (InternalError, 
  480.                 "Shallow Lisp List serialization without update failed");
  481.   if (checkArchiver (globalZone, NO, YES, NO, YES) == NO)
  482.     raiseEvent (InternalError, 
  483.                 "Deep Lisp List serialization with update failed");
  484.   if (checkArchiver (globalZone, NO, YES, NO, NO) == NO)
  485.     raiseEvent (InternalError, 
  486.                 "Deep Lisp List serialization without update failed");
  487.   if (checkArchiver (globalZone, NO, NO, YES, YES) == NO)
  488.     raiseEvent (InternalError, 
  489.                 "Shallow Lisp Map serialization with update failed");
  490.   if (checkArchiver (globalZone, NO, NO, YES, NO) == NO)
  491.     raiseEvent (InternalError, 
  492.                 "Shallow Lisp Map serialization without update failed");
  493.   if (checkArchiver (globalZone, NO, YES, YES, YES) == NO)
  494.     raiseEvent (InternalError, 
  495.                 "Deep Lisp Map serialization with update failed");
  496.   if (checkArchiver (globalZone, NO, YES, YES, NO) == NO)
  497.     raiseEvent (InternalError, 
  498.                 "Deep Lisp Map serialization without update failed");
  499. #ifdef HAVE_HDF5
  500.   if (checkArchiver (globalZone, YES, NO, NO, YES) == NO)
  501.     raiseEvent (InternalError, "Shallow HDF5 List serialization failed");
  502.   if (checkArchiver (globalZone, YES, YES, NO, YES) == NO)
  503.     raiseEvent (InternalError, "Deep HDF5 List serialization failed");
  504.   if (checkArchiver (globalZone, YES, NO, YES, YES) == NO)
  505.     raiseEvent (InternalError, "Shallow HDF5 Map serialization failed");
  506.   if (checkArchiver (globalZone, YES, YES, YES, YES) == NO)
  507.     raiseEvent (InternalError, "Deep HDF5 Map serialization failed");
  508. #endif
  509.   return 0;
  510. }