error while database is on windows file server

View: New views
2 Messages — Rating Filter:   Alert me  

error while database is on windows file server

by Florent Lejeune :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi

We use Metakit to store miscellaneous information for our programe. It works on windows,
macosx and linux.
It happens that when the database is created on the windows network, we have some problem
with the windows application (we use metakit-2.4.9.6).

Below you will find a program that creates a file, adds rows, and retrieves information.

The Find function doesn't return anything and a manuel search also gives no result. In our
main program, the Find() function remains in an infinite loop.
It works fine with other plateform combinations : from windows client to simple windows
sharing, from macosx client to windows file server and from macosx client to macosx apple share
file server.

Thanks for any suggestion about this.

PS: our windows file server is a macosx with Samba. we compile with visual studio 2005

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <mk4.h>


void main(int argc, char **argv)
{
   char dbpath[100]="";
   printf("Choose a db destination :\n\n");
   printf("1 -  Local\n");
   printf("2 -  Network : Windows file server\n");
   printf("3 -  Network : Windows sharing\n\n");

   switch (getche())
   {
     case '1':
       strcpy(dbpath,"c:\\zdrop\\metakit_tutorial.db");
       break;
     case '2':
       strcpy(dbpath,"\\\\Noe\\Developpement\\metakit_tutorial.db");
       break;
     case '3':
       strcpy(dbpath,"\\\\Ordiludovic\\partageArticque\\metakit_tutorial.db");
       break;
     default:
       break;
   }
   printf("\n");
   if (strlen(dbpath)>0)
   {
     fflush(stdin);
     FILE *fp=NULL;
     // remove if present
     if ((fp=fopen(dbpath,"r"))!=NULL)
     {
       fclose(fp);
       unlink(dbpath);
     }
     // create db
     c4_Storage database(dbpath, true);
     // add datas
     c4_View maps=database.GetAs("maps[mid:S,mwidth:I,mheight:I,mpath:S]");
     c4_StringProp mid("mid"),mpath("mpath");
     c4_IntProp mwidth("mwidth"),mheight("mheight");
     c4_Row maprow;
     mid(maprow)="A";
     mwidth(maprow)=10;
     mheight(maprow)=10;
     mpath(maprow)="/home/MapA.vxf";
     maps.Add(maprow);
     mid(maprow)="B";
     mwidth(maprow)=20;
     mheight(maprow)=20;
     mpath(maprow)="/home/MapB.vxf";
     maps.Add(maprow);
     mid(maprow)="C";
     mwidth(maprow)=30;
     mheight(maprow)=30;
     mpath(maprow)="/home/MapC.vxf";
     maps.Add(maprow);
     // save
     database.Commit();

     // add more datas
     c4_View datas=database.GetAs("datas[did:S,dmapid:S,dpath:S]");
     // add data
     c4_StringProp did("did"),dmapid("dmapid"),dpath("dpath");
     c4_Row  datarow;
     did(datarow)="1";
     dmapid(datarow)="A";
     dpath(datarow)="/home/A1.txt";
     datas.Add(datarow);
     did(datarow)="2";
     dmapid(datarow)="A";
     dpath(datarow)="/home/A2.txt";
     datas.Add(datarow);
     did(datarow)="3";
     dmapid(datarow)="B";
     dpath(datarow)="/home/B1.txt";
     datas.Add(datarow);
     did(datarow)="4";
     dmapid(datarow)="B";
     dpath(datarow)="/home/B2.txt";
     datas.Add(datarow);
     did(datarow)="5";
     dmapid(datarow)="C";
     dpath(datarow)="/home/C1.txt";
     datas.Add(datarow);
     // save
     database.Commit();
     // Find data
     long idxsearch=-1;
     c4_Row findrow;
     dmapid(findrow)="B";
     while(1)
     {
       idxsearch=datas.Find(findrow,idxsearch+1);
       if (idxsearch>=0)
         printf("DATA %s has dmapid=%s\n",
           (const char*)dpath(datas[idxsearch]),
           (const char*)dmapid(datas[idxsearch]));
       else
         break;
     }
     // manuel search
     c4_Row strrow;
     const char*strdata;
     const char*expr="ome/B";
     for (int idx=0;idx<datas.GetSize();idx++)
     {
       strdata=(const char*)dpath(datas[idx]);
       if (strstr(strdata,expr)!=NULL)
         printf("map %s has the string '%s' in the path\n",strdata,expr);
     }


   }
   printf("Test over\n");
   getch();
}


--
Florent Lejeune
Développeur
 
Articque
Moulin des Roches
37230 Fondettes
France
web = http://www.articque.com
tel: +33 02 47 49 90 49
fax: +33 02 47 49 91 49
_____________________________________________
Metakit mailing list  -  Metakit@...
http://www.equi4.com/mailman/listinfo/metakit

Re: error while database is on windows file server

by Pat Thoyts-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

"Florent Lejeune" <flejeune@...> writes:

>Hi
>
>We use Metakit to store miscellaneous information for our programe. It works on windows,
>macosx and linux.
>It happens that when the database is created on the windows network, we have some problem
>with the windows application (we use metakit-2.4.9.6).
>
>Below you will find a program that creates a file, adds rows, and retrieves information.
>
>The Find function doesn't return anything and a manuel search also gives no result. In our
>main program, the Find() function remains in an infinite loop.
>It works fine with other plateform combinations : from windows client to simple windows
>sharing, from macosx client to windows file server and from macosx client to macosx apple share
>file server.
>
>Thanks for any suggestion about this.

You don't say what kind of problem you have with the network files but
I will make a guess that it sometimes produces corrupt metakit
databases. Metakit works by mapping the file into memory as a
read-only memory mapped file and when it saves any changes it
serializes the in-memory version to the file, unmaps and re-maps the
database. We found that when the file is on a network share the re-map
step doesn't re-map the new file, but instead maps the old image and
breaks everything.

The simplest solution I found was to ensure that if the file is mapped
to a network share that we open the windows file for exclusive
access. There are likely some longer posts about my bug hunt in the
archive for this list if this is relevant.

--
Pat Thoyts                            http://www.patthoyts.tk/
PGP fingerprint 2C 6E 98 07 2C 59 C8 97  10 CE 11 E6 04 E0 B9 DD

_____________________________________________
Metakit mailing list  -  Metakit@...
http://www.equi4.com/mailman/listinfo/metakit